]> git.pond.sub.org Git - empserver/blobdiff - src/lib/update/plague.c
Update copyright notice
[empserver] / src / lib / update / plague.c
index f1188f73f79b39f81ac3db3046569f43dbbdaf5e..d0d739ae17b2ca5a69cea3dd03c106389694fa8e 100644 (file)
@@ -1,11 +1,11 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
- *                           Ken Stevens, Steve McClure
+ *  Copyright (C) 1986-2020, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *                Ken Stevens, Steve McClure, Markus Armbruster
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  Empire is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  *  ---
  *
  *  ---
  *
  *  plague.c: Plague related functions
- * 
+ *
  *  Known contributors to this file:
  *     Steve McClure, 1998-2000
+ *     Markus Armbruster, 2004-2016
  */
 
 #include <config.h>
 
+#include "chance.h"
 #include "item.h"
-#include "lost.h"
+#include "optlist.h"
+#include "nat.h"
 #include "news.h"
 #include "plague.h"
+#include "prototypes.h"
+#include "sect.h"
 #include "update.h"
 
 static int infect_people(struct natstr *, struct sctstr *);
 
 void
-do_plague(struct sctstr *sp, struct natstr *np, int etu)
+do_plague(struct sctstr *sp, int etu)
 {
+    struct natstr *np = getnatp(sp->sct_own);
     int pstage, ptime;
     int n;
 
@@ -58,52 +63,11 @@ do_plague(struct sctstr *sp, struct natstr *np, int etu)
        ptime = 0;
     } else {
        n = plague_people(np, sp->sct_item, &pstage, &ptime, etu);
-       switch (n) {
-       case PLG_DYING:
-           wu(0, sp->sct_own, "PLAGUE deaths reported in %s.\n",
-              ownxy(sp));
-           nreport(sp->sct_own, N_DIE_PLAGUE, 0, 1);
-           break;
-       case PLG_INFECT:
-           wu(0, sp->sct_own, "%s battling PLAGUE\n", ownxy(sp));
-           break;
-       case PLG_INCUBATE:
-           /* Are we still incubating? */
-           if (n == pstage) {
-               /* Yes. Will it turn "infectious" next time? */
-               if (ptime <= etu) {
-                   /* Yes.  Report an outbreak. */
-                   wu(0, sp->sct_own,
-                      "Outbreak of PLAGUE in %s!\n", ownxy(sp));
-                   nreport(sp->sct_own, N_OUT_PLAGUE, 0, 1);
-               }
-           } else {
-               /* It has already moved on to "infectious" */
-               wu(0, sp->sct_own, "%s battling PLAGUE\n", ownxy(sp));
-           }
-           break;
-       case PLG_EXPOSED:
-           /* Has the plague moved to "incubation" yet? */
-           if (n != pstage) {
-               /* Yes. Will it turn "infectious" next time? */
-               if (ptime <= etu) {
-                   /* Yes.  Report an outbreak. */
-                   wu(0, sp->sct_own,
-                      "Outbreak of PLAGUE in %s!\n", ownxy(sp));
-                   nreport(sp->sct_own, N_OUT_PLAGUE, 0, 1);
-               }
-           }
-           break;
-       default:
-           break;
-       }
-    }
-    if (sp->sct_item[I_CIVIL] == 0 && sp->sct_item[I_MILIT] == 0
-       && !has_units(sp->sct_x, sp->sct_y, sp->sct_own, 0)) {
-       makelost(EF_SECTOR, sp->sct_own, 0, sp->sct_x, sp->sct_y);
-       sp->sct_own = 0;
-       sp->sct_oldown = 0;
+       if (n != PLG_HEALTHY)
+           plague_report(sp->sct_own, n, pstage, ptime, etu,
+                         "in", ownxy(sp));
     }
+
     sp->sct_pstage = pstage;
     sp->sct_ptime = ptime;
 }
@@ -138,14 +102,13 @@ infect_people(struct natstr *np, struct sctstr *sp)
 
 /*
  * Given the fact that plague exists, kill off
- * people if in plague state DYING.  Increment
+ * people if in plague state PLG_DYING.  Increment
  * the plague time.  Return "current" plague
  * stage.  No reports generated here anymore.
  */
 int
 plague_people(struct natstr *np, short *vec,
-             int *pstage, int *ptime,
-             int etus)
+             int *pstage, int *ptime, int etus)
 {
     int stage;
     double plg_num;
@@ -183,7 +146,51 @@ plague_people(struct natstr *np, short *vec,
     }
     if (*ptime <= 0) {
        *pstage -= 1;
-       *ptime = etus / 2 + random() % etus;
+       *ptime = etus / 2 + roll0(etus);
     }
     return stage;
 }
+
+void
+plague_report(natid victim, int new_pstage, int pstage, int ptime,
+             int etus, char *in_on, char *place)
+{
+    switch (new_pstage) {
+    case PLG_DYING:
+       wu(0, victim, "PLAGUE deaths reported %s %s\n", in_on, place);
+       nreport(victim, N_DIE_PLAGUE, 0, 1);
+       break;
+    case PLG_INFECT:
+       wu(0, victim, "%s battling PLAGUE\n", place);
+       break;
+    case PLG_INCUBATE:
+       /* Are we still incubating? */
+       if (new_pstage == pstage) {
+           /* Yes. Will it turn "infectious" next time? */
+           if (ptime <= etus) {
+               /* Yes.  Report an outbreak. */
+               wu(0, victim,
+                  "Outbreak of PLAGUE %s %s!\n", in_on, place);
+               nreport(victim, N_OUT_PLAGUE, 0, 1);
+           }
+       } else {
+           /* It has already moved on to "infectious" */
+           wu(0, victim, "%s battling PLAGUE\n", place);
+       }
+       break;
+    case PLG_EXPOSED:
+       /* Has the plague moved to "incubation" yet? */
+       if (new_pstage != pstage) {
+           /* Yes. Will it turn "infectious" next time? */
+           if (ptime <= etus) {
+               /* Yes.  Report an outbreak. */
+               wu(0, victim,
+                  "Outbreak of PLAGUE %s %s!\n", in_on, place);
+               nreport(victim, N_OUT_PLAGUE, 0, 1);
+           }
+       }
+       break;
+    default:
+       break;
+    }
+}