From 0b46e31d60f5b60f4dfca7df60574264f6713a3b Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 4 Jan 2021 11:09:38 +0100 Subject: [PATCH 1/1] 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 --- src/lib/common/ef_verify.c | 48 +++++++++++++++++++++++++++++++++----- src/lib/subs/mslsub.c | 2 +- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/lib/common/ef_verify.c b/src/lib/common/ef_verify.c index b2d3282e0..71d437c25 100644 --- a/src/lib/common/ef_verify.c +++ b/src/lib/common/ef_verify.c @@ -28,7 +28,7 @@ * * Known contributors to this file: * Ron Koenderink, 2005 - * Markus Armbruster, 2006-2016 + * Markus Armbruster, 2006-2021 */ #include @@ -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; } } diff --git a/src/lib/subs/mslsub.c b/src/lib/subs/mslsub.c index 8b35e6d2a..a25f28f68 100644 --- a/src/lib/subs/mslsub.c +++ b/src/lib/subs/mslsub.c @@ -365,7 +365,7 @@ msl_abm_intercept(struct plnstr *msl, coord x, coord y, int sublaunch) struct emp_qelem irvlist; getsect(x, y, §); - 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, §, sublaunch, &irvlist, "warhead", "abm", sublaunch ? N_NUKE_SSTOP : N_NUKE_STOP); -- 2.43.0