]> git.pond.sub.org Git - empserver/commitdiff
Pilots and air cargo now spread the plague
authorMarkus Armbruster <armbru@pond.sub.org>
Sat, 30 Jun 2012 15:09:24 +0000 (17:09 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Fri, 13 Jul 2012 18:15:33 +0000 (20:15 +0200)
Planes flying one-way with crew or cargo spread plague from their old
base to their new base.  Planes dropping cargo spread plague from
their base to the drop's target sector.

include/plane.h
info/Plague.t
src/lib/commands/laun.c
src/lib/subs/aircombat.c
src/lib/subs/mission.c
src/lib/subs/mslsub.c
src/lib/subs/plnsub.c

index 3dfe4fa3aa3c14b297412048567fa753b5d3164a..8b5d00348674d2136f2ab6d3efcc1120cd5eb97e 100644 (file)
@@ -30,7 +30,7 @@
  *     Dave Pare, 1986
  *     Ken Stevens, 1995
  *     Steve McClure, 1998
- *     Markus Armbruster, 2004-2010
+ *     Markus Armbruster, 2004-2012
  */
 
 #ifndef PLANE_H
@@ -125,6 +125,7 @@ struct plchrstr {
 struct plist {
     struct emp_qelem queue;    /* list of planes */
     int load;                  /* number of bombs or items carried */
+    short pstage;              /* plague stage */
     struct plchrstr *pcp;      /* pointer to desc of plane */
     struct plnstr plane;       /* struct plane */
 };
index be868afc8d14be78c72555240cf027dc30dc01d6..0e8e4099df05c6906eb9eedeaf722e9620ace62c 100644 (file)
@@ -97,11 +97,12 @@ has been spotted.
 .s1
 This includes preventing any loading and unloading of ships and land
 units (since they can, of course, carry plague), explorations out of the
-sector, moving commodities out of the sector, distribution or
-delivery, etc.  Basically, any people or commodities
+sector, moving commodities out of the sector, even by air,
+distribution or delivery, etc.  Basically, any people or commodities
 that originate from a sector, ship or land unit actively battling
 plague will cause the destination sector, ship or land unit to become
 infected.
+Beware, "people" includes pilots.
 .s1
 Once an outbreak has been spotted, the plague takes on an infectious
 state at the next update.  There is very little time to isolate the
index 8f6b58f016f284e8bac5c43917525c20a90076c0..b422d7bd615c2651135e59b6b2f62ddadd25432c 100644 (file)
@@ -30,7 +30,7 @@
  *     Dave Pare, 1986
  *     Ken Stevens, 1995
  *     Steve McClure, 1998-2000
- *     Markus Armbruster, 2005-2011
+ *     Markus Armbruster, 2005-2012
  */
 
 #include <config.h>
@@ -42,6 +42,7 @@
 #include "nuke.h"
 #include "optlist.h"
 #include "path.h"
+#include "plague.h"
 #include "plane.h"
 #include "ship.h"
 
@@ -355,6 +356,7 @@ msl_equip(struct plnstr *pp, char mission)
     struct plist pl;
 
     pl.load = 0;
+    pl.pstage = PLG_HEALTHY;
     pl.pcp = plchr + pp->pln_type;
     pl.plane = *pp;
     emp_initque(&pl.queue);
index e35598c27a49e746baae40de5e36c8261a652d98..f701ffa5b2cef9a99dac872b211a620b2f5db8fe 100644 (file)
@@ -30,7 +30,7 @@
  *     Dave Pare, 1986
  *     Thomas Ruschak, 1992
  *     Steve McClure, 1996
- *     Markus Armbruster, 2006-2011
+ *     Markus Armbruster, 2006-2012
  */
 
 #include <config.h>
@@ -45,6 +45,7 @@
 #include "nsc.h"
 #include "optlist.h"
 #include "path.h"
+#include "plague.h"
 #include "plane.h"
 #include "player.h"
 #include "prototypes.h"
@@ -784,6 +785,7 @@ getilists(struct emp_qelem *list, unsigned char *rel, natid intruder)
        /* got one! */
        ip = malloc(sizeof(*ip));
        ip->load = 0;
+       ip->pstage = PLG_HEALTHY;
        ip->pcp = &plchr[(int)plane.pln_type];
        ip->plane = plane;
        emp_insque(&ip->queue, &list[plane.pln_own]);
index 75fe7c1a214ef849e6f982207003e2e59b082b0d..be625af4d6cfaa7bd08aec549c7a201ee462607c 100644 (file)
@@ -29,7 +29,7 @@
  *  Known contributors to this file:
  *     Ken Stevens, 1995
  *     Steve McClure, 1996-2000
- *     Markus Armbruster, 2003-2011
+ *     Markus Armbruster, 2003-2012
  */
 
 #include <config.h>
@@ -44,6 +44,7 @@
 #include "nsc.h"
 #include "optlist.h"
 #include "path.h"
+#include "plague.h"
 #include "prototypes.h"
 #include "queue.h"
 #include "xy.h"
@@ -330,6 +331,7 @@ find_escorts(coord x, coord y, natid cn, struct emp_qelem *escorts)
            continue;
        plp = malloc(sizeof(struct plist));
        plp->load = 0;
+       plp->pstage = PLG_HEALTHY;
        plp->pcp = &plchr[(int)plane.pln_type];
        plp->plane = plane;
        emp_insque(&plp->queue, escorts);
@@ -372,6 +374,7 @@ perform_mission(coord x, coord y, natid victim, struct emp_qelem *list,
                /* save planes for later */
                plp = malloc(sizeof(struct plist));
                plp->load = 0;
+               plp->pstage = PLG_HEALTHY;
                plp->pcp = pcp;
                memcpy(&plp->plane, glp->thing, sizeof(struct plnstr));
                if (plp->pcp->pl_flags & P_M)
@@ -893,12 +896,15 @@ mission_pln_equip(struct plist *plp, struct ichrstr *ip, char mission)
     pcp = plp->pcp;
     if (pp->pln_ship >= 0) {
        getship(pp->pln_ship, &ship);
+       plp->pstage = ship.shp_pstage;
        item = ship.shp_item;
     } else if (pp->pln_land >= 0) {
        getland(pp->pln_land, &land);
+       plp->pstage = land.lnd_pstage;
        item = land.lnd_item;
     } else {
        getsect(pp->pln_x, pp->pln_y, &sect);
+       plp->pstage = sect.sct_pstage;
        item = sect.sct_item;
     }
     if (pcp->pl_fuel > item[I_PETROL]) {
index 949afb1f6549c22b670e1adf3bfc38b7ddd05bb1..3d7454a2cc3ec8da24d11fb77dde811c0e6124eb 100644 (file)
@@ -29,7 +29,7 @@
  *  Known contributors to this file:
  *     Ken Stevens, 1995
  *     Steve McClure, 1996-2000
- *     Markus Armbruster, 2004-2010
+ *     Markus Armbruster, 2004-2012
  */
 
 #include <config.h>
@@ -42,6 +42,7 @@
 #include "nsc.h"
 #include "nuke.h"
 #include "optlist.h"
+#include "plague.h"
 #include "plane.h"
 #include "prototypes.h"
 #include "queue.h"
@@ -224,6 +225,7 @@ msl_sel(struct emp_qelem *list, coord x, coord y, natid victim,
        /* got a valid interceptor */
        irv = malloc(sizeof(*irv));
        irv->load = 0;
+       irv->pstage = PLG_HEALTHY;
        irv->pcp = &plchr[(int)plane.pln_type];
        irv->plane = plane;
        emp_insque(&irv->queue, list);
index 24aa56fdafe563b6bee80273ec9c68a9f87e0804..93f0074f43519d0a1fa50897da77802ab4beb968 100644 (file)
@@ -45,6 +45,7 @@
 #include "nsc.h"
 #include "nuke.h"
 #include "optlist.h"
+#include "plague.h"
 #include "plane.h"
 #include "player.h"
 #include "prototypes.h"
@@ -236,6 +237,9 @@ pln_newlanding(struct emp_qelem *list, coord tx, coord ty, int cno)
                       cname(player->cnum), prplane(&plp->plane),
                       prship(&ship));
                }
+               if (plp->pcp->pl_crew && plp->pstage == PLG_INFECT
+                   && ship.shp_pstage == PLG_HEALTHY)
+                   ship.shp_pstage = PLG_EXPOSED;
            }
        } else {
            plp->plane.pln_x = tx;
@@ -247,6 +251,9 @@ pln_newlanding(struct emp_qelem *list, coord tx, coord ty, int cno)
                   cname(player->cnum),
                   prplane(&plp->plane), xyas(tx, ty, sect.sct_own));
            }
