]> git.pond.sub.org Git - empserver/commitdiff
ef_verify: Reject invalid plane flag combinations
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 4 Jan 2021 10:09:38 +0000 (11:09 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 17 Jan 2021 20:24:29 +0000 (21:24 +0100)
Any plane may have capabilities VTOL, helo, light.

Capability missile requires VTOL.

Anti-ballistic missiles have capabilities missile, SDI.

Anti-satellite missiles have capabilities missile, satellite.

Surface-to-air missiles have capabilities missile, intercept.

Anti-ship missiles have capabilities missile, marine, and may have
tactical.

Surface-to-surface missiles have capability missile, and may have
tactical.

Satellites have capability satellite, and may have spy, image.

Ordinary planes may have capabilities bomber, tactical, intercept,
cargo, spy, image, ASW, para, escort, mine, sweep.  Capability para
requires cargo; see para().

Only "missile requires VTOL" is enforced.  Enforce the rest.

Excluding P_O when asking for P_N is now redundant.  Drop that from
msl_abm_intercept().

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
src/lib/common/ef_verify.c
src/lib/subs/mslsub.c

index b2d3282e0627031881c1cb4514ddd2daa4464175..71d437c25ba80d498689a347f70b2347f246660d 100644 (file)
@@ -28,7 +28,7 @@
  *
  *  Known contributors to this file:
  *     Ron Koenderink, 2005
- *     Markus Armbruster, 2006-2016
+ *     Markus Armbruster, 2006-2021
  */
 
 #include <config.h>
@@ -342,16 +342,52 @@ static int
 verify_plane_chr(void)
 {
     int retval = 0;
-    int i;
+    int i, flags, accepted_flags;
+    char buf[1024];
 
     for (i = 0; plchr[i].pl_name; i++) {
        if (!plchr[i].pl_name[0])
            continue;
-       if ((plchr[i].pl_flags & (P_M | P_V)) == P_M) {
+       flags = plchr[i].pl_flags;
+       accepted_flags = P_V | P_K | P_L;
+       if (flags & P_M) {
+           /* missile */
+           accepted_flags |= P_M | P_E;
+           if (flags & P_N)
+               accepted_flags |=  P_N;
+           else if (flags & P_O)
+               accepted_flags |=  P_O;
+           else if (flags & P_F)
+               accepted_flags |=  P_F;
+           else
+               accepted_flags |=  P_T | P_MAR;
+           if (!(flags & P_V)) {
+               verify_fail(EF_PLANE_CHR, i, NULL, 0,
+                           "flag %s requires flag %s",
+                           symbol_by_value(P_M, plane_chr_flags),
+                           symbol_by_value(P_V, plane_chr_flags));
+               retval = -1;
+           }
+       } else if (flags & P_O) {
+           /* satellite */
+           accepted_flags |= P_O | P_S | P_I;
+       } else {
+           /* plane */
+           accepted_flags |= P_B | P_T | P_F | P_C | P_S | P_I | P_A | P_P
+               | P_ESC | P_MINE | P_SWEEP;
+           if ((flags & (P_P | P_C)) == P_P) {
+               verify_fail(EF_PLANE_CHR, i, NULL, 0,
+                           "flag %s requires flag %s",
+                           symbol_by_value(P_P, plane_chr_flags),
+                           symbol_by_value(P_C, plane_chr_flags));
+               retval = -1;
+           }
+       }
+       if (flags & ~accepted_flags) {
+           symbol_set_fmt(buf, sizeof(buf), flags & ~accepted_flags,
+                          plane_chr_flags, ", ", 1);
            verify_fail(EF_PLANE_CHR, i, NULL, 0,
-                       "flag %s requires flag %s",
-                       symbol_by_value(P_M, plane_chr_flags),
-                       symbol_by_value(P_V, plane_chr_flags));
+                       "invalid flag combination, can't have %s", buf);
            retval = -1;
        }
     }
index 8b35e6d2a35e4003b5363159ef05d125cdfcded5..a25f28f68e44e83e5a4af4e94b50c17a83f99f21 100644 (file)
@@ -365,7 +365,7 @@ msl_abm_intercept(struct plnstr *msl, coord x, coord y, int sublaunch)
     struct emp_qelem irvlist;
 
     getsect(x, y, &sect);
-    msl_sel(&irvlist, x, y, msl->pln_own, P_N, P_O, 0);
+    msl_sel(&irvlist, x, y, msl->pln_own, P_N, 0, 0);
     return msl_intercept(msl, &sect, sublaunch,
                         &irvlist, "warhead", "abm",
                         sublaunch ? N_NUKE_SSTOP : N_NUKE_STOP);