#include "optlist.h"
#include "retreat.h"
-enum targ_type {
- targ_land, targ_ship, targ_sub, targ_bogus
+enum targ_type { /* Targeting... */
+ targ_land, /* a sector with guns */
+ targ_ship, /* a ship with guns */
+ targ_sub, /* a submarine with depth charges */
+ targ_bogus /* a bogus sector with guns */
};
struct flist {
pr("Not enough mil on ship #%d\n", item.ship.shp_uid);
continue;
}
- if (mchr[item.ship.shp_type].m_glim == 0
- && !(mchr[fship.shp_type].m_flags & M_DCH)) {
+ if (mchr[item.ship.shp_type].m_glim == 0) {
pr("Ships %d cannot fire guns!\n", item.ship.shp_uid);
continue;
}
pr("No such ship exists!\n");
continue;
}
- target = (mchr[(int)vship.shp_type].m_flags & M_SUB) ?
- targ_sub : targ_ship;
+ target = targ_ship; /* targ_ship vs. targ_sub decided below */
vict = vship.shp_own;
x = vship.shp_x;
y = vship.shp_y;
if (type == EF_SHIP) {
if (!check_ship_ok(&fship))
return RET_FAIL;
- if (target == targ_sub || target == targ_ship) {
+ if (target == targ_ship) {
if (fship.shp_uid == vship.shp_uid) {
pr("You can't fire upon yourself!\n");
continue;
range = shp_fire_range(&fship);
range2 = roundrange(range);
pr("range is %d.00 (%.2f)\n", range2, range);
- if (target == targ_sub
- && trange <= range2
- && (mchr[(int)fship.shp_type].m_flags & M_DCH)) {
+ /* Use depth charges against subs, but only when in range */
+ if (target == targ_ship && trange <= range2
+ && (mchr[vship.shp_type].m_flags & M_SUB)
+ && (mchr[fship.shp_type].m_flags & M_DCH))
+ target = targ_sub;
+ if (target == targ_sub)
dam = shp_dchrg(&fship);
- } else {
- if (target == targ_sub)
- /* Don't tell it's a sub */
- range2 = -1;
- if (fship.shp_item[I_GUN] == 0) {
- pr("Insufficient arms.\n");
- continue;
- }
+ else
dam = shp_fire(&fship);
- }
+ fship.shp_mission = 0;
putship(fship.shp_uid, &fship);
if (CANT_HAPPEN(dam < 0)) {
pr("Klick! ...\n");
continue;
}
}
-
range = lnd_fire_range(&fland);
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 = lnd_fire(&fland);
+ fland.lnd_mission = 0;
putland(fland.lnd_uid, &fland);
if (CANT_HAPPEN(dam < 0)) {
pr("Klick! ...\n");
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;
- }
- }
- if (trange > range2) {
- pr("Target out of range.\n");
- switch (type) {
- case EF_SECTOR:
- putsect(&fsect);
- break;
- case EF_LAND:
- fland.lnd_mission = 0;
- putland(fland.lnd_uid, &fland);
- break;
- case EF_SHIP:
- fship.shp_mission = 0;
- putship(fship.shp_uid, &fship);
- break;
- default:
- CANT_REACH();
- }
- continue;
}
nfiring++;
pr("Kaboom!!!\n");
break;
}
+
+ /*
+ * If the player fires guns at a submarine, take care not to
+ * disclose it's a submarine: pretend the target is out of range.
+ */
+ if (target == targ_ship && (mchr[vship.shp_type].m_flags & M_SUB))
+ range2 = -1;
+ if (trange > range2) {
+ pr("Target out of range.\n");
+ continue;
+ }
+
switch (target) {
case targ_bogus:
case targ_land:
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');
else if (target == targ_sub && (vship.shp_rflags & RET_DCHRGED))
retreat_ship(&vship, vict, 'd');
else if (totaldefdam == 0 && (vship.shp_rflags & RET_HELPLESS))
retreat_ship(&vship, vict, 'h');
- putship(vship.shp_uid, &vship);
break;
}
switch (attgp->ef_type) {
case EF_SECTOR:
- putsect(&fsect);
break;
case EF_SHIP:
if ((target == targ_ship) || (target == targ_sub)) {
shp_missdef(&fship, vict);
}
}
- putship(fship.shp_uid, &fship);
break;
default:
CANT_REACH();