+           if (plp->pcp->pl_crew && plp->pstage == PLG_INFECT
+               && sect.sct_pstage == PLG_HEALTHY)
+               sect.sct_pstage = PLG_EXPOSED;
            plp->plane.pln_ship = cno;
        }
     }
@@ -263,14 +270,10 @@ pln_dropoff(struct emp_qelem *list, struct ichrstr *ip, coord tx, coord ty,
     struct shpstr ship;
     int there;
     int max;
+    int pstage;
 
     if (!ip)
        return;
-    amt = 0;
-    for (qp = list->q_forw; qp != list; qp = qp->q_forw) {
-       plp = (struct plist *)qp;
-       amt += plp->load;
-    }
     if (cno < 0) {
        getsect(tx, ty, &sect);
        if (!sect.sct_own) {
@@ -292,11 +295,23 @@ pln_dropoff(struct emp_qelem *list, struct ichrstr *ip, coord tx, coord ty,
        }
        there = sect.sct_item[ip->i_uid];
        max = ITEM_MAX;
+       pstage = sect.sct_pstage;
     } else {
        getship(cno, &ship);
        there = ship.shp_item[ip->i_uid];
        max = mchr[ship.shp_type].m_item[ip->i_uid];
+       pstage = ship.shp_pstage;
+    }
+
+    amt = 0;
+    for (qp = list->q_forw; qp != list; qp = qp->q_forw) {
+       plp = (struct plist *)qp;
+       amt += plp->load;
+       if (plp->load
+           && plp->pstage == PLG_INFECT && pstage == PLG_HEALTHY)
+           pstage = PLG_EXPOSED;
     }
+
     there += amt;
     if (there > max) {
        pr("%d excess %s discarded\n", there - max, ip->i_name);
@@ -306,6 +321,7 @@ pln_dropoff(struct emp_qelem *list, struct ichrstr *ip, coord tx, coord ty,
     pr("%d %s landed safely", amt, ip->i_name);
     if (cno < 0) {
        sect.sct_item[ip->i_uid] = there;
+       sect.sct_pstage = pstage;
        if (sect.sct_own != player->cnum)
            wu(0, sect.sct_own, "%s planes drop %d %s in %s\n",
               cname(player->cnum), amt, ip->i_name,
@@ -314,6 +330,7 @@ pln_dropoff(struct emp_qelem *list, struct ichrstr *ip, coord tx, coord ty,
        putsect(&sect);
     } else {
        ship.shp_item[ip->i_uid] = there;
+       ship.shp_pstage = pstage;
        if (ship.shp_own != player->cnum)
            wu(0, ship.shp_own, "%s planes land %d %s on carrier %d\n",
               cname(player->cnum), amt, ip->i_name, ship.shp_uid);
@@ -576,6 +593,7 @@ pln_sel(struct nstr_item *ni, struct emp_qelem *list, struct sctstr *ap,
        putplane(plane.pln_uid, &plane);
        plp = malloc(sizeof(struct plist));
        plp->load = 0;
+       plp->pstage = PLG_HEALTHY;
        plp->pcp = pcp;
        plp->plane = plane;
        emp_insque(&plp->queue, list);
@@ -626,14 +644,17 @@ pln_equip(struct plist *plp, struct ichrstr *ip, char mission)
     pcp = plp->pcp;
     if (pp->pln_ship >= 0) {
        getship(pp->pln_ship, &ship);
+       plp->pstage = ship.shp_pstage;
        item = ship.shp_item;
        own = ship.shp_own;
     } else if (pp->pln_land >= 0) {
        getland(pp->pln_land, &land);
+       plp->pstage = land.lnd_pstage;
        item = land.lnd_item;
        own = land.lnd_own;
     } else {
        getsect(pp->pln_x, pp->pln_y, &sect);
+       plp->pstage = sect.sct_pstage;
        item = sect.sct_item;
        own = sect.sct_oldown;
     }