]> git.pond.sub.org Git - empserver/commitdiff
Factor out common fortress fire code into fort_fire()
authorMarkus Armbruster <armbru@pond.sub.org>
Fri, 14 Mar 2008 19:01:05 +0000 (20:01 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Fri, 14 Mar 2008 19:25:37 +0000 (20:25 +0100)
This takes care of a number of bugs / inconsistencies:

* sb() fired support even when there were not enough mil.

* Shell resupply bugs: multifire() and quiet_bigdef() resupplied
  shells before checking all other requirements and could thus get
  more shells than actually needed.

Rename landgun() to fortgun() for consistency.

include/prototypes.h
include/sect.h
src/lib/commands/mfir.c
src/lib/commands/sabo.c
src/lib/subs/fortdef.c
src/lib/subs/landgun.c
src/lib/subs/lndsub.c
src/lib/subs/shpsub.c

index 13f386458180f89a19bcb57e6fead277c2559c67..c1b5948f109ec3254736e7fee3e3cd85a2411e9e 100644 (file)
@@ -459,7 +459,7 @@ extern int lnd_postread(int, void *);
 extern int lnd_prewrite(int, void *);
 /* landgun.c */
 extern double seagun(int, int);
-extern double landgun(int, int);
+extern double fortgun(int, int);
 extern double landunitgun(int, int, int, int, int);
 extern double effrange(int, double);
 extern double torprange(struct shpstr *);
index 8d9f9d4eb21eaf0618bc28075395679cd12d92ca..0ba02ee8afa093c89bef7e8f95afbb8045b673ff 100644 (file)
@@ -214,4 +214,6 @@ struct sctintrins {
 
 extern struct sctintrins intrchr[INT_DEF + 2];
 
+extern int fort_fire(struct sctstr *);
+
 #endif
index f42ce38fc4eacb4bde7acf2c844c8ebfad719cf1..b4ff03b7d92d2e2f9d6b69dd75f6fb316408eefa 100644 (file)
@@ -419,25 +419,20 @@ multifire(void)
                }
            }
            attacker = targ_land;
-           if ((gun = fsect.sct_item[I_GUN]) == 0) {
+           if (fsect.sct_item[I_GUN] == 0) {
                pr("Insufficient arms.\n");
                continue;
            }
-           shell = fsect.sct_item[I_SHELL];
-           if (shell <= 0)
-               shell += supply_commod(fsect.sct_own,
-                                      fsect.sct_x, fsect.sct_y,
-                                      I_SHELL, 1);
-           if (shell <= 0) {
-               pr("Klick!     ...\n");
-               continue;
-           }
            if (fsect.sct_item[I_MILIT] < 5) {
                pr("Not enough military for firing crew.\n");
                continue;
            }
-           if (gun > 7)
-               gun = 7;
+           dam = fort_fire(&fsect);
+           putsect(&fsect);
+           if (dam < 0) {
+               pr("Klick!     ...\n");
+               continue;
+           }
            range = fortrange(&fsect);
            range2 = roundrange(range);
            pr("range is %d.00 (%.2f)\n", range2, range);
@@ -445,11 +440,6 @@ multifire(void)
                /* Don't tell it's a sub */
                range2 = -1;
            }
-           guneff = landgun((int)fsect.sct_effic, gun);
-           dam = (int)guneff;
-           shell--;
-           fsect.sct_item[I_SHELL] = shell;
-           putsect(&fsect);
        }
        trange = mapdist(x, y, fx, fy);
        if (trange > range2) {
@@ -904,14 +894,9 @@ quiet_bigdef(int attacker, struct emp_qelem *list, natid own, natid aown,
            if (roundrange(erange) < ns.curdist)
                continue;
 
-           gun = firing.sct_item[I_GUN];
-           shell = firing.sct_item[I_SHELL];
-
-           if (shell < 1)
-               shell += supply_commod(firing.sct_own,
-                                      firing.sct_x, firing.sct_y,
-                                      I_SHELL, 1);
-           if (gun == 0 || firing.sct_item[I_MILIT] < 5 || shell == 0)
+           dam2 = fort_fire(&firing);
+           /* no putsect(&firing) because ammo is charged in use_ammo() */
+           if (dam2 < 0)
                continue;
            (*nfiring)++;
            fp = malloc(sizeof(struct flist));
@@ -921,9 +906,7 @@ quiet_bigdef(int attacker, struct emp_qelem *list, natid own, natid aown,
            fp->type = targ_land;
            add_to_fired_queue(&fp->queue, list);
            nreport(firing.sct_own, N_FIRE_BACK, player->cnum, 1);
-           if (gun > 7)
-               gun = 7;
-           dam += landgun((int)firing.sct_effic, gun);
+           dam += dam2;
        }
     }
 
index eb1a15c60ef2a547550d1d84460d422282b251f5..c12c6ad90a221889477b9660d52e6b76e1a63dbf 100644 (file)
@@ -83,7 +83,7 @@ sabo(void)
            continue;
        }
 
-       dam = landgun(3 * land.lnd_effic, 7);
+       dam = fortgun(3 * land.lnd_effic, 7);
        if (sect.sct_item[I_SHELL] > 20)
            dam += seagun(land.lnd_effic,
                          random() % (sect.sct_item[I_SHELL] / 10));
