diff --git a/include/prototypes.h b/include/prototypes.h index 42ac4464..4950e4a8 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 b791b7b8..f475d47d 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 644fe78b..9c833d9b 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 7ce0783f..2eddb817 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