ef_verify: Reject invalid plane flag combinations

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>
This commit is contained in:
Markus Armbruster 2021-01-04 11:09:38 +01:00
parent 0d53d1a6e9
commit 0d6130246c
2 changed files with 43 additions and 7 deletions

View file

@ -28,7 +28,7 @@
* *
* Known contributors to this file: * Known contributors to this file:
* Ron Koenderink, 2005 * Ron Koenderink, 2005
* Markus Armbruster, 2006-2016 * Markus Armbruster, 2006-2021
*/ */
#include <config.h> #include <config.h>
@ -342,18 +342,54 @@ static int
verify_plane_chr(void) verify_plane_chr(void)
{ {
int retval = 0; int retval = 0;
int i; int i, flags, accepted_flags;
char buf[1024];
for (i = 0; plchr[i].pl_name; i++) { for (i = 0; plchr[i].pl_name; i++) {
if (!plchr[i].pl_name[0]) if (!plchr[i].pl_name[0])
continue; 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, verify_fail(EF_PLANE_CHR, i, NULL, 0,
"flag %s requires flag %s", "flag %s requires flag %s",
symbol_by_value(P_M, plane_chr_flags), symbol_by_value(P_M, plane_chr_flags),
symbol_by_value(P_V, plane_chr_flags)); symbol_by_value(P_V, plane_chr_flags));
retval = -1; 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,
"invalid flag combination, can't have %s", buf);
retval = -1;
}
} }
return retval; return retval;
} }

View file

@ -365,7 +365,7 @@ msl_abm_intercept(struct plnstr *msl, coord x, coord y, int sublaunch)
struct emp_qelem irvlist; struct emp_qelem irvlist;
getsect(x, y, &sect); 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, return msl_intercept(msl, &sect, sublaunch,
&irvlist, "warhead", "abm", &irvlist, "warhead", "abm",
sublaunch ? N_NUKE_SSTOP : N_NUKE_STOP); sublaunch ? N_NUKE_SSTOP : N_NUKE_STOP);