/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
*
* ---
*
- * 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.
*
* ---
*
* Steve McClure, 1996
*/
-#include <math.h>
+#include <config.h>
+
#include "misc.h"
-#include "var.h"
#include "sect.h"
#include "nat.h"
#include "item.h"
-#include "news.h"
#include "file.h"
#include "xy.h"
#include "path.h"
#include "product.h"
-#include "distribute.h"
#include "optlist.h"
#include "budg.h"
#include "player.h"
#include "lost.h"
#include "gen.h"
-void
-dodeliver(struct sctstr *sp)
-{
- register int i;
- int thresh;
- int dir;
- int plague;
- int n;
-
- if (sp->sct_mobil <= 0)
- return;
- plague = sp->sct_pstage;
- for (i = 1; i <= I_MAX; i++) {
- if (sp->sct_del[i] == 0)
- continue;
- thresh = sp->sct_del[i] & ~0x7;
- dir = sp->sct_del[i] & 0x7;
- n = deliver(sp, &ichr[i], dir, thresh, sp->sct_item[i], plague);
- if (n > 0) {
- sp->sct_item[i] -= n;
- if (sp->sct_mobil <= 0)
- break;
- }
- }
-}
-
/*
* Increase sector efficiency if old type == new type.
* decrease sector efficiency if old type != new type.
* Return amount of work used.
*/
static int
-upd_buildeff(struct natstr *np, register struct sctstr *sp, int *workp,
+upd_buildeff(struct natstr *np, struct sctstr *sp, int *workp,
short *vec, int etu, int *desig, int sctwork, int *cost)
{
- register int work_cost = 0;
- int buildeff_work = (int)(*workp / 2);
+ int work_cost = 0;
+ int buildeff_work = *workp / 2;
int n, hcms, lcms, neweff;
u_char old_type = *desig;
}
neweff = n;
*cost += work_cost;
- if (opt_BIG_CITY) {
- if (!n && dchr[old_type].d_pkg == UPKG &&
- dchr[*desig].d_pkg != UPKG) {
- int maxpop = max_pop(np->nat_level[NAT_RLEV], sp);
- if (vec[I_CIVIL] > maxpop)
- vec[I_CIVIL] = maxpop;
- if (vec[I_UW] > maxpop)
- vec[I_UW] = maxpop;
- *workp = (vec[I_CIVIL] * sctwork) / 100.0
- + (vec[I_MILIT] * 2 / 5.0) + vec[I_UW];
- *workp = roundavg((etu * (*workp)) / 100.0);
-
- buildeff_work = min((int)(*workp / 2), buildeff_work);
- }
+ if (!n && IS_BIG_CITY(old_type) &&
+ !IS_BIG_CITY(*desig)) {
+ int maxpop = max_population(np->nat_level[NAT_RLEV], *desig, n);
+ if (vec[I_CIVIL] > maxpop)
+ vec[I_CIVIL] = maxpop;
+ if (vec[I_UW] > maxpop)
+ vec[I_UW] = maxpop;
+ *workp = (vec[I_CIVIL] * sctwork) / 100.0
+ + (vec[I_MILIT] * 2 / 5.0) + vec[I_UW];
+ *workp = roundavg((etu * (*workp)) / 100.0);
+
+ buildeff_work = MIN((int)(*workp / 2), buildeff_work);
}
}
if (np->nat_priorities[*desig]) {
}
}
}
- *workp = *workp / 2 + buildeff_work;
+ *workp = (*workp + 1) / 2 + buildeff_work;
return neweff;
}
meltitems(int etus, int fallout, int own, short *vec, int type, int x, int y,
int uid)
{
- int n;
+ i_type n;
int melt;
- for (n = 1; n <= I_MAX; n++) {
+ for (n = I_NONE + 1; n <= I_MAX; n++) {
melt = roundavg(vec[n] * etus * (long)fallout
- / (1000.0 * melt_item_denom[n]));
+ / (1000.0 * ichr[n].i_melt_denom));
if (melt > vec[n])
melt = vec[n];
if (melt > 5 && own) {
if (type == EF_SECTOR)
wu(0, own, "Lost %d %s to radiation in %s.\n",
- melt < vec[n] ? melt : vec[n], ichr[n].i_name,
+ melt, ichr[n].i_name,
xyas(x, y, own));
else if (type == EF_LAND)
wu(0, own, "Unit #%d lost %d %s to radiation in %s.\n",
- uid, melt < vec[n] ? melt : vec[n], ichr[n].i_name,
+ uid, melt, ichr[n].i_name,
xyas(x, y, own));
else if (type == EF_SHIP)
wu(0, own, "Ship #%d lost %d %s to radiation in %s.\n",
- uid, melt < vec[n] ? melt : vec[n], ichr[n].i_name,
+ uid, melt, ichr[n].i_name,
xyas(x, y, own));
}
vec[n] -= melt;
}
/*
- * do_fallout - calculate fallout for sectors.
- *
- * This is etu based. But, do limit HUGE kill offs in large ETU
- * games, the melting etus rate is limited to 24 etus.
+ * Do fallout meltdown for sector SP.
+ * ETUS above 24 are treated as 24 to avoid *huge* kill offs in
+ * large ETU games.
*/
-
void
-do_fallout(register struct sctstr *sp, register int etus)
+do_fallout(struct sctstr *sp, int etus)
{
struct shpstr *spp;
struct lndstr *lp;
meltitems(etus, sp->sct_fallout, spp->shp_own, spp->shp_item, EF_SHIP,
spp->shp_x, spp->shp_y, spp->shp_uid);
}
-#ifdef GODZILLA
- if ((sp->sct_fallout > 20) && chance(100))
- do_godzilla(sp);
-#endif /* GODZILLA */
}
void
{
struct sctstr *ap;
int n;
- register int inc;
+ int inc;
if (etus > 24)
etus = 24;
if (ap->sct_type == SCT_SANCT)
continue;
inc = roundavg(etus * fallout_spread * (sp->sct_fallout)) - 1;
-#if 0
- if (sp->sct_fallout) {
- wu(0, 0, "Fallout from sector %d,%d to %d,%d is %d=%d*%e*%d\n",
- sp->sct_x, sp->sct_y, sp->sct_x + diroff[n][0],
- sp->sct_y + diroff[n][1], inc, etus,
- fallout_spread, sp->sct_fallout);
- }
-#endif
if (inc < 0)
inc = 0;
- ap->sct_fallout = min(ap->sct_fallout + inc, FALLOUT_MAX);
+ ap->sct_fallout = MIN(ap->sct_fallout + inc, FALLOUT_MAX);
}
}
decay = roundavg(((decay_per_etu + 6.0) * fallout_spread) *
(double)etus * (double)sp->sct_fallout);
-#if 0
- if (decay || sp->sct_fallout)
- wu(0, 0, "Fallout decay in %d,%d is %d from %d\n", sp->sct_x,
- sp->sct_y, decay, sp->sct_fallout);
-#endif
-
sp->sct_fallout = decay < sp->sct_fallout ? sp->sct_fallout - decay : 0;
}
-#define SHOULD_PRODUCE(sp,t) (((sp->sct_type == t) || (t == -1)) ? 1 : 0)
-
/*
* Produce only a set sector type for a specific nation
* (or all, if sector_type == -1)
produce_sect(int natnum, int etu, int *bp, long int (*p_sect)[2],
int sector_type)
{
- register struct sctstr *sp;
- register struct natstr *np;
+ struct sctstr *sp;
+ struct natstr *np;
short buf[I_MAX + 1];
short *vec;
int work, cost, ecost, pcost, sctwork;
continue;
if (sp->sct_updated != 0)
continue;
- if (!SHOULD_PRODUCE(sp, sector_type))
+ if (sp->sct_type != sector_type && sector_type != -1)
continue;
if ((sp->sct_type == SCT_CAPIT) && (sp->sct_effic > 60)) {