index 5dd8656b382af0f7732950f29185312f71f7d773..e11d7afca172c0ff4bc132558c274b5284d35100 100644 (file)
@@ -181,9 +181,7 @@ sb(natid att, natid def, struct sctstr *sp, coord tx, coord ty, int noisy,
 {
     int damage;
     natid own;
-    int shell;
-    int range;
-    int range2, gun;
+    int range, range2;
 
     own = sp->sct_own;
     if (own == 0)
@@ -194,18 +192,10 @@ sb(natid att, natid def, struct sctstr *sp, coord tx, coord ty, int noisy,
     range2 = mapdist(sp->sct_x, sp->sct_y, tx, ty);
     if (range < range2)
        return 0;
-    gun = sp->sct_item[I_GUN];
-    if (gun == 0)
-       return 0;
-    shell = sp->sct_item[I_SHELL];
-    if (shell <= 0)
-       shell += supply_commod(sp->sct_own, sp->sct_x, sp->sct_y,
-                              I_SHELL, 1);
-    if (shell <= 0)
-       return 0;
-    sp->sct_item[I_SHELL] = shell - 1;
+    damage = fort_fire(sp);
     putsect(sp);
-    damage = landgun((int)sp->sct_effic, gun);
+    if (damage < 0)
+       return 0;
     if (sp->sct_own != def)
        wu(0, sp->sct_own,
           "%s fired on %s in %s in defense of %s, doing %d damage!\n",
index 6bc37cc4fed5b3c0d6d316f1a5773f0e6718f9ca..87e60cb4ee2b422b356e2b73a7f2a4bad4e4d984 100644 (file)
@@ -41,7 +41,7 @@
 #include "ship.h"
 
 double
-landgun(int effic, int guns)
+fortgun(int effic, int guns)
 {
     double d;
     double g = MIN(guns, 7);
@@ -77,6 +77,30 @@ landunitgun(int effic, int shots, int guns, int ammo, int shells)
     return d;
 }
 
+/*
+ * Fire from fortress SP.
+ * Use ammo, resupply if necessary.
+ * Return damage if the fortress fires, else -1.
+ */
+int
+fort_fire(struct sctstr *sp)
+{
+    int guns = sp->sct_item[I_GUN];
+    int shells;
+
+    if (sp->sct_type != SCT_FORTR || sp->sct_effic < FORTEFF)
+       return -1;
+    if (sp->sct_item[I_MILIT] < 5 || guns == 0)
+       return -1;
+    shells = sp->sct_item[I_SHELL];
+    shells += supply_commod(sp->sct_own, sp->sct_x, sp->sct_y,
+                           I_SHELL, 1 - shells);
+    if (shells == 0)
+       return -1;
+    sp->sct_item[I_SHELL] = shells - 1;
+    return (int)fortgun(sp->sct_effic, guns);
+}
+
 /*
  * Return effective firing range for range factor RNG at tech TLEV.
  */
index d7d895e5ffd770840710436f43f5d94ddf55358b..e984c52677eddfb14d8634d706d5fd56de9e37cb 100644 (file)
@@ -846,28 +846,14 @@ lnd_fort_interdiction(struct emp_qelem *list,
            continue;
        if (getrel(getnatp(fsect.sct_own), victim) >= NEUTRAL)
            continue;
-       gun = fsect.sct_item[I_GUN];
-       if (gun < 1)
-           continue;
        range = roundrange(fortrange(&fsect));
        trange = mapdist(newx, newy, fsect.sct_x, fsect.sct_y);
        if (trange > range)
            continue;
-       if (fsect.sct_item[I_MILIT] < 5)
-           continue;
-       shell = fsect.sct_item[I_SHELL];
-       if (shell < 1)
-           shell += supply_commod(fsect.sct_own, fsect.sct_x, fsect.sct_y,
-                                  I_SHELL, 1);
-       if (shell < 1)
-           continue;
-       shell--;
-       fsect.sct_item[I_SHELL] = shell;
+       dam = fort_fire(&fsect);
        putsect(&fsect);
-       if (gun > 7)
-           gun = 7;
-       guneff = landgun((int)fsect.sct_effic, gun);
-       dam = (int)guneff;
+       if (dam < 0)
+           continue;
        totdam += dam;
        mpr(victim, "Incoming fire does %d damage!\n", dam);
        wu(0, fsect.sct_own,
index bed6d02f06111b93e998f90da29c101e4c4ab108..0691a58d27e2c5d2cb6a2253e5c9d0e3759f8e62 100644 (file)
@@ -587,8 +587,6 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy,
     struct nstr_sect ns;
     struct sctstr fsect;
     int trange, range;
-    double guneff;
-    int shell, gun;
     int dam;
     int totdam = 0;
     signed char notified[MAXNOC];
@@ -625,28 +623,14 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy,
     while (nxtsct(&ns, &fsect)) {
        if (!notified[fsect.sct_own])
            continue;
-       gun = fsect.sct_item[I_GUN];
-       if (gun < 1)
-           continue;
        range = roundrange(fortrange(&fsect));
        trange = mapdist(newx, newy, fsect.sct_x, fsect.sct_y);
        if (trange > range)
            continue;
-       if (fsect.sct_item[I_MILIT] < 5)
-           continue;
-       shell = fsect.sct_item[I_SHELL];
-       if (shell < 1)
-           shell += supply_commod(fsect.sct_own, fsect.sct_x, fsect.sct_y,
-                                  I_SHELL, 1);
-       if (shell < 1)
-           continue;
-       shell--;
-       fsect.sct_item[I_SHELL] = shell;
+       dam = fort_fire(&fsect);
        putsect(&fsect);
-       if (gun > 7)
-           gun = 7;
-       guneff = landgun((int)fsect.sct_effic, gun);
-       dam = (int)guneff;
+       if (dam < 0)
+           continue;
        totdam += dam;
        mpr(victim, "Incoming fire does %d damage!\n", dam);
 /*