From 612ec6257dfbb1497eabadbdcb64c17f76c5c8c6 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 30 Jun 2012 17:09:24 +0200 Subject: [PATCH] Pilots and air cargo now spread the plague 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 | 3 ++- info/Plague.t | 5 +++-- src/lib/commands/laun.c | 4 +++- src/lib/subs/aircombat.c | 4 +++- src/lib/subs/mission.c | 8 +++++++- src/lib/subs/mslsub.c | 4 +++- src/lib/subs/plnsub.c | 31 ++++++++++++++++++++++++++----- 7 files changed, 47 insertions(+), 12 deletions(-) diff --git a/include/plane.h b/include/plane.h index 3dfe4fa3..8b5d0034 100644 --- a/include/plane.h +++ b/include/plane.h @@ -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 */ }; diff --git a/info/Plague.t b/info/Plague.t index be868afc..0e8e4099 100644 --- a/info/Plague.t +++ b/info/Plague.t @@ -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 diff --git a/src/lib/commands/laun.c b/src/lib/commands/laun.c index 8f6b58f0..b422d7bd 100644 --- a/src/lib/commands/laun.c +++ b/src/lib/commands/laun.c @@ -30,7 +30,7 @@ * Dave Pare, 1986 * Ken Stevens, 1995 * Steve McClure, 1998-2000 - * Markus Armbruster, 2005-2011 + * Markus Armbruster, 2005-2012 */ #include @@ -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); diff --git a/src/lib/subs/aircombat.c b/src/lib/subs/aircombat.c index e35598c2..f701ffa5 100644 --- a/src/lib/subs/aircombat.c +++ b/src/lib/subs/aircombat.c @@ -30,7 +30,7 @@ * Dave Pare, 1986 * Thomas Ruschak, 1992 * Steve McClure, 1996 - * Markus Armbruster, 2006-2011 + * Markus Armbruster, 2006-2012 */ #include @@ -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]); diff --git a/src/lib/subs/mission.c b/src/lib/subs/mission.c index 75fe7c1a..be625af4 100644 --- a/src/lib/subs/mission.c +++ b/src/lib/subs/mission.c @@ -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 @@ -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, §); + plp->pstage = sect.sct_pstage; item = sect.sct_item; } if (pcp->pl_fuel > item[I_PETROL]) { diff --git a/src/lib/subs/mslsub.c b/src/lib/subs/mslsub.c index 949afb1f..3d7454a2 100644 --- a/src/lib/subs/mslsub.c +++ b/src/lib/subs/mslsub.c @@ -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 @@ -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); diff --git a/src/lib/subs/plnsub.c b/src/lib/subs/plnsub.c index 24aa56fd..93f0074f 100644 --- a/src/lib/subs/plnsub.c +++ b/src/lib/subs/plnsub.c @@ -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, §); 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(§); } 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, §); + plp->pstage = sect.sct_pstage; item = sect.sct_item; own = sect.sct_oldown; }