/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2007, 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, 2000
*/
-#include "prototypes.h"
+#include <config.h>
+
+#include "file.h"
#include "misc.h"
-#include "player.h"
-#include "var.h"
-#include "sect.h"
#include "nat.h"
-#include "file.h"
-#include "deity.h"
#include "optlist.h"
-#include "common.h"
-#include "gen.h"
+#include "player.h"
+#include "prototypes.h"
+#include "sect.h"
+
+static int nat_cap(int);
int
init_nats(void)
{
+ static int nstat[] = {
+ /* must match nat_status */
+ 0, VIS, VIS, SANCT, NORM, GOD
+ };
struct natstr *np;
- if ((np = getnatp(player->cnum)) == 0)
+ np = getnatp(player->cnum);
+ if (CANT_HAPPEN(!np))
return -1;
- player->nstat = np->nat_stat;
- player->god = np->nat_stat & STAT_GOD;
+ player->nstat = nstat[np->nat_stat];
+ player->god = np->nat_stat == STAT_GOD;
player->map = ef_ptr(EF_MAP, player->cnum);
player->bmap = ef_ptr(EF_BMAP, player->cnum);
if (opt_HIDDEN) {
return 0;
}
-int
+static int
nat_cap(int btu)
{
- extern int s_p_etu;
- extern int max_btus;
- extern float btu_build_rate;
struct sctstr sect;
struct natstr *np;
- double d;
+ double d, eff;
double civ;
int delta;
np = getnatp(player->cnum);
if (!getsect(np->nat_xcap, np->nat_ycap, §)) {
- logerror("can't read %s's cap @ %d,%d",
- np->nat_cnam, np->nat_xcap, np->nat_ycap);
+ CANT_HAPPEN("read cap");
return -1;
}
- if ((player->nstat & NORM) == NORM) {
- if (player->owner && (sect.sct_type == SCT_CAPIT ||
- sect.sct_type == SCT_MOUNT ||
- sect.sct_type == SCT_SANCT))
- player->nstat |= CAP;
- else
+ if (np->nat_stat >= STAT_ACTIVE) {
+ if (influx(np))
player->nstat &= ~CAP;
- /* Ok, has the country owner reset his capital yet after it was sacked? */
- if (np->nat_flags & NF_SACKED)
- player->nstat &= ~CAP; /* No capital yet */
+ else
+ player->nstat |= CAP;
}
delta = 0;
if ((player->nstat & CAP) || player->god) {
d = (double)(player->curup - np->nat_last_login) / s_p_etu;
if (d > 336.0)
d = 336.0;
- civ = getvar(V_CIVIL, (caddr_t)§, EF_SECTOR);
+ civ = sect.sct_item[I_CIVIL];
if (civ > 999)
civ = 999;
- if ((sect.sct_effic) && (sect.sct_type != SCT_MOUNT))
- delta = roundavg(d * civ * sect.sct_effic * btu_build_rate);
- else /* Assume 1/2% efficiency minimum */
- delta = roundavg(d * civ * btu_build_rate / 2.0);
- if (player->god)
- delta = max_btus - btu;
- if (delta + btu > max_btus)
- delta = max_btus - btu;
- if (btu > max_btus)
- delta = max_btus - btu;
- if (opt_BLITZ)
- delta = max_btus - btu;
+ eff = sect.sct_effic * sect.sct_work / 100.0;
+ if (eff < 0.5 || sect.sct_type == SCT_MOUNT)
+ eff = 0.5;
+ delta = roundavg(d * civ * eff * btu_build_rate);
- if (delta > 0) {
- /* set date if BTUs made */
- np->nat_btu += delta;
- }
- if (btu > max_btus)
+ if (delta + btu > max_btus)
np->nat_btu = max_btus;
+ else
+ np->nat_btu += delta;
}
- if (np->nat_stat == VIS)
+ if (np->nat_stat == STAT_VIS)
np->nat_btu = max_btus;
putnat(np);
return 0;