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 *);
extern struct sctintrins intrchr[INT_DEF + 2];
+extern int fort_fire(struct sctstr *);
+
#endif
}
}
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);
/* 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) {
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));
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;
}
}
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));
{
int damage;
natid own;
- int shell;
- int range;
- int range2, gun;
+ int range, range2;
own = sp->sct_own;
if (own == 0)
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",
#include "ship.h"
double
-landgun(int effic, int guns)
+fortgun(int effic, int guns)
{
double d;
double g = MIN(guns, 7);
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.
*/
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,
struct nstr_sect ns;
struct sctstr fsect;
int trange, range;
- double guneff;
- int shell, gun;
int dam;
int totdam = 0;
signed char notified[MAXNOC];
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);
/*