From ea94ec2f183c82a65be76f385e62bfbfe24a3f3c Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 22 May 2012 20:17:16 +0200 Subject: [PATCH] Disable damage to base when missile explodes on launch 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 | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/lib/subs/mslsub.c b/src/lib/subs/mslsub.c index a3557b840..55d4aaedf 100644 --- a/src/lib/subs/mslsub.c +++ b/src/lib/subs/mslsub.c @@ -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(§); } } +#endif return -1; } -- 2.43.0