From e8595066d1ebf0f4c44e8307f92c6a27f43c3363 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 14 Mar 2008 20:01:05 +0100 Subject: [PATCH] Factor out common fortress fire code into fort_fire() This takes care of a number of bugs / inconsistencies: * sb() fired support even when there were not enough mil. * Shell resupply bugs: multifire() and quiet_bigdef() resupplied shells before checking all other requirements and could thus get more shells than actually needed. Rename landgun() to fortgun() for consistency. --- include/prototypes.h | 2 +- include/sect.h | 2 ++ src/lib/commands/mfir.c | 39 +++++++++++---------------------------- src/lib/commands/sabo.c | 2 +- src/lib/subs/fortdef.c | 18 ++++-------------- src/lib/subs/landgun.c | 26 +++++++++++++++++++++++++- src/lib/subs/lndsub.c | 20 +++----------------- src/lib/subs/shpsub.c | 22 +++------------------- 8 files changed, 50 insertions(+), 81 deletions(-) diff --git a/include/prototypes.h b/include/prototypes.h index 13f38645..c1b5948f 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -459,7 +459,7 @@ extern int lnd_postread(int, void *); extern int lnd_prewrite(int, void *); /* landgun.c */ extern double seagun(int, int); -extern double landgun(int, int); +extern double fortgun(int, int); extern double landunitgun(int, int, int, int, int); extern double effrange(int, double); extern double torprange(struct shpstr *); diff --git a/include/sect.h b/include/sect.h index 8d9f9d4e..0ba02ee8 100644 --- a/include/sect.h +++ b/include/sect.h @@ -214,4 +214,6 @@ struct sctintrins { extern struct sctintrins intrchr[INT_DEF + 2]; +extern int fort_fire(struct sctstr *); + #endif diff --git a/src/lib/commands/mfir.c b/src/lib/commands/mfir.c index f42ce38f..b4ff03b7 100644 --- a/src/lib/commands/mfir.c +++ b/src/lib/commands/mfir.c @@ -419,25 +419,20 @@ multifire(void) } } attacker = targ_land; - if ((gun = fsect.sct_item[I_GUN]) == 0) { + if (fsect.sct_item[I_GUN] == 0) { pr("Insufficient arms.\n"); continue; } - shell = fsect.sct_item[I_SHELL]; - if (shell <= 0) - shell += supply_commod(fsect.sct_own, - fsect.sct_x, fsect.sct_y, - I_SHELL, 1); - if (shell <= 0) { - pr("Klick! ...\n"); - continue; - } if (fsect.sct_item[I_MILIT] < 5) { pr("Not enough military for firing crew.\n"); continue; } - if (gun > 7) - gun = 7; + dam = fort_fire(&fsect); + putsect(&fsect); + if (dam < 0) { + pr("Klick! ...\n"); + continue; + } range = fortrange(&fsect); range2 = roundrange(range); pr("range is %d.00 (%.2f)\n", range2, range); @@ -445,11 +440,6 @@ multifire(void) /* Don't tell it's a sub */ range2 = -1; } - guneff = landgun((int)fsect.sct_effic, gun); - dam = (int)guneff; - shell--; - fsect.sct_item[I_SHELL] = shell; - putsect(&fsect); } trange = mapdist(x, y, fx, fy); if (trange > range2) { @@ -904,14 +894,9 @@ quiet_bigdef(int attacker, struct emp_qelem *list, natid own, natid aown, if (roundrange(erange) < ns.curdist) continue; - gun = firing.sct_item[I_GUN]; - shell = firing.sct_item[I_SHELL]; - - if (shell < 1) - shell += supply_commod(firing.sct_own, - firing.sct_x, firing.sct_y, - I_SHELL, 1); - if (gun == 0 || firing.sct_item[I_MILIT] < 5 || shell == 0) + dam2 = fort_fire(&firing); + /* no putsect(&firing) because ammo is charged in use_ammo() */ + if (dam2 < 0) continue; (*nfiring)++; fp = malloc(sizeof(struct flist)); @@ -921,9 +906,7 @@ quiet_bigdef(int attacker, struct emp_qelem *list, natid own, natid aown, fp->type = targ_land; add_to_fired_queue(&fp->queue, list); nreport(firing.sct_own, N_FIRE_BACK, player->cnum, 1); - if (gun > 7) - gun = 7; - dam += landgun((int)firing.sct_effic, gun); + dam += dam2; } } diff --git a/src/lib/commands/sabo.c b/src/lib/commands/sabo.c index eb1a15c6..c12c6ad9 100644 --- a/src/lib/commands/sabo.c +++ b/src/lib/commands/sabo.c @@ -83,7 +83,7 @@ sabo(void) continue; } - dam = landgun(3 * land.lnd_effic, 7); + dam = fortgun(3 * land.lnd_effic, 7); if (sect.sct_item[I_SHELL] > 20) dam += seagun(land.lnd_effic, random() % (sect.sct_item[I_SHELL] / 10)); diff --git a/src/lib/subs/fortdef.c b/src/lib/subs/fortdef.c index 5dd8656b..e11d7afc 100644 --- a/src/lib/subs/fortdef.c +++ b/src/lib/subs/fortdef.c @@ -181,9 +181,7 @@ sb(natid att, natid def, struct sctstr *sp, coord tx, coord ty, int noisy, { int damage; natid own; - int shell; - int range; - int range2, gun; + int range, range2; own = sp->sct_own; if (own == 0) @@ -194,18 +192,10 @@ sb(natid att, natid def, struct sctstr *sp, coord tx, coord ty, int noisy, range2 = mapdist(sp->sct_x, sp->sct_y, tx, ty); if (range < range2) return 0; - gun = sp->sct_item[I_GUN]; - if (gun == 0) - return 0; - shell = sp->sct_item[I_SHELL]; - if (shell <= 0) - shell += supply_commod(sp->sct_own, sp->sct_x, sp->sct_y, - I_SHELL, 1); - if (shell <= 0) - return 0; - sp->sct_item[I_SHELL] = shell - 1; + damage = fort_fire(sp); putsect(sp); - damage = landgun((int)sp->sct_effic, gun); + if (damage < 0) + return 0; if (sp->sct_own != def) wu(0, sp->sct_own, "%s fired on %s in %s in defense of %s, doing %d damage!\n", diff --git a/src/lib/subs/landgun.c b/src/lib/subs/landgun.c index 6bc37cc4..87e60cb4 100644 --- a/src/lib/subs/landgun.c +++ b/src/lib/subs/landgun.c @@ -41,7 +41,7 @@ #include "ship.h" double -landgun(int effic, int guns) +fortgun(int effic, int guns) { double d; double g = MIN(guns, 7); @@ -77,6 +77,30 @@ landunitgun(int effic, int shots, int guns, int ammo, int shells) return d; } +/* + * Fire from fortress SP. + * Use ammo, resupply if necessary. + * Return damage if the fortress fires, else -1. + */ +int +fort_fire(struct sctstr *sp) +{ + int guns = sp->sct_item[I_GUN]; + int shells; + + if (sp->sct_type != SCT_FORTR || sp->sct_effic < FORTEFF) + return -1; + if (sp->sct_item[I_MILIT] < 5 || guns == 0) + return -1; + shells = sp->sct_item[I_SHELL]; + shells += supply_commod(sp->sct_own, sp->sct_x, sp->sct_y, + I_SHELL, 1 - shells); + if (shells == 0) + return -1; + sp->sct_item[I_SHELL] = shells - 1; + return (int)fortgun(sp->sct_effic, guns); +} + /* * Return effective firing range for range factor RNG at tech TLEV. */ diff --git a/src/lib/subs/lndsub.c b/src/lib/subs/lndsub.c index d7d895e5..e984c526 100644 --- a/src/lib/subs/lndsub.c +++ b/src/lib/subs/lndsub.c @@ -846,28 +846,14 @@ lnd_fort_interdiction(struct emp_qelem *list, continue; if (getrel(getnatp(fsect.sct_own), victim) >= NEUTRAL) continue; - gun = fsect.sct_item[I_GUN]; - if (gun < 1) - continue; range = roundrange(fortrange(&fsect)); trange = mapdist(newx, newy, fsect.sct_x, fsect.sct_y); if (trange > range) continue; - if (fsect.sct_item[I_MILIT] < 5) - continue; - shell = fsect.sct_item[I_SHELL]; - if (shell < 1) - shell += supply_commod(fsect.sct_own, fsect.sct_x, fsect.sct_y, - I_SHELL, 1); - if (shell < 1) - continue; - shell--; - fsect.sct_item[I_SHELL] = shell; + dam = fort_fire(&fsect); putsect(&fsect); - if (gun > 7) - gun = 7; - guneff = landgun((int)fsect.sct_effic, gun); - dam = (int)guneff; + if (dam < 0) + continue; totdam += dam; mpr(victim, "Incoming fire does %d damage!\n", dam); wu(0, fsect.sct_own, diff --git a/src/lib/subs/shpsub.c b/src/lib/subs/shpsub.c index bed6d02f..0691a58d 100644 --- a/src/lib/subs/shpsub.c +++ b/src/lib/subs/shpsub.c @@ -587,8 +587,6 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy, struct nstr_sect ns; struct sctstr fsect; int trange, range; - double guneff; - int shell, gun; int dam; int totdam = 0; signed char notified[MAXNOC]; @@ -625,28 +623,14 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy, while (nxtsct(&ns, &fsect)) { if (!notified[fsect.sct_own]) continue; - gun = fsect.sct_item[I_GUN]; - if (gun < 1) - continue; range = roundrange(fortrange(&fsect)); trange = mapdist(newx, newy, fsect.sct_x, fsect.sct_y); if (trange > range) continue; - if (fsect.sct_item[I_MILIT] < 5) - continue; - shell = fsect.sct_item[I_SHELL]; - if (shell < 1) - shell += supply_commod(fsect.sct_own, fsect.sct_x, fsect.sct_y, - I_SHELL, 1); - if (shell < 1) - continue; - shell--; - fsect.sct_item[I_SHELL] = shell; + dam = fort_fire(&fsect); putsect(&fsect); - if (gun > 7) - gun = 7; - guneff = landgun((int)fsect.sct_effic, gun); - dam = (int)guneff; + if (dam < 0) + continue; totdam += dam; mpr(victim, "Incoming fire does %d damage!\n", dam); /*