When a missile explodes on launch, it has a 33% chance to damage its
base.
Unfortunately, damaging the base breaks callers that call msl_launch()
for each member of a list of missiles created by msl_sel() or
perform_mission(). Damage to the base can damage other missiles
there. Any copies of them in the list become stale. When
msl_launch() modifies and writes back such a stale copy, the damage
gets wiped out, triggering a seqno oops.
Affects missile interdiction and interception using missiles with
non-zero load. Stock game's ABMs have zero load, so interception is
safe there. Relatively harmless in practice. Broken in Empire 2.
Instead of fixing the bug, simply disable damage to the base for now.
{
struct shpstr ship;
struct nukstr nuke;
{
struct shpstr ship;
struct nukstr nuke;
int sublaunch = 0;
char *base, *in_or_at, *from;
int sublaunch = 0;
char *base, *in_or_at, *from;
mpr(pp->pln_own, "Preparing to launch %s at %s %s %s%s\n",
prplane(pp),
mpr(pp->pln_own, "Preparing to launch %s at %s %s %s%s\n",
prplane(pp),
nuke.nuk_effic = 0;
putnuke(nuke.nuk_uid, &nuke);
}
nuke.nuk_effic = 0;
putnuke(nuke.nuk_uid, &nuke);
}
+#if 0
+ /*
+ * Disabled for now, because it breaks callers that call
+ * msl_launch() for each member of a list of planes, created
+ * by msl_sel() or perform_mission(). Damage to the base can
+ * damage other planes. Any copies of them in the list become
+ * stale. When msl_launch() modifies and writes back such a
+ * stale copy, the damage gets wiped out, triggering a seqno
+ * oops.
+ */
+ struct sctstr sect;
+ int dam;
+
dam = pln_damage(pp, 'p', 0) / 2;
if (pp->pln_ship >= 0) {
shipdamage(&ship, dam);
dam = pln_damage(pp, 'p', 0) / 2;
if (pp->pln_ship >= 0) {
shipdamage(&ship, dam);