From 5e930f5fdfc7e7f05d1cca4aca82a566e35b526f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 22 Mar 2008 14:55:30 +0100 Subject: [PATCH] Factor out a single plane's end of sortie into new pln_put1() Use it in pln_put() and ac_planedamage(). This changes ac_planedamage() to deal with a destroyed airbase. Before, aborted planes happily landed there. This bug could not actually bite, because the code neither yields nor does damage to potential airbases between checking the landing airbase before takeoff and aborting planes in ac_planedamage(). It changes pln_put() to cope with dead planes. Before, it made them land as if they lived, fortunately without ill effects (complaints about not being able to land were suppressed for dead planes). ac_planedamage() removes dead planes, but pinflak_planedamage() doesn't, and these end up in pln_put(). pinflak_planedamage() no longer has to take shot down planes off their carriers, because pln_put() now takes care of that. --- include/prototypes.h | 1 + src/lib/commands/bomb.c | 10 ----- src/lib/subs/aircombat.c | 23 ++---------- src/lib/subs/plnsub.c | 81 ++++++++++++++++++++++------------------ 4 files changed, 49 insertions(+), 66 deletions(-) diff --git a/include/prototypes.h b/include/prototypes.h index 42ac4464e..4950e4a8d 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -558,6 +558,7 @@ extern int pln_arm(struct emp_qelem *, int, char, struct ichrstr *, int, int); extern int pln_mobcost(int, struct plnstr *, int); extern void pln_put(struct emp_qelem *); +extern void pln_put1(struct plist *); extern void pln_removedupes(struct emp_qelem *, struct emp_qelem *); extern void take_plane_off_ship(struct plnstr *, struct shpstr *); extern void take_plane_off_land(struct plnstr *, struct lndstr *); diff --git a/src/lib/commands/bomb.c b/src/lib/commands/bomb.c index b791b7b8d..f475d47df 100644 --- a/src/lib/commands/bomb.c +++ b/src/lib/commands/bomb.c @@ -844,8 +844,6 @@ pinflak_planedamage(struct plnstr *pp, struct plchrstr *pcp, natid from, int disp; char dmess[255]; int eff; - struct shpstr ship; - struct lndstr land; natid plane_owner; int dam; @@ -873,14 +871,6 @@ pinflak_planedamage(struct plnstr *pp, struct plchrstr *pcp, natid from, if (disp == 1) { if (from != 0) nreport(from, N_DOWN_PLANE, pp->pln_own, 1); - if (pp->pln_ship >= 0) { - getship(pp->pln_ship, &ship); - take_plane_off_ship(pp, &ship); - } - if (pp->pln_land >= 0) { - getland(pp->pln_land, &land); - take_plane_off_land(pp, &land); - } } putplane(pp->pln_uid, pp); diff --git a/src/lib/subs/aircombat.c b/src/lib/subs/aircombat.c index 644fe78b8..9c833d9b7 100644 --- a/src/lib/subs/aircombat.c +++ b/src/lib/subs/aircombat.c @@ -708,8 +708,6 @@ ac_planedamage(struct plist *plp, natid from, int dam, natid other, int disp; char dmess[255]; int eff; - struct shpstr ship; - struct lndstr land; natid plane_owner; disp = 0; @@ -752,25 +750,10 @@ ac_planedamage(struct plist *plp, natid from, int dam, natid other, pp->pln_effic = eff; pp->pln_mobil -= MIN(32 + pp->pln_mobil, dam / 2); - if (disp == 1) { - if (from != 0 && (plp->pcp->pl_flags & P_M) == 0) + if (disp) { + if (disp == 1 && from != 0 && (plp->pcp->pl_flags & P_M) == 0) nreport(from, N_DOWN_PLANE, pp->pln_own, 1); - if (pp->pln_ship >= 0) { - getship(pp->pln_ship, &ship); - take_plane_off_ship(pp, &ship); - } - if (pp->pln_land >= 0) { - getland(pp->pln_land, &land); - take_plane_off_land(pp, &land); - } - pp->pln_effic = 0; - putplane(pp->pln_uid, pp); - emp_remque(&plp->queue); - free(plp); - } else if (disp == 2) { - putplane(pp->pln_uid, pp); - emp_remque(&plp->queue); - free(plp); + pln_put1(plp); } else putplane(pp->pln_uid, pp); strcpy(mesg, dmess); diff --git a/src/lib/subs/plnsub.c b/src/lib/subs/plnsub.c index 7ce0783f1..2eddb8178 100644 --- a/src/lib/subs/plnsub.c +++ b/src/lib/subs/plnsub.c @@ -725,50 +725,59 @@ pln_equip(struct plist *plp, struct ichrstr *ip, int flags, char mission) void pln_put(struct emp_qelem *list) { - struct emp_qelem *qp; - struct emp_qelem *newqp; - struct plist *plp; + struct emp_qelem *qp, *next; + + for (qp = list->q_forw; qp != list; qp = next) { + next = qp->q_forw; + pln_put1((struct plist *)qp); + } +} + +void +pln_put1(struct plist *plp) +{ struct plnstr *pp; struct shpstr ship; + struct lndstr land; struct sctstr sect; - /* Here is where planes return home from bombing runs. - We need to make sure they still have somewhere to return - home to! */ - qp = list->q_forw; - while (qp != list) { - plp = (struct plist *)qp; - pp = &plp->plane; - /* Ok, check out where it wants to land */ + pp = &plp->plane; + if (!pp->pln_own) { + /* crashed */ if (pp->pln_ship >= 0) { - /* It is landing on a carrier */ getship(pp->pln_ship, &ship); - /* We should do more, like make sure it's really - a carrier, etc. but for now just make sure it's - not sunk. */ - if (ship.shp_effic < SHIP_MINEFF) { - mpr(pp->pln_own, - "Ship #%d has been sunk, plane #%d has nowhere to land, and\n" - "splashes into the sea.\n", - pp->pln_ship, pp->pln_uid); - pp->pln_effic = 0; - } - } else { - /* Presume we are landing back in a sector. */ - getsect(pp->pln_x, pp->pln_y, §); - if (sect.sct_type == SCT_WATER || sect.sct_type == SCT_WASTE) { - mpr(pp->pln_own, - "Nowhere to land at %s, plane #%d crashes and burns...\n", - xyas(pp->pln_x, pp->pln_y, pp->pln_own), pp->pln_uid); - pp->pln_effic = 0; - } + take_plane_off_ship(pp, &ship); + } + if (pp->pln_land >= 0) { + getland(pp->pln_land, &land); + take_plane_off_land(pp, &land); + } + } else if (pp->pln_ship >= 0) { + /* It is landing on a carrier */ + getship(pp->pln_ship, &ship); + /* We should do more, like make sure it's really + a carrier, etc. but for now just make sure it's + not sunk. */ + if (ship.shp_effic < SHIP_MINEFF) { + mpr(pp->pln_own, + "Ship #%d has been sunk, plane #%d has nowhere to land, and\n" + "splashes into the sea.\n", + pp->pln_ship, pp->pln_uid); + pp->pln_effic = 0; + } + } else { + /* Presume we are landing back in a sector. */ + getsect(pp->pln_x, pp->pln_y, §); + if (sect.sct_type == SCT_WATER || sect.sct_type == SCT_WASTE) { + mpr(pp->pln_own, + "Nowhere to land at %s, plane #%d crashes and burns...\n", + xyas(pp->pln_x, pp->pln_y, pp->pln_own), pp->pln_uid); + pp->pln_effic = 0; } - putplane(pp->pln_uid, pp); - newqp = qp->q_forw; - emp_remque(qp); - free(qp); - qp = newqp; } + putplane(pp->pln_uid, pp); + emp_remque(&plp->queue); + free(plp); } void -- 2.43.0