]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/detonate.c
Update copyright notice.
[empserver] / src / lib / subs / detonate.c
index 5036fa0b118447d58558d253522e82093d93db8d..7d56c11c416a9ad3b586e8c8df4e62640d9509a4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2005, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2007, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                           Ken Stevens, Steve McClure
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -19,9 +19,9 @@
  *
  *  ---
  *
- *  See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- *  related information and legal notices. It is expected that any future
- *  projects/authors will amend these files as needed.
+ *  See files README, COPYING and CREDITS in the root of the source
+ *  tree for related information and legal notices.  It is expected
+ *  that future projects/authors will amend these files as needed.
  *
  *  ---
  *
 
 #include <config.h>
 
-#include "misc.h"
-#include "player.h"
-#include "xy.h"
-#include "nat.h"
 #include "file.h"
-#include "sect.h"
-#include "nuke.h"
-#include "ship.h"
 #include "land.h"
+#include "lost.h"
+#include "misc.h"
+#include "nat.h"
 #include "news.h"
-#include "plane.h"
 #include "nsc.h"
+#include "nuke.h"
 #include "optlist.h"
+#include "plane.h"
+#include "player.h"
 #include "prototypes.h"
+#include "sect.h"
+#include "ship.h"
+#include "xy.h"
 
 static void kaboom(int x, int y, int rad, natid cn);
 
 int
-detonate(struct plnstr *pp, int x, int y)
+detonate(struct nukstr *np, coord x, coord y, int airburst)
 {
-    int nuketype = pp->pln_nuketype;
-    natid bombown = pp->pln_own;
-    int airburst = (pp->pln_flags & PLN_AIRBURST);
+    int nuketype = np->nuk_type;
+    natid bombown = np->nuk_own;
     struct nchrstr *ncp;
     struct plnstr plane;
     struct sctstr sect;
     struct shpstr ship;
     struct lndstr land;
     struct nukstr nuke;
-    s_char *bp;
-    s_char buf[128];
-    s_char buf2[128];
+    char *bp;
+    char buf[128];
+    char buf2[128];
     natid own;
     int type;
     int damage;
@@ -72,18 +72,19 @@ detonate(struct plnstr *pp, int x, int y)
     int rad;
     struct nstr_sect ns;
     struct nstr_item ni;
-    int issea = 0;
+    int issea;
     int retval;
 
-    pp->pln_nuketype = -1;
     getsect(x, y, &sect);
-    if (sect.sct_type == SCT_WATER)
-       issea = 1;
+    issea = sect.sct_type == SCT_WATER;
     ncp = &nchr[nuketype];
     kaboom(x, y, ncp->n_blast, bombown);
     rad = ncp->n_blast;
     if (!airburst)
        rad = rad * 2 / 3;
+    np->nuk_effic = 0;
+    putnuke(np->nuk_uid, np);
+
     snxtsct_dist(&ns, x, y, rad);
     while (nxtsct(&ns, &sect)) {
        /* Nukes falling on water affect only 1 sector */
@@ -113,7 +114,7 @@ detonate(struct plnstr *pp, int x, int y)
                fallout += damage * 30;
            else
                fallout += damage * 3;
-           sect.sct_fallout = min(fallout, FALLOUT_MAX);
+           sect.sct_fallout = MIN(fallout, FALLOUT_MAX);
        }
        if (damage > 100) {
            makelost(EF_SECTOR, sect.sct_own, 0, sect.sct_x, sect.sct_y);
@@ -146,6 +147,7 @@ detonate(struct plnstr *pp, int x, int y)
            mpr(own, "%s nuclear device %s\n", cname(bombown), buf2);
        }
     }
+
     snxtitem_dist(&ni, EF_PLANE, x, y, rad);
     while (nxtitem(&ni, &plane)) {
        /* Nukes falling on water affect only 1 sector */
@@ -190,13 +192,13 @@ detonate(struct plnstr *pp, int x, int y)
                xyas(plane.pln_x, plane.pln_y, own), damage);
        } else {
            if (own != 0)
-               mpr(own,
-                   "%s nuclear device did %d%% damage to %s at %s\n",
+               mpr(own, "%s nuclear device did %d%% damage to %s at %s\n",
                    cname(bombown), damage,
                    prplane(&plane), xyas(plane.pln_x, plane.pln_y, own));
        }
        putplane(ni.cur, &plane);
     }
+
     snxtitem_dist(&ni, EF_LAND, x, y, rad);
     while (nxtitem(&ni, &land)) {
        /* Nukes falling on water affect only 1 sector */
@@ -244,6 +246,7 @@ detonate(struct plnstr *pp, int x, int y)
        }
        putland(land.lnd_uid, &land);
     }
+
     snxtitem_dist(&ni, EF_SHIP, x, y, rad);
     while (nxtitem(&ni, &ship)) {
        /* Nukes falling on water affect only 1 sector */
@@ -285,6 +288,7 @@ detonate(struct plnstr *pp, int x, int y)
        }
        putship(ship.shp_uid, &ship);
     }
+
     snxtitem_dist(&ni, EF_NUKE, x, y, rad);
     while (nxtitem(&ni, &nuke)) {
        /* Nukes falling on water affect only 1 sector */
@@ -298,19 +302,18 @@ detonate(struct plnstr *pp, int x, int y)
            continue;
        if (roll(100) >= damage)
            continue;
-       makelost(EF_NUKE, nuke.nuk_own, nuke.nuk_uid, nuke.nuk_x,
-                nuke.nuk_y);
-       nuke.nuk_own = 0;
+       nuke.nuk_effic = 0;
        if (own == bombown) {
-           mpr(bombown, "nuclear stockpile #%d at %s destroyed\n",
-               ni.cur, xyas(nuke.nuk_x, nuke.nuk_y, own));
+           mpr(bombown, "%s at %s destroyed\n",
+               prnuke(&nuke), xyas(nuke.nuk_x, nuke.nuk_y, own));
        } else {
            if (own != 0)
-               mpr(own, "nuclear stockpile #%d at %s destroyed\n",
-                   ni.cur, xyas(nuke.nuk_x, nuke.nuk_y, own));
+               mpr(own, "%s at %s destroyed\n",
+                   prnuke(&nuke), xyas(nuke.nuk_x, nuke.nuk_y, own));
        }
        putnuke(ni.cur, &nuke);
     }
+
     return retval;
 }