From: Markus Armbruster Date: Mon, 12 Oct 2009 02:18:26 +0000 (-0400) Subject: Don't intercept tactical and marine missiles targeting planes X-Git-Tag: v4.3.23~9 X-Git-Url: http://git.pond.sub.org/?p=empserver;a=commitdiff_plain;h=22071b4edb0448bd5b3da73ca7c736315e785b68 Don't intercept tactical and marine missiles targeting planes Missiles attacking ground targets (sectors, ships or land units) can be intercepted, missiles targeting planes can't. Except msl_launch() checked the missile's capabilities instead of its target, and thus intercepted missiles that *could* target ground even when they targeted planes. This broke the missile interception code's assumption that interceptors aren't intercepted, and crashed the server through infinite recursion: tactical abm #1 intercepts, tactical abm #2 intercepts #1, #1 intercepts #2, ... Same bug in msl_hit() printed "incoming missile" for missiles that could target ground but do target planes. Broken in Empire 2. Bug can't bite with the stock game's planes. --- diff --git a/src/lib/subs/mslsub.c b/src/lib/subs/mslsub.c index 30ed82cb2..9bfbf9fc7 100644 --- a/src/lib/subs/mslsub.c +++ b/src/lib/subs/mslsub.c @@ -61,7 +61,6 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y, struct shpstr ship; struct sctstr sect; int sublaunch = 0; - struct plchrstr *pcp = plchr + pp->pln_type; char *from; int dam; @@ -115,16 +114,16 @@ msl_launch(struct plnstr *pp, int type, char *what, coord x, coord y, putplane(pp->pln_uid, pp); mpr(pp->pln_own, "\tSHWOOOOOSH! Missile launched!\n"); - if (pcp->pl_flags & P_T) + if (type != EF_PLANE) mpr(victim, "Incoming %s missile sighted at %s...\n", sublaunch ? "sub-launched" : cname(pp->pln_own), xyas(x, y, victim)); - if ((pcp->pl_flags & P_T && !(pcp->pl_flags & P_MAR))) { + if (type == EF_SECTOR || type == EF_LAND) { if (msl_abm_intercept(pp, x, y, sublaunch)) return -1; } - if (pcp->pl_flags & P_MAR) { + if (type == EF_SHIP) { if (shp_missile_defense(x, y, pp->pln_own, pln_def(pp))) { return -1; } @@ -139,7 +138,6 @@ int msl_hit(struct plnstr *pp, int hardtarget, int type, int news_item, int snews_item, int sublaunch, natid victim) { - struct plchrstr *pcp = plchr + pp->pln_type; int hitchance, hit; if (nuk_on_plane(pp) >= 0) { @@ -152,7 +150,7 @@ msl_hit(struct plnstr *pp, int hardtarget, int type, hit ? "HIT!" : "miss"); } - if (pcp->pl_flags & P_T) + if (type != EF_PLANE) mpr(victim, "...Incoming %s missile %s\n", sublaunch ? "" : cname(pp->pln_own), hit ? "HIT!\n" : "missed\n");