Don't intercept tactical and marine missiles targeting planes
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 12 Oct 2009 02:18:26 +0000 (22:18 -0400)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 13 Dec 2009 07:13:29 +0000 (08:13 +0100)
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.

src/lib/subs/mslsub.c

index 30ed82cb206bd4e64bb9bd10a291ae0f45c931ea..9bfbf9fc78cf6824550ecf1ed9f6e6dff84ce736 100644 (file)
@@ -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");