/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2007, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
*
* ---
*
- * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- * related information and legal notices. It is expected that any future
- * projects/authors will amend these files as needed.
+ * See files README, COPYING and CREDITS in the root of the source
+ * tree for related information and legal notices. It is expected
+ * that future projects/authors will amend these files as needed.
*
* ---
*
*
* Known contributors to this file:
* Steve McClure, 2000
- *
*/
-#include "misc.h"
-#include "player.h"
-#include "var.h"
-#include "xy.h"
-#include "treaty.h"
-#include "nat.h"
-#include "ship.h"
-#include "land.h"
-#include "sect.h"
-#include "retreat.h"
-#include "news.h"
-#include "nsc.h"
-#include "file.h"
-#include "queue.h"
-#include <ctype.h>
-#include "options.h"
-#include "optlist.h"
-#include "damage.h"
+#include <config.h>
+
#include "commands.h"
+#include "damage.h"
+#include "empobj.h"
+#include "optlist.h"
+#include "retreat.h"
enum targ_type {
targ_land, targ_ship, targ_sub, targ_unit, targ_bogus
int victim; /* who I was shooting at */
};
-union item_u {
- struct shpstr ship;
- struct sctstr sect;
- struct lndstr land;
-};
-
static void add_to_fired_queue(struct emp_qelem *, struct emp_qelem *);
static int defend(struct emp_qelem *al,
struct emp_qelem *dl,
int
multifire(void)
{
- s_char vbuf[20];
- s_char *ptr;
- double range2, range;
- int trange;
+ static int ef_with_guns[] = { EF_SECTOR, EF_SHIP, EF_LAND, EF_BAD };
+ char vbuf[20];
+ char *ptr;
+ double range;
+ int trange, range2;
coord fx;
coord fy;
coord x;
struct natstr *natp;
struct nstr_item nbst;
int type;
- s_char *p;
+ char *p;
int nfiring = 0;
int ndefending = 0;
- union item_u item;
+ union empobj_storage item;
struct emp_qelem fired, defended;
double odds;
- s_char buf[1024];
-#if defined(_WIN32)
- time_t now;
-#endif
+ char buf[1024];
emp_initque(&fired);
emp_initque(&defended);
- type = (-1);
- while ((type != EF_SECTOR) && (type != EF_SHIP) && (type != EF_LAND)) {
- if (!(p = getstarg(player->argp[1],
- "Firing from ship(s), sect(s), or land unit(s)? ",
- buf)))
- return RET_SYN;
- player->argp[1] = 0;
- type = ef_byname(p);
- if (type == EF_SECTOR) {
- if (opt_NO_FORT_FIRE) {
- pr("Fort firing is disabled.\n");
- return RET_FAIL;
- }
- orig_attacker = attacker = targ_land;
- shots = 1;
- } else if (type == EF_SHIP) {
- orig_attacker = attacker = targ_ship;
- } else if (type == EF_LAND) {
- orig_attacker = attacker = targ_unit;
- } else
- pr("Please type 'sh', 'l', or 'se'!\n");
+ if (!(p = getstarg(player->argp[1],
+ "Firing from ship(s), sect(s), or land unit(s)? ",
+ buf)))
+ return RET_SYN;
+ type = ef_byname_from(p, ef_with_guns);
+ if (type == EF_SECTOR) {
+ if (opt_NO_FORT_FIRE) {
+ pr("Fort firing is disabled.\n");
+ return RET_FAIL;
+ }
+ orig_attacker = attacker = targ_land;
+ shots = 1;
+ } else if (type == EF_SHIP) {
+ orig_attacker = attacker = targ_ship;
+ } else if (type == EF_LAND) {
+ orig_attacker = attacker = targ_unit;
+ } else {
+ pr("Ships, land units or sectors only!\n");
+ return RET_SYN;
}
if ((ptr = getstarg(player->argp[2], "Firing from? ", buf)) == 0
|| *ptr == '\0')
pr("Fire aborted.\n");
return RET_OK;
}
- while (nxtitem(&nbst, (s_char *)&item)) {
+ while (nxtitem(&nbst, &item)) {
attacker = orig_attacker;
if (attacker == targ_unit) {
if (!getland(item.land.lnd_uid, &fland))
pr("Unit %d cannot fire!\n", fland.lnd_uid);
continue;
}
- if (lnd_getmil(&fland) < 1) {
+ if (fland.lnd_item[I_MILIT] < 1) {
pr("Unit %d cannot fire because it has no military!\n",
fland.lnd_uid);
continue;
continue;
}
if (fland.lnd_effic < LAND_MINFIREEFF) {
- pr("Unit %d cannot fire because it is less than %d%% efficient\n", fland.lnd_uid, LAND_MINFIREEFF);
+ pr("Unit %d cannot fire because it is less than %d%% efficient\n",
+ fland.lnd_uid, LAND_MINFIREEFF);
continue;
}
resupply_commod(&fland, I_SHELL); /* Get more shells */
putland(fland.lnd_uid, &fland);
- if (getvar(V_SHELL, (s_char *)&fland, EF_LAND) == 0) {
+ if (fland.lnd_item[I_SHELL] == 0) {
pr("%s -- not enough shells\n", prland(&fland));
continue;
}
continue;
if (item.ship.shp_own != player->cnum)
continue;
- if (getvar(V_MILIT, (s_char *)&item.ship, EF_SHIP) < 1) {
+ if (item.ship.shp_item[I_MILIT] < 1) {
pr("Not enough mil on ship #%d\n", item.ship.shp_uid);
continue;
}
- gun = getvar(V_GUN, (s_char *)&item.ship, EF_SHIP);
- gun = min(gun, item.ship.shp_glim);
+ gun = item.ship.shp_item[I_GUN];
+ gun = MIN(gun, item.ship.shp_glim);
if (item.ship.shp_frnge == 0) {
pr("Ships %d cannot fire guns!\n", item.ship.shp_uid);
continue;
pr("Not enough guns on ship #%d\n", item.ship.shp_uid);
continue;
}
- if (getvar(V_SHELL, (s_char *)&item.ship, EF_SHIP) == 0) {
+ if (item.ship.shp_item[I_SHELL] == 0) {
pr("Not enough shells on ship #%d\n", item.ship.shp_uid);
continue;
}
continue;
if (item.sect.sct_type != SCT_FORTR)
continue;
- if (item.sect.sct_effic < ((u_char)FORTEFF)) {
+ if (item.sect.sct_effic < FORTEFF) {
pr("Fort not efficient enough to fire!\n");
continue;
}
- if (getvar(V_GUN, (s_char *)&item.sect, EF_SECTOR) == 0) {
+ if (item.sect.sct_item[I_GUN] == 0) {
pr("Not enough guns in sector %s!\n",
xyas(item.sect.sct_x, item.sect.sct_y, player->cnum));
continue;
}
- if (getvar(V_SHELL, (s_char *)&item.sect, EF_SECTOR) == 0) {
+ if (item.sect.sct_item[I_SHELL] == 0) {
pr("Not enough shells in sector %s!\n",
xyas(item.sect.sct_x, item.sect.sct_y, player->cnum));
continue;
}
- if (getvar(V_MILIT, (s_char *)&item.sect, EF_SECTOR) < 5) {
+ if (item.sect.sct_item[I_MILIT] < 5) {
pr("Not enough military in sector %s!\n",
xyas(item.sect.sct_x, item.sect.sct_y, player->cnum));
continue;
y = vsect.sct_y;
}
if (attacker == targ_ship) {
- shots = -1; /* convert to max later */
if (fship.shp_own != player->cnum) {
pr("Not your ship!\n");
continue;
}
*/
attacker = targ_ship;
- if ((mil = getvar(V_MILIT, (s_char *)&fship, EF_SHIP)) < 1) {
+ if ((mil = fship.shp_item[I_MILIT]) < 1) {
pr("Not enough military for firing crew.\n");
continue;
}
- gun = getvar(V_GUN, (s_char *)&fship, EF_SHIP);
- gun = min(gun, fship.shp_glim);
+ gun = fship.shp_item[I_GUN];
+ gun = MIN(gun, fship.shp_glim);
if (fship.shp_frnge == 0 || gun == 0) {
pr("Insufficient arms.\n");
continue;
}
- shell = getvar(V_SHELL, (s_char *)&fship, EF_SHIP);
+ shell = fship.shp_item[I_SHELL];
if (shell < 2)
- shell += supply_commod(fship.shp_own, fship.shp_x,
- fship.shp_y, I_SHELL, 2 - shell);
+ shell += supply_commod(fship.shp_own,
+ fship.shp_x, fship.shp_y,
+ I_SHELL, 2 - shell);
if (shell <= 0) {
pr("Klick! ...\n");
continue;
}
if (fship.shp_effic < 60) {
- pr("Ship #%d is crippled (%d%%)\n", fshipno,
- fship.shp_effic);
+ pr("Ship #%d is crippled (%d%%)\n",
+ fshipno, fship.shp_effic);
continue;
}
- range = techfact(fship.shp_tech,
- (double)fship.shp_frnge / 2.0);
- range2 = (double)roundrange(range);
- pr("range is %.2f (%.2f)\n", range2, range);
+ range = effrange(fship.shp_frnge, fship.shp_tech);
+ range2 = roundrange(range);
+ pr("range is %d.00 (%.2f)\n", range2, range);
if (target == targ_sub) {
if ((mchr[(int)fship.shp_type].m_flags & M_DCH) == 0) {
- pr("A %s can't drop depth charges!\n",
- mchr[(int)fship.shp_type].m_name);
- continue;
- }
- if (shell < 2) {
+ /* Don't tell it's a sub */
+ range2 = -1;
+ } else if (shell < 2) {
pr("Not enough shells for depth charge!\n");
continue;
}
}
- gun = min(gun, shell * 2);
- gun = min(gun, mil / 2);
- gun = max(gun, 1);
- if (shots > gun || shots < 0)
- shots = gun;
- else if (shots == 0) {
- pr("No shots fired.\n");
- continue;
- }
+ gun = MIN(gun, shell * 2);
+ gun = MIN(gun, mil / 2);
+ gun = MAX(gun, 1);
+ shots = gun;
guneff = seagun(fship.shp_effic, shots);
dam = (int)guneff;
- shell -= ldround(((double)shots) / 2.0, 1);
- putvar(V_SHELL, shell, (s_char *)&fship, EF_SHIP);
- putship(fship.shp_uid, &fship);
+ shell -= ldround(shots / 2.0, 1);
+ fship.shp_item[I_SHELL] = shell;
if (opt_NOMOBCOST == 0)
- fship.shp_mobil = max(fship.shp_mobil - 15, -100);
+ fship.shp_mobil = MAX(fship.shp_mobil - 15, -100);
+ putship(fship.shp_uid, &fship);
} else if (attacker == targ_unit) {
if (fland.lnd_own != player->cnum) {
pr("Not your unit!\n");
pr("Unit %d cannot fire!\n", fland.lnd_uid);
continue;
}
- if (getvar(V_SHELL, (s_char *)&fland, EF_LAND) == 0) {
+ if (fland.lnd_item[I_SHELL] == 0) {
pr("%s -- not enough shells\n", prland(&fland));
continue;
}
- shell = getvar(V_SHELL, (s_char *)&fland, EF_LAND);
+ shell = fland.lnd_item[I_SHELL];
- range = techfact((int)fland.lnd_tech,
- (double)fland.lnd_frg / 2.0);
- range2 = (double)roundrange(range);
- pr("range is %.2f (%.2f)\n", range2, range);
+ range = effrange(fland.lnd_frg, fland.lnd_tech);
+ range2 = roundrange(range);
+ pr("range is %d.00 (%.2f)\n", range2, range);
if (target == targ_sub) {
- pr("A %s can't drop depth charges!\n",
- lchr[(int)fland.lnd_type].l_name);
- continue;
+ /* Don't tell it's a sub */
+ range2 = -1;
}
- gun = getvar(V_GUN, (s_char *)&fland, EF_LAND);
+ gun = fland.lnd_item[I_GUN];
if (gun <= 0) {
pr("%s -- not enough guns\n", prland(&fland));
continue;
dam = (int)landunitgun(fland.lnd_effic, fland.lnd_dam, gun,
fland.lnd_ammo, shell);
if (target == targ_ship) {
- if (chance(((double)fland.lnd_acc) / 100.0))
- dam = ldround(((double)dam / 2.0), 1);
+ if (chance(fland.lnd_acc / 100.0))
+ dam = ldround(dam / 2.0, 1);
}
use_supply(&fland);
resupply_commod(&fland, I_SHELL); /* Get more shells */
fy = fsect.sct_y;
if (fsect.sct_own != player->cnum ||
fsect.sct_type != SCT_FORTR) {
- pr("No fortress at %s\n", xyas(fsect.sct_x,
- fsect.sct_y, player->cnum));
+ pr("No fortress at %s\n",
+ xyas(fsect.sct_x, fsect.sct_y, player->cnum));
continue;
}
if (target == targ_land) {
}
}
attacker = targ_land;
- if ((gun = getvar(V_GUN, (s_char *)&fsect, EF_SECTOR)) == 0) {
+ if ((gun = fsect.sct_item[I_GUN]) == 0) {
pr("Insufficient arms.\n");
continue;
}
- shell = getvar(V_SHELL, (s_char *)&fsect, EF_SECTOR);
+ shell = fsect.sct_item[I_SHELL];
if (shell <= 0)
- shell += supply_commod(fsect.sct_own, fsect.sct_x,
- fsect.sct_y, I_SHELL, 1);
+ shell += supply_commod(fsect.sct_own,
+ fsect.sct_x, fsect.sct_y,
+ I_SHELL, 1);
if (shell <= 0) {
pr("Klick! ...\n");
continue;
}
- if (getvar(V_MILIT, (s_char *)&fsect, EF_SECTOR) < 5) {
+ if (fsect.sct_item[I_MILIT] < 5) {
pr("Not enough military for firing crew.\n");
continue;
}
- if (target == targ_sub) {
- pr("Target ship not sighted!\n");
- continue;
- }
if (gun > 7)
gun = 7;
- range = tfactfire(player->cnum, 7.0);
- if (fsect.sct_effic > 59)
- range++;
- range2 = (double)roundrange(range);
- pr("range is %.2f (%.2f)\n", range2, range);
+ range = fortrange(&fsect);
+ range2 = roundrange(range);
+ pr("range is %d.00 (%.2f)\n", range2, range);
+ if (target == targ_sub) {
+ /* Don't tell it's a sub */
+ range2 = -1;
+ }
guneff = landgun((int)fsect.sct_effic, gun);
dam = (int)guneff;
shell--;
- putvar(V_SHELL, shell, (s_char *)&fsect, EF_SECTOR);
+ fsect.sct_item[I_SHELL] = shell;
putsect(&fsect);
}
trange = mapdist(x, y, fx, fy);
default:
pr_beep();
pr("Kaboom!!!\n");
- prb = (double)(range2 ? (trange / range2) : 1.0);
+ prb = range2 ? (double)trange / range2 : 1.0;
prb *= prb;
-#if !defined(_WIN32)
- srandom(random());
-#else
- (void)time(&now);
- (void)srand(now);
-#endif
if (chance(prb)) {
pr("Wind deflects shell%s.\n", splur(shots));
-/* dam = (int)((double)dam / 2.0);*/
- dam =
- (int)((double)dam *
- (double)((double)(90 - (random() % 11)) /
- 100.0));
+/* dam = (int)(dam / 2.0);*/
+ dam *= (90 - (random() % 11)) / 100.0;
if (dam < 0)
dam = 0;
}
break;
case targ_ship:
nreport(player->cnum, N_SHP_SHELL, vict, 1);
+ /* fall through */
default:
if ((target != targ_sub) ||
((vship.shp_rflags & RET_DCHRGED) == 0))
break;
}
if ((totaldefdam == 0) && (target == targ_ship))
- if (vship.shp_rflags & RET_INJURED)
+ if (vship.shp_rflags & RET_HELPLESS)
retreat_ship(&vship, 'h');
switch (attacker) {
case targ_land:
(dam = quiet_bigdef(attacker, dl, vict, aown, fx, fy, &nfiring))) {
if (nfiring > *nd)
*nd = nfiring;
- fp = (struct flist *)malloc(sizeof(struct flist));
+ fp = malloc(sizeof(struct flist));
memset(fp, 0, sizeof(struct flist));
fp->defdam = dam;
fp->victim = vict;
emp_insque(&fp->queue, al);
}
- return (dam);
+ return dam;
}
static void
pr("\nDefenders fire back!\n");
first = 0;
}
- dam = (odds * (double)fp->defdam);
+ dam = odds * fp->defdam;
if (fp->type == targ_ship) {
vict = fp->victim;
xyas(fp->x, fp->y, vict), dam);
}
emp_remque(&fp->queue);
- free((s_char *)fp);
+ free(fp);
}
}
quiet_bigdef(int attacker, struct emp_qelem *list, natid own, natid aown,
coord ax, coord ay, int *nfiring)
{
- int nshot;
- double range, erange, hitchance;
+ int nshot, range;
+ double erange, hitchance;
struct shpstr ship;
struct lndstr land;
struct nstr_item ni;
- int vec[I_MAX + 1];
int dam, dam2, rel, rel2;
- double tech;
struct sctstr firing;
struct nstr_sect ns;
struct flist *fp;
- double techfact(int, double);
- extern int torpedo_damage;
- int gun;
+ int gun, shell;
if (own == 0)
return 0;
dam = 0;
snxtitem_dist(&ni, EF_SHIP, ax, ay, 8);
- while (nxtitem(&ni, (caddr_t)&ship)) {
+ while (nxtitem(&ni, &ship)) {
if (ship.shp_own == 0)
continue;
continue;
if (ship.shp_effic < 60)
continue;
- if (getvec(VT_ITEM, vec, (caddr_t)&ship, EF_SHIP) < 0)
- continue;
- if (vec[I_MILIT] < 1)
+ gun = ship.shp_item[I_GUN];
+ shell = ship.shp_item[I_SHELL];
+
+ if (ship.shp_item[I_MILIT] < 1)
continue;
if (mchr[(int)ship.shp_type].m_flags & M_SUB) {
- if (vec[I_SHELL] < 3)
- vec[I_SHELL] += supply_commod(ship.shp_own,
- ship.shp_x, ship.shp_y,
- I_SHELL, 3 - vec[I_SHELL]);
- if (vec[I_SHELL] < 3)
+ if (shell < SHP_TORP_SHELLS)
+ shell += supply_commod(ship.shp_own,
+ ship.shp_x, ship.shp_y,
+ I_SHELL, SHP_TORP_SHELLS - shell);
+ if (shell < SHP_TORP_SHELLS)
continue;
- if (vec[I_GUN] < 1)
+ if (gun < 1)
continue;
/*
if (ship.shp_mobil <= 0)
continue;
*/
- erange = ship.shp_effic *
- techfact(ship.shp_tech, ((double)ship.shp_frnge))
- / 100.0;
- erange = (double)roundrange(erange);
+ erange = torprange(&ship);
range = mapdist(ship.shp_x, ship.shp_y, ax, ay);
- if (range > erange)
+ if (range > roundrange(erange))
continue;
- if (!line_of_sight
- ((s_char **)0, ship.shp_x, ship.shp_y, ax, ay))
+ if (!line_of_sight(NULL, ship.shp_x, ship.shp_y, ax, ay))
continue;
(*nfiring)++;
- fp = (struct flist *)malloc(sizeof(struct flist));
+ fp = malloc(sizeof(struct flist));
memset(fp, 0, sizeof(struct flist));
fp->type = targ_ship;
fp->uid = ship.shp_uid;
dam += TORP_DAMAGE();
} else {
- range = techfact(ship.shp_tech,
- ship.shp_frnge * ship.shp_effic / 200.0);
- range = (double)roundrange(range);
- if (range < ni.curdist)
+ erange = effrange(ship.shp_frnge, ship.shp_tech);
+ if (roundrange(erange) < ni.curdist)
continue;
/* must have gun, shell, and milit to fire */
- if (vec[I_SHELL] < 1)
- vec[I_SHELL] += supply_commod(ship.shp_own,
- ship.shp_x, ship.shp_y,
- I_SHELL, 1);
+ if (shell < 1)
+ shell += supply_commod(ship.shp_own,
+ ship.shp_x, ship.shp_y, I_SHELL, 1);
/* only need 1 shell, so don't check that */
- if (vec[I_SHELL] < 1)
+ if (shell < 1)
continue;
- nshot = min(vec[I_GUN], vec[I_MILIT]);
- nshot = min(nshot, ship.shp_glim);
+ nshot = MIN(gun, ship.shp_item[I_MILIT]);
+ nshot = MIN(nshot, ship.shp_glim);
if (nshot == 0)
continue;
(*nfiring)++;
- fp = (struct flist *)malloc(sizeof(struct flist));
+ fp = malloc(sizeof(struct flist));
memset(fp, 0, sizeof(struct flist));
fp->type = targ_ship;
fp->uid = ship.shp_uid;
}
}
snxtitem_dist(&ni, EF_LAND, ax, ay, 8);
- while (nxtitem(&ni, (caddr_t)&land)) {
+ while (nxtitem(&ni, &land)) {
if (land.lnd_own == 0)
continue;
if (land.lnd_effic < LAND_MINFIREEFF)
if (land.lnd_land >= 0)
continue;
/* Gotta have military */
- if (lnd_getmil(&land) < 1)
+ if (land.lnd_item[I_MILIT] < 1)
continue;
/* Don't shoot yourself */
if (land.lnd_own == aown)
if ((land.lnd_own != own) && ((rel != ALLIED) || (rel2 != AT_WAR)))
continue;
-
- range = techfact((int)land.lnd_tech, (double)land.lnd_frg / 2.0);
- range = (double)roundrange(range);
- if (range < ni.curdist)
+ erange = effrange(land.lnd_frg, land.lnd_tech);
+ if (roundrange(erange) < ni.curdist)
continue;
resupply_all(&land);
if (!has_supply(&land))
continue;
- if (getvec(VT_ITEM, vec, (caddr_t)&land, EF_LAND) < 0)
- continue;
+ gun = land.lnd_item[I_GUN];
+ shell = land.lnd_item[I_SHELL];
- if (vec[I_MILIT] == 0 || vec[I_SHELL] == 0 || vec[I_GUN] == 0)
+ if (land.lnd_item[I_MILIT] == 0 || shell == 0 || gun == 0)
continue;
- dam2 = (int)landunitgun(land.lnd_effic, land.lnd_dam, vec[I_GUN],
- land.lnd_ammo, vec[I_SHELL]);
+ dam2 = (int)landunitgun(land.lnd_effic, land.lnd_dam, gun,
+ land.lnd_ammo, shell);
(*nfiring)++;
- fp = (struct flist *)malloc(sizeof(struct flist));
+ fp = malloc(sizeof(struct flist));
memset(fp, 0, sizeof(struct flist));
fp->type = targ_unit;
fp->uid = land.lnd_uid;
if (!opt_NO_FORT_FIRE) {
snxtsct_dist(&ns, ax, ay, 8);
while (nxtsct(&ns, &firing)) {
-
- if (firing.sct_type != SCT_FORTR)
- continue;
if (firing.sct_own == 0)
continue;
rel = getrel(getnatp(firing.sct_own), own);
/* Don't shoot yourself */
if (firing.sct_own == aown)
continue;
- tech = tfactfire(firing.sct_own, 1.0);
- range = tech * 7.0;
- if (firing.sct_effic > 59) /* fort bonus */
- range++;
- range = (double)roundrange(range);
- if (range < ns.curdist)
+ erange = fortrange(&firing);
+ if (roundrange(erange) < ns.curdist)
continue;
- if (getvec(VT_ITEM, vec, (caddr_t)&firing, EF_SECTOR) < 0)
- continue;
- if (vec[I_SHELL] < 1)
- vec[I_SHELL] += supply_commod(firing.sct_own,
- firing.sct_x, firing.sct_y,
- I_SHELL, 1);
- if (vec[I_GUN] == 0 || vec[I_MILIT] < 5 || vec[I_SHELL] == 0)
+
+ 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)
continue;
(*nfiring)++;
- fp = (struct flist *)malloc(sizeof(struct flist));
+ fp = malloc(sizeof(struct flist));
memset(fp, 0, sizeof(struct flist));
fp->x = firing.sct_x;
fp->y = firing.sct_y;
fp->type = targ_land;
add_to_fired_queue(&fp->queue, list);
nreport(firing.sct_own, N_FIRE_BACK, player->cnum, 1);
- gun = vec[I_GUN];
if (gun > 7)
gun = 7;
dam += landgun((int)firing.sct_effic, gun);
}
}
- return ((*nfiring) == 0 ? 0 : (dam / (*nfiring)));
+ return *nfiring == 0 ? 0 : dam / *nfiring;
}
static void
struct shpstr ship;
struct lndstr land;
struct sctstr sect;
- int shell, type;
- s_char *ptr;
- double mobcost;
- struct mchrstr *mcp;
+ int shell;
+ short *item;
/* use 1 shell from everyone */
for (qp = list->q_forw; qp != list; qp = next) {
fp = (struct flist *)qp;
if (fp->type == targ_ship) {
getship(fp->uid, &ship);
- ptr = (s_char *)&ship;
- type = EF_SHIP;
+ item = ship.shp_item;
if (mchr[(int)ship.shp_type].m_flags & M_SUB) {
- shell = getvar(V_SHELL, ptr, type);
- shell--;
+ shell = item[I_SHELL];
+ shell -= SHP_TORP_SHELLS - 1;
if (shell < 0)
shell = 0;
- putvar(V_SHELL, shell, ptr, type);
+ item[I_SHELL] = shell;
putship(ship.shp_uid, &ship);
- mcp = &mchr[(int)ship.shp_type];
- mobcost = ship.shp_effic * 0.01 * ship.shp_speed;
- mobcost = (480.0 / (mobcost +
- techfact(ship.shp_tech, mobcost)));
/* mob cost = 1/2 a sect's mob */
- mobcost /= 2.0;
- ship.shp_mobil -= mobcost;
+ ship.shp_mobil -= shp_mobcost(&ship) / 2.0;
}
} else if (fp->type == targ_land) {
getsect(fp->x, fp->y, §);
- ptr = (s_char *)§
- type = EF_SECTOR;
+ item = sect.sct_item;
} else {
getland(fp->uid, &land);
- ptr = (s_char *)&land;
- type = EF_LAND;
+ item = land.lnd_item;
}
- shell = getvar(V_SHELL, ptr, type);
+ shell = item[I_SHELL];
shell--;
if (shell < 0)
shell = 0;
- putvar(V_SHELL, shell, ptr, type);
+ item[I_SHELL] = shell;
if (fp->type == targ_ship)
putship(ship.shp_uid, &ship);
else if (fp->type == targ_land)
putland(land.lnd_uid, &land);
emp_remque(&fp->queue);
- free((s_char *)fp);
+ free(fp);
}
}