2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
23 * related information and legal notices. It is expected that any future
24 * projects/authors will amend these files as needed.
28 * plague.c: Plague related functions
30 * Known contributors to this file:
31 * Steve McClure, 1998-2000
51 do_plague(struct sctstr *sp, struct natstr *np, int etu)
57 if (opt_NO_PLAGUE) /* no plague nothing to do */
60 if (getvec(VT_ITEM, vec, (s_char *)sp, EF_SECTOR) <= 0)
62 if (getvec(VT_COND, cvec, (s_char *)sp, EF_SECTOR) <= 0)
63 bzero((s_char *)cvec, sizeof(cvec));
65 if (cvec[C_PSTAGE] == 0) {
66 cvec[C_PSTAGE] = infect_people(np, vec, sp->sct_effic,
67 (int)sp->sct_mobil, sp);
70 n = plague_people(np, vec, cvec, etu);
73 wu(0, sp->sct_own, "PLAGUE deaths reported in %s.\n",
75 nreport(sp->sct_own, N_DIE_PLAGUE, 0, 1);
78 wu(0, sp->sct_own, "%s battling PLAGUE\n", ownxy(sp));
81 /* Are we still incubating? */
82 if (n == cvec[C_PSTAGE]) {
83 /* Yes. Will it turn "infectious" next time? */
84 if (cvec[C_PTIME] <= etu) {
85 /* Yes. Report an outbreak. */
87 "Outbreak of PLAGUE in %s!\n",
89 nreport(sp->sct_own, N_OUT_PLAGUE, 0, 1);
92 /* It has already moved on to "infectious" */
93 wu(0, sp->sct_own, "%s battling PLAGUE\n", ownxy(sp));
97 /* Has the plague moved to "incubation" yet? */
98 if (n != cvec[C_PSTAGE]) {
99 /* Yes. Will it turn "infectious" next time? */
100 if (cvec[C_PTIME] <= etu) {
101 /* Yes. Report an outbreak. */
103 "Outbreak of PLAGUE in %s!\n",
105 nreport(sp->sct_own, N_OUT_PLAGUE, 0, 1);
113 if (vec[I_CIVIL] == 0 && vec[I_MILIT] == 0 &&
114 !has_units(sp->sct_x,sp->sct_y,sp->sct_own,0)) {
115 makelost(EF_SECTOR, sp->sct_own, 0, sp->sct_x, sp->sct_y);
119 putvec(VT_ITEM, vec, (s_char *)sp, EF_SECTOR);
120 putvec(VT_COND, cvec, (s_char *)sp, EF_SECTOR);
125 infect_people(struct natstr *np, register int *vec, u_int eff, int mobil, struct sctstr *sp)
130 double civvies = 999.0;
132 if (opt_NO_PLAGUE) /* no plague nothing to do */
135 if (np->nat_level[NAT_TLEV] <= 10.0)
138 if (opt_BIG_CITY && (sp->sct_type == SCT_CAPIT))
142 * make plague where there was none before...
144 plg_num = ((vec[I_CIVIL] + vec[I_MILIT] + vec[I_UW]) / civvies) *
145 ((vec[I_IRON] + vec[I_OIL] + (vec[I_RAD] * 2)) / 10.0 +
146 np->nat_level[NAT_TLEV] + 100.0);
147 plg_denom = eff + mobil + 100 + np->nat_level[NAT_RLEV];
148 plg_chance = ((plg_num / plg_denom) - 1.0) * 0.01;
149 if (chance(plg_chance))
155 * Given the fact that plague exists, kill off
156 * people if in plague state DYING. Increment
157 * the plague time. Return "current" plague
158 * stage. No reports generated here anymore.
161 plague_people(struct natstr *np, register int *vec, register int *cvec, int etus)
168 if (opt_NO_PLAGUE) /* no plague nothing to do */
170 cvec[C_PTIME] -= etus;
171 stage = cvec[C_PSTAGE];
174 plg_num = 100.0 * etus;
175 plg_denom = (np->nat_level[NAT_RLEV] + 100.0) *
176 (vec[C_PTIME] + etus + 1.0);
177 pct_left = 1.0 - (double)(plg_num / plg_denom);
180 vec[I_CIVIL] = vec[I_CIVIL] * pct_left;
181 vec[I_MILIT] = vec[I_MILIT] * pct_left;
182 vec[I_UW] = vec[I_UW] * pct_left;
195 if (cvec[C_PTIME] <= 0) {
197 cvec[C_PTIME] = (etus / 2) + (random() % etus);