]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/mfir.c
retreat: Drop unused parameter @code
[empserver] / src / lib / commands / mfir.c
index 2cd3a810d9adc5a41fecac07e28bd61e1af69b81..5fd32011c05c32cbb1d88273974f335be667e073 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  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
@@ -28,7 +28,7 @@
  *
  *  Known contributors to this file:
  *     Steve McClure, 2000
- *     Markus Armbruster, 2004-2015
+ *     Markus Armbruster, 2004-2021
  */
 
 #include <config.h>
@@ -170,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;
            }
@@ -273,7 +272,6 @@ multifire(void)
            }
            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)
@@ -285,10 +283,6 @@ multifire(void)
                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);
@@ -305,14 +299,9 @@ multifire(void)
            }
            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);
@@ -329,26 +318,15 @@ multifire(void)
            }
            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 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");
+       if (CANT_HAPPEN(dam < 0)) {
+           pr("Jammed!\n");
            continue;
        }
-
+       pr("range is %d.00 (%.2f)\n", range2, range);
        nfiring++;
        switch (target) {
        case targ_sub:
@@ -361,6 +339,17 @@ multifire(void)
            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:
@@ -408,13 +397,13 @@ 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, 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) {
@@ -438,6 +427,7 @@ multifire(void)
     else
        odds = 1.0;
     do_defdam(&fired, odds);
+    free_flist(&fired);
     return RET_OK;
 }
 
@@ -492,7 +482,7 @@ do_defdam(struct emp_qelem *list, double odds)
            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 {
@@ -507,8 +497,6 @@ do_defdam(struct emp_qelem *list, double odds)
                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);
     }
 }
 
@@ -671,13 +659,16 @@ free_flist(struct emp_qelem *list)
 }
 
 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);
 }