/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
*
* Known contributors to this file:
* Steve McClure, 2000
- * Markus Armbruster, 2004-2015
+ * Markus Armbruster, 2004-2021
*/
#include <config.h>
static struct flist *search_flist(struct emp_qelem *, struct empobj *);
int
-multifire(void)
+c_fire(void)
{
static int ef_with_guns[] = { EF_SECTOR, EF_SHIP, EF_LAND, EF_BAD };
char *ptr;
}
range = shp_fire_range(&fship);
range2 = roundrange(range);
- pr("range is %d.00 (%.2f)\n", range2, range);
/* Use depth charges against subs, but only when in range */
if (target == targ_ship && trange <= range2
&& (mchr[vship.shp_type].m_flags & M_SUB)
dam = shp_fire(&fship);
fship.shp_mission = 0;
putship(fship.shp_uid, &fship);
- if (CANT_HAPPEN(dam < 0)) {
- pr("Klick! ...\n");
- continue;
- }
if (opt_NOMOBCOST == 0) {
fship.shp_mobil = MAX(fship.shp_mobil - 15, -100);
putship(fship.shp_uid, &fship);
}
range = lnd_fire_range(&fland);
range2 = roundrange(range);
- pr("range is %d.00 (%.2f)\n", range2, range);
dam = lnd_fire(&fland);
fland.lnd_mission = 0;
putland(fland.lnd_uid, &fland);
- if (CANT_HAPPEN(dam < 0)) {
- pr("Klick! ...\n");
- continue;
- }
if (target == targ_ship) {
if (chance(lnd_acc(&fland) / 100.0))
dam = ldround(dam / 2.0, 1);
}
dam = fort_fire(&fsect);
putsect(&fsect);
- if (CANT_HAPPEN(dam < 0)) {
- pr("Klick! ...\n");
- continue;
- }
range = fortrange(&fsect);
range2 = roundrange(range);
- pr("range is %d.00 (%.2f)\n", range2, range);
}
+ if (CANT_HAPPEN(dam < 0)) {
+ pr("Jammed!\n");
+ continue;
+ }
+ pr("range is %d.00 (%.2f)\n", range2, range);
nfiring++;
switch (target) {
case targ_sub:
shipdamage(&vship, dam);
if (vship.shp_effic < SHIP_MINEFF)
pr("%s sunk!\n", prsub(&vship));
- putship(vship.shp_uid, &vship);
if (dam && (vship.shp_rflags & RET_INJURED))
- retreat_ship(&vship, vict, 'i');
+ retreat_ship(&vship, vict);
else if (target == targ_sub && (vship.shp_rflags & RET_DCHRGED))
- retreat_ship(&vship, vict, 'd');
+ retreat_ship(&vship, vict);
else if (totaldefdam == 0 && (vship.shp_rflags & RET_HELPLESS))
- retreat_ship(&vship, vict, 'h');
+ retreat_ship(&vship, vict);
+ putship(vship.shp_uid, &vship);
break;
}
switch (attgp->ef_type) {
else
odds = 1.0;
do_defdam(&fired, odds);
+ free_flist(&fired);
return RET_OK;
}
if (vict)
wu(0, vict,
"Return fire hit %s in %s for %d damage.\n",
- prsub(&ship), xyas(ship.shp_x, ship.shp_y, vict), dam);
+ prship(&ship), xyas(ship.shp_x, ship.shp_y, vict), dam);
shipdamage(&ship, dam);
putship(ship.shp_uid, &ship);
} else {
wu(0, vict, "Return fire hit sector %s for %d damage.\n",
xyas(fp->x, fp->y, vict), dam);
}
- emp_remque(&fp->queue);
- free(fp);
}
}
}
static int
-uid_eq(struct emp_qelem *elem, void *key)
+flist_eq(struct emp_qelem *elem, void *key)
{
- return ((struct flist *)elem)->uid == ((struct empobj *)key)->uid;
+ struct flist *e = (struct flist *)elem;
+ struct flist *k = key;
+
+ return e->type == k->type && e->uid == k->uid;
}
static struct flist *
search_flist(struct emp_qelem *list, struct empobj *gp)
{
- return (struct flist *)emp_searchque(list, gp, uid_eq);
+ return (struct flist *)emp_searchque(list, gp, flist_eq);
}