]> git.pond.sub.org Git - empserver/commitdiff
Disable damage to base when missile explodes on launch
authorMarkus Armbruster <armbru@pond.sub.org>
Tue, 22 May 2012 18:17:16 +0000 (20:17 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Tue, 22 May 2012 18:56:47 +0000 (20:56 +0200)
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.

src/lib/subs/mslsub.c

index a3557b84040e5087bf05585fbd88456727981225..55d4aaedfcce73bceb60bb058a64df996285111e 100644 (file)
@@ -55,10 +55,8 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y,
 {
     struct shpstr ship;
     struct nukstr nuke;
-    struct sctstr sect;
     int sublaunch = 0;
     char *base, *in_or_at, *from;
-    int dam;
 
     mpr(pp->pln_own, "Preparing to launch %s at %s %s %s%s\n",
        prplane(pp),
@@ -100,7 +98,20 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y,
            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.
+        */
        if (chance(0.33)) {
+           struct sctstr sect;
+           int dam;
+
            dam = pln_damage(pp, 'p', 0) / 2;
            if (pp->pln_ship >= 0) {
                shipdamage(&ship, dam);
@@ -113,6 +124,7 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y,
                putsect(&sect);
            }
        }
+#endif
        return -1;
     }