]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/mfir.c
Revert "Permit ships that can drop depth charges, but not fire"
[empserver] / src / lib / commands / mfir.c
index c997e7dd369d6c5853f80d6a4ab71b61f89b1ee8..e679074efa7c3b0d9fcd79c1717acda762f9368f 100644 (file)
 #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 {
@@ -167,8 +170,7 @@ multifire(void)
                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;
            }
@@ -232,8 +234,7 @@ multifire(void)
                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;
@@ -263,7 +264,7 @@ multifire(void)
        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;
@@ -272,20 +273,16 @@ multifire(void)
            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");
@@ -305,16 +302,11 @@ multifire(void)
                    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");
@@ -343,29 +335,6 @@ multifire(void)
            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++;
@@ -379,6 +348,18 @@ multifire(void)
            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:
@@ -426,18 +407,17 @@ multifire(void)
            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, 'i');
+               retreat_ship(&vship, vict, 'i');
            else if (target == targ_sub && (vship.shp_rflags & RET_DCHRGED))
-               retreat_ship(&vship, 'd');
+               retreat_ship(&vship, vict, 'd');
            else if (totaldefdam == 0 && (vship.shp_rflags & RET_HELPLESS))
-               retreat_ship(&vship, 'h');
-           putship(vship.shp_uid, &vship);
+               retreat_ship(&vship, vict, 'h');
            break;
        }
        switch (attgp->ef_type) {
        case EF_SECTOR:
-           putsect(&fsect);
            break;
        case EF_SHIP:
            if ((target == targ_ship) || (target == targ_sub)) {
@@ -445,7 +425,6 @@ multifire(void)
                    shp_missdef(&fship, vict);
                }
            }
-           putship(fship.shp_uid, &fship);
            break;
        default:
            CANT_REACH();