/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2008, 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 <config.h>
-#include "misc.h"
-#include "player.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 "optlist.h"
-#include "damage.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,
multifire(void)
{
static int ef_with_guns[] = { EF_SECTOR, EF_SHIP, EF_LAND, EF_BAD };
- s_char vbuf[20];
- s_char *ptr;
- double range2, range;
- int trange;
+ 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];
+ char buf[1024];
emp_initque(&fired);
emp_initque(&defended);
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 */
continue;
}
gun = item.ship.shp_item[I_GUN];
- gun = min(gun, item.ship.shp_glim);
+ 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;
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;
}
continue;
}
gun = fship.shp_item[I_GUN];
- gun = min(gun, fship.shp_glim);
+ gun = MIN(gun, fship.shp_glim);
if (fship.shp_frnge == 0 || gun == 0) {
pr("Insufficient arms.\n");
continue;
}
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) {
/* Don't tell it's a sub */
continue;
}
}
- gun = min(gun, shell * 2);
- gun = min(gun, mil / 2);
- gun = max(gun, 1);
+ 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);
+ 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) {
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) {
/* Don't tell it's a sub */
range2 = -1;
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) {
}
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 (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;
default:
pr_beep();
pr("Kaboom!!!\n");
- prb = (double)(range2 ? (trange / range2) : 1.0);
+ prb = range2 ? (double)trange / range2 : 1.0;
prb *= prb;
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;
}
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:
pr("\nDefenders fire back!\n");
first = 0;
}
- dam = (odds * (double)fp->defdam);
+ dam = odds * fp->defdam;
if (fp->type == targ_ship) {
vict = fp->victim;
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 dam, dam2, rel, rel2;
- double tech;
struct sctstr firing;
struct nstr_sect ns;
struct flist *fp;
if (mchr[(int)ship.shp_type].m_flags & M_SUB) {
if (shell < SHP_TORP_SHELLS)
- shell += supply_commod(ship.shp_own, ship.shp_x, ship.shp_y,
+ 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 (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(NULL, ship.shp_x, ship.shp_y, ax, ay))
continue;
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 (shell < 1)
- shell += supply_commod(ship.shp_own, ship.shp_x, ship.shp_y,
- I_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 (shell < 1)
continue;
- nshot = min(gun, ship.shp_item[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)++;
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 (!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;
gun = firing.sct_item[I_GUN];
struct sctstr sect;
int shell;
short *item;
- double mobcost;
- struct mchrstr *mcp;
/* use 1 shell from everyone */
for (qp = list->q_forw; qp != list; qp = next) {
shell = 0;
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, §);