From 8b1470e3a8ac2e1e6715f37479b270c25a0f2f09 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 6 Sep 2008 22:15:41 -0400 Subject: [PATCH] Get rid of struct plnstr member pln_nuktype pln_nuktype is redundant; it can be computed from the nuke's nuk_plane. Make plane selector nuketype virtual and NSC_EXTRA. It should have been NSC_EXTRA all along. This changes xdump plane. Don't set it in arm(), disarm(), build_plane(), pln_damage() and nuk_fixup(). The latter no longer does anything, remove it. Deprecate edit key 'n' in doplane(), and don't show it in pr_plane(). The key never made much sense. eff_bomb(), comm_bomb(), ship_bomb(), plane_bomb(), land_bomb(), strat_bomb(), mission_pln_equip(), air_damage(), msl_hit(), pln_equip() tested pln_nuketype to check whether a plane carries a nuke. Test nuk_on_plane() instead. pdump(), plan(), trade_desc() print whether and what kind of nuke a plane carries. Adapt that to use nuk_on_plane(). --- include/plane.h | 1 - src/lib/commands/arm.c | 2 -- src/lib/commands/bomb.c | 13 +++++++------ src/lib/commands/buil.c | 1 - src/lib/commands/edit.c | 3 +-- src/lib/commands/pdump.c | 5 +++-- src/lib/commands/plan.c | 5 +++-- src/lib/common/nsc.c | 11 ++++++++++- src/lib/subs/mission.c | 4 ++-- src/lib/subs/mslsub.c | 8 ++++---- src/lib/subs/plnsub.c | 3 +-- src/lib/subs/trdsub.c | 22 +++++++++------------- src/util/empdump.c | 18 ------------------ 13 files changed, 40 insertions(+), 56 deletions(-) diff --git a/include/plane.h b/include/plane.h index 6fb735f0f..d15289044 100644 --- a/include/plane.h +++ b/include/plane.h @@ -68,7 +68,6 @@ struct plnstr { short pln_ship; /* pointer to carrier */ short pln_land; /* pointer to carrier */ signed char pln_harden; /* for missiles */ - signed char pln_nuketype; /* type of nuclear armament (if any) */ signed char pln_flags; /* State of the plane */ short pln_access; /* Last tick mob was updated (MOB_ACCESS) */ float pln_theta; /* position in orbital sine wave */ diff --git a/src/lib/commands/arm.c b/src/lib/commands/arm.c index 8a443caa7..bb4a6a086 100644 --- a/src/lib/commands/arm.c +++ b/src/lib/commands/arm.c @@ -111,7 +111,6 @@ arm(void) snprintf(buf, sizeof(buf), "armed on your %s in %s", prplane(&pl), xyas(pl.pln_x, pl.pln_y, pl.pln_own)); gift(pl.pln_own, player->cnum, &nuke, buf); - pl.pln_nuketype = nuke.nuk_type; nuke.nuk_plane = pl.pln_uid; putplane(pl.pln_uid, &pl); putnuke(nuke.nuk_uid, &nuke); @@ -159,7 +158,6 @@ disarm(void) xyas(sect.sct_x, sect.sct_y, sect.sct_own)); gift(sect.sct_own, player->cnum, &nuke, buf); nuke.nuk_plane = -1; - pl.pln_nuketype = -1; pl.pln_flags &= ~PLN_AIRBURST; putplane(pl.pln_uid, &pl); putnuke(nuke.nuk_uid, &nuke); diff --git a/src/lib/commands/bomb.c b/src/lib/commands/bomb.c index 9140936a5..583079f3e 100644 --- a/src/lib/commands/bomb.c +++ b/src/lib/commands/bomb.c @@ -42,6 +42,7 @@ #include "item.h" #include "land.h" #include "news.h" +#include "nuke.h" #include "optlist.h" #include "path.h" #include "plane.h" @@ -342,7 +343,7 @@ eff_bomb(struct emp_qelem *list, struct sctstr *target) plp = (struct plist *)qp; if ((plp->pcp->pl_flags & P_C) && (!(plp->pcp->pl_flags & P_T))) continue; - if (plp->bombs || plp->plane.pln_nuketype != -1) + if (plp->bombs || nuk_on_plane(&plp->plane) >= 0) dam += pln_damage(&plp->plane, target->sct_x, target->sct_y, 'p', &nukedam, 1); } @@ -419,7 +420,7 @@ comm_bomb(struct emp_qelem *list, struct sctstr *target) plp = (struct plist *)qp; if ((plp->pcp->pl_flags & P_C) && (!(plp->pcp->pl_flags & P_T))) continue; - if (plp->bombs || plp->plane.pln_nuketype != -1) + if (plp->bombs || nuk_on_plane(&plp->plane) >= 0) dam += pln_damage(&plp->plane, target->sct_x, target->sct_y, 'p', &nukedam, 1); } @@ -532,7 +533,7 @@ ship_bomb(struct emp_qelem *list, struct sctstr *target) } dam = 0; - if (plp->plane.pln_nuketype != -1) + if (nuk_on_plane(&plp->plane) >= 0) hitchance = 100; else { hitchance = pln_hitchance(&plp->plane, @@ -636,7 +637,7 @@ plane_bomb(struct emp_qelem *list, struct sctstr *target) if (planeno < 0) continue; dam = 0; - if (plp->plane.pln_nuketype != -1) + if (nuk_on_plane(&plp->plane) >= 0) hitchance = 100; else { hitchance = pln_hitchance(&plp->plane, 0, EF_PLANE); @@ -747,7 +748,7 @@ land_bomb(struct emp_qelem *list, struct sctstr *target) } dam = 0; - if (plp->plane.pln_nuketype != -1) + if (nuk_on_plane(&plp->plane) >= 0) hitchance = 100; else { hitchance = pln_hitchance(&plp->plane, @@ -796,7 +797,7 @@ strat_bomb(struct emp_qelem *list, struct sctstr *target) plp = (struct plist *)qp; if ((plp->pcp->pl_flags & P_C) && (!(plp->pcp->pl_flags & P_T))) continue; - if (plp->bombs || plp->plane.pln_nuketype != -1) + if (plp->bombs || nuk_on_plane(&plp->plane) >= 0) dam += pln_damage(&plp->plane, target->sct_x, target->sct_y, 's', &nukedam, 1); } diff --git a/src/lib/commands/buil.c b/src/lib/commands/buil.c index 6a80a3ab1..cce2f0196 100644 --- a/src/lib/commands/buil.c +++ b/src/lib/commands/buil.c @@ -778,7 +778,6 @@ build_plane(struct sctstr *sp, struct plchrstr *pp, short *vec, int tlev) plane.pln_wing = 0; plane.pln_ship = -1; plane.pln_land = -1; - plane.pln_nuketype = -1; plane.pln_harden = 0; plane.pln_flags = 0; pln_set_tech(&plane, tlev); diff --git a/src/lib/commands/edit.c b/src/lib/commands/edit.c index 55695414b..7e4c8ecf0 100644 --- a/src/lib/commands/edit.c +++ b/src/lib/commands/edit.c @@ -332,7 +332,6 @@ pr_plane(struct plnstr *plane) pr("Flags : %d\n", plane->pln_flags); pr("Ship : %d\t\t", plane->pln_ship); pr("Land Unit : %d\t", plane->pln_land); - pr("Nuke Type : %d\n", plane->pln_nuketype); } static void @@ -981,7 +980,7 @@ doplane(char op, int arg, char *p, struct plnstr *plane) switch (op) { case 'n': - plane->pln_nuketype = arg; + warn_deprecated(op); break; case 'U': ef_set_uid(EF_PLANE, plane, arg); diff --git a/src/lib/commands/pdump.c b/src/lib/commands/pdump.c index 5465e4885..c97ea98b1 100644 --- a/src/lib/commands/pdump.c +++ b/src/lib/commands/pdump.c @@ -45,6 +45,7 @@ pdump(void) int nplanes; struct nstr_item np; struct plnstr plane; + struct nukstr nuke; int field[128]; struct natstr *natp; int n, i; @@ -266,8 +267,8 @@ pdump(void) ? " Y" : " N"); break; case 20: - if (plane.pln_nuketype != -1) { - pr(" %.5s", nchr[(int)plane.pln_nuketype].n_name); + if (getnuke(nuk_on_plane(&plane), &nuke)) { + pr(" %.5s", nchr[nuke.nuk_type].n_name); break; } else pr(" N/A"); diff --git a/src/lib/commands/plan.c b/src/lib/commands/plan.c index b841573cb..fdc079006 100644 --- a/src/lib/commands/plan.c +++ b/src/lib/commands/plan.c @@ -46,6 +46,7 @@ plan(void) int nplanes, noff; struct nstr_item np; struct plnstr plane; + struct nukstr nuke; if (!snxtitem(&np, EF_PLANE, player->argp[1], NULL)) return RET_SYN; @@ -76,9 +77,9 @@ plan(void) pr(" "); if (pln_is_in_orbit(&plane)) pr((plane.pln_flags & PLN_SYNCHRONOUS) ? " geosync" : " orbit"); - else if (plane.pln_nuketype >= 0) + else if (getnuke(nuk_on_plane(&plane), &nuke)) pr(" %-5.5s %c", - nchr[(int)plane.pln_nuketype].n_name, + nchr[nuke.nuk_type].n_name, plane.pln_flags & PLN_AIRBURST ? 'A' : 'G'); pr("\n"); } diff --git a/src/lib/common/nsc.c b/src/lib/common/nsc.c index f01207e0c..733e2c5d8 100644 --- a/src/lib/common/nsc.c +++ b/src/lib/common/nsc.c @@ -50,6 +50,7 @@ static void *nsc_ver_maxnoc(struct valstr *, struct natstr *, void *); static void *nsc_sct_terr(struct valstr *, struct natstr *, void *); static void *nsc_pln_att(struct valstr *, struct natstr *, void *); static void *nsc_pln_def(struct valstr *, struct natstr *, void *); +static void *nsc_pln_nuketype(struct valstr *, struct natstr *, void *); static void *nsc_lnd_att(struct valstr *, struct natstr *, void *); static void *nsc_lnd_def(struct valstr *, struct natstr *, void *); static void *nsc_lnd_vul(struct valstr *, struct natstr *, void *); @@ -294,13 +295,13 @@ struct castr plane_ca[] = { {"ship", fldoff(pln_ship), NSC_SHORT, 0, NULL, EF_BAD, 0}, {"land", fldoff(pln_land), NSC_SHORT, 0, NULL, EF_BAD, 0}, {"harden", fldoff(pln_harden), NSC_CHAR, 0, NULL, EF_BAD, 0}, - {"nuketype", fldoff(pln_nuketype), NSC_CHAR, 0, NULL, EF_BAD, 0}, {"flags", fldoff(pln_flags), NSC_CHAR, 0, NULL, EF_PLANE_FLAGS, NSC_BITS}, {"access", fldoff(pln_access), NSC_SHORT, 0, NULL, EF_BAD, 0}, {"theta", fldoff(pln_theta), NSC_FLOAT, 0, NULL, EF_BAD, 0}, {"att", 0, NSC_LONG, 0, nsc_pln_att, EF_BAD, NSC_EXTRA}, {"def", 0, NSC_LONG, 0, nsc_pln_def, EF_BAD, NSC_EXTRA}, + {"nuketype", 0, NSC_LONG, 0, nsc_pln_nuketype, EF_BAD, NSC_EXTRA}, {NULL, 0, NSC_NOTYPE, 0, NULL, EF_BAD, 0} #undef CURSTR }; @@ -782,6 +783,14 @@ nsc_pln_att(struct valstr *val, struct natstr *np, void *ptr) return NULL; } +static void * +nsc_pln_nuketype(struct valstr *val, struct natstr *np, void *ptr) +{ + struct nukstr *nukp = getnukep(nuk_on_plane(ptr)); + val->val_as.lng = nukp ? nukp->nuk_type : -1; + return NULL; +} + static void * nsc_lnd_att(struct valstr *val, struct natstr *np, void *ptr) { diff --git a/src/lib/subs/mission.c b/src/lib/subs/mission.c index 6bacf228d..9a252ad31 100644 --- a/src/lib/subs/mission.c +++ b/src/lib/subs/mission.c @@ -1008,7 +1008,7 @@ mission_pln_equip(struct plist *plp, struct ichrstr *ip, int flags, switch (mission) { case 's': /* strategic bomb */ case 'p': /* pinpoint bomb */ - if (pp->pln_nuketype == -1) { + if (nuk_on_plane(pp) < 0) { itype = I_SHELL; needed = load; } @@ -1168,7 +1168,7 @@ air_damage(struct emp_qelem *bombers, coord x, coord y, int mission, prplane(pp), cname(victim), s, xyas(x, y, pp->pln_own)); } hitchance = pln_hitchance(pp, hardtarget, EF_SHIP); - if (plp->plane.pln_nuketype != -1) + if (nuk_on_plane(&plp->plane) >= 0) hitchance = 100; else if (hardtarget != SECT_HARDTARGET) wu(0, pp->pln_own, "\t\t%d%% hitchance...", hitchance); diff --git a/src/lib/subs/mslsub.c b/src/lib/subs/mslsub.c index 8ab1694b9..89dbc22e7 100644 --- a/src/lib/subs/mslsub.c +++ b/src/lib/subs/mslsub.c @@ -42,6 +42,7 @@ #include "nat.h" #include "news.h" #include "nsc.h" +#include "nuke.h" #include "optlist.h" #include "path.h" #include "plane.h" @@ -129,8 +130,10 @@ msl_hit(struct plnstr *pp, int hardtarget, int type, int news_item, putplane(pp->pln_uid, pp); mpr(pp->pln_own, "\tSHWOOOOOSH! Missile launched!\n"); - if (pp->pln_nuketype != -1) + if (nuk_on_plane(pp) >= 0) { mpr(pp->pln_own, "\tArming nuclear warheads...\n"); + hitchance = 100; + } if (pcp->pl_flags & P_T) mpr(victim, "Incoming %s missile sighted at %s...\n", @@ -150,9 +153,6 @@ msl_hit(struct plnstr *pp, int hardtarget, int type, int news_item, } } - if (pp->pln_nuketype != -1) - hitchance = 100; - mpr(pp->pln_own, "\t%d%% hitchance...", hitchance); hit = (roll(100) <= hitchance); diff --git a/src/lib/subs/plnsub.c b/src/lib/subs/plnsub.c index d4a956483..e5adeaa29 100644 --- a/src/lib/subs/plnsub.c +++ b/src/lib/subs/plnsub.c @@ -666,7 +666,7 @@ pln_equip(struct plist *plp, struct ichrstr *ip, int flags, char mission) switch (mission) { case 's': /* strategic bomb */ case 'p': /* pinpoint bomb */ - if (pp->pln_nuketype == -1) { + if (nuk_on_plane(pp) < 0) { itype = I_SHELL; needed = load; } @@ -1138,7 +1138,6 @@ pln_damage(struct plnstr *pp, coord x, coord y, char type, int *nukedamp, if (getnuke(nuk_on_plane(pp), &nuke)) { mpr(pp->pln_own, "Releasing RV's for %s detonation...\n", pp->pln_flags & PLN_AIRBURST ? "airburst" : "groundburst"); - pp->pln_nuketype = -1; *nukedamp = detonate(&nuke, x, y, pp->pln_flags & PLN_AIRBURST); return 0; diff --git a/src/lib/subs/trdsub.c b/src/lib/subs/trdsub.c index 12f9bda1d..f7121404b 100644 --- a/src/lib/subs/trdsub.c +++ b/src/lib/subs/trdsub.c @@ -108,6 +108,7 @@ trade_desc(struct trdstr *tp, union empobj_storage *tgp) struct nstr_item ni; struct plnstr plane; struct lndstr land; + struct nukstr nuke; switch (tp->trd_type) { case EF_NUKE: @@ -136,9 +137,8 @@ trade_desc(struct trdstr *tp, union empobj_storage *tgp) plane.pln_tech, plane.pln_effic, plchr[(int)plane.pln_type].pl_name, plane.pln_uid); - if (plane.pln_nuketype != -1) { - pr("(%s)", nchr[(int)plane.pln_nuketype].n_name); - } + if (getnuke(nuk_on_plane(&plane), &nuke)) + pr("(%s)", nchr[nuke.nuk_type].n_name); } } snxtitem_all(&ni, EF_LAND); @@ -157,10 +157,8 @@ trade_desc(struct trdstr *tp, union empobj_storage *tgp) plane.pln_effic, plchr[(int)plane.pln_type].pl_name, plane.pln_uid); - if (plane.pln_nuketype != -1) { - pr("(%s)", - nchr[(int)plane.pln_nuketype].n_name); - } + if (getnuke(nuk_on_plane(&plane), &nuke)) + pr("(%s)", nchr[nuke.nuk_type].n_name); } } } @@ -193,9 +191,8 @@ trade_desc(struct trdstr *tp, union empobj_storage *tgp) plane.pln_tech, plane.pln_effic, plchr[(int)plane.pln_type].pl_name, plane.pln_uid); - if (plane.pln_nuketype != -1) { - pr("(%s)", nchr[(int)plane.pln_nuketype].n_name); - } + if (getnuke(nuk_on_plane(&plane), &nuke)) + pr("(%s)", nchr[nuke.nuk_type].n_name); } } } @@ -209,9 +206,8 @@ trade_desc(struct trdstr *tp, union empobj_storage *tgp) pp->pln_tech, pp->pln_effic, plchr[(int)pp->pln_type].pl_name, tp->trd_unitid); - if (pp->pln_nuketype != -1) { - pr("(%s)", nchr[(int)pp->pln_nuketype].n_name); - } + if (getnuke(nuk_on_plane(pp), &nuke)) + pr("(%s)", nchr[nuke.nuk_type].n_name); break; default: pr("flaky unit type %d", tp->trd_type); diff --git a/src/util/empdump.c b/src/util/empdump.c index ae0a589fa..9d6b32676 100644 --- a/src/util/empdump.c +++ b/src/util/empdump.c @@ -50,7 +50,6 @@ static void exit_bad_arg(char *, ...) static void dump_table(int, int); static void pln_fixup(void); static void lnd_fixup(void); -static void nuk_fixup(void); int main(int argc, char *argv[]) @@ -151,7 +150,6 @@ main(int argc, char *argv[]) exit(1); pln_fixup(); lnd_fixup(); - nuk_fixup(); } if (ef_verify() < 0) @@ -282,22 +280,6 @@ lnd_fixup(void) } } -static void -nuk_fixup(void) -{ - int i; - struct nukstr *np; - struct plnstr *cpp; - - for (i = 0; (np = ef_ptr(EF_NUKE, i)); i++) { - if (!np->nuk_own) - continue; - cpp = ef_ptr(EF_PLANE, np->nuk_plane); - if (cpp) - cpp->pln_nuketype = np->nuk_type; - } -} - /* Temporarily copied from src/lib/subs/???sub.c */ /* -- 2.43.0