Remove option SLOW_WAR

SLOW_WAR has issues:

* The check whether the attacker old-owns the attacked sector is
  broken, because att_abort() uses sect.sct_oldown uninitialized.

  Spotted by the Clang Static Analyzer.

* Its implementation in setrel() is somewhat scary.  It's actually
  okay, because that part of setrel() only runs within decl().  Other
  callers don't reach it: update_main() because player->god != 0
  there, and the rest because they never pass a rel < HOSTILE.

* Documentation is a bit vague.

SLOW_WAR hasn't been used in a public game in years.  Fixing it is not
worth it, so remove it instead.
This commit is contained in:
Markus Armbruster 2011-01-09 19:03:38 +01:00
parent a94ae5f8c1
commit 439f111f98
23 changed files with 11 additions and 274 deletions

View file

@ -173,8 +173,7 @@ assa(void)
putland(llp->unit.land.lnd_uid, &llp->unit.land);
} else {
pr("%s was spotted", prland(&llp->unit.land));
if (rel == HOSTILE || rel == AT_WAR || rel == SITZKRIEG ||
rel == MOBILIZATION) {
if (rel <= HOSTILE) {
wu(0, def->own, "%s spy shot and killed in %s.\n",
cname(player->cnum), xyas(def->x, def->y,
def->own));

View file

@ -95,8 +95,6 @@ bomb(void)
char mission;
struct plist *plp;
struct emp_qelem *qp, *next;
int rel;
struct natstr *natp;
char buf[1024];
if (get_planes(&ni_bomb, &ni_esc, player->argp[1], player->argp[2]) < 0)
@ -160,20 +158,6 @@ bomb(void)
}
break;
case 's':
if (opt_SLOW_WAR) {
natp = getnatp(player->cnum);
if (target.sct_own) {
rel = getrel(natp, target.sct_own);
if ((rel != AT_WAR) && (player->cnum != target.sct_own)
&& (target.sct_own) &&
(target.sct_oldown != player->cnum)) {
pr("You're not at war with them!\n");
pln_put(&bomb_list);
pln_put(&esc_list);
return RET_FAIL;
}
}
}
nreport(player->cnum, N_SCT_BOMB, target.sct_own, 1);
strat_bomb(&bomb_list, &target);
break;
@ -197,8 +181,6 @@ pin_bomb(struct emp_qelem *list, struct sctstr *target)
char *p;
int nsubs;
int nunits;
struct natstr *natp;
int rel;
char buf[1024];
int i;
@ -229,18 +211,6 @@ pin_bomb(struct emp_qelem *list, struct sctstr *target)
}
switch (*p) {
case 'l':
if (opt_SLOW_WAR) {
natp = getnatp(player->cnum);
if (target->sct_own) {
rel = getrel(natp, target->sct_own);
if ((rel != AT_WAR) && (player->cnum != target->sct_own)
&& (target->sct_own) &&
(target->sct_oldown != player->cnum)) {
pr("You're not at war with them!\n");
goto retry;
}
}
}
if (nunits == 0) {
pr("no units there\n");
goto retry;
@ -248,18 +218,6 @@ pin_bomb(struct emp_qelem *list, struct sctstr *target)
land_bomb(list, target);
break;
case 'p':
if (opt_SLOW_WAR) {
natp = getnatp(player->cnum);
if (target->sct_own) {
rel = getrel(natp, target->sct_own);
if ((rel != AT_WAR) && (player->cnum != target->sct_own)
&& (target->sct_own) &&
(target->sct_oldown != player->cnum)) {
pr("You're not at war with them!\n");
goto retry;
}
}
}
if (nplanes == 0) {
pr("no planes there\n");
goto retry;
@ -281,19 +239,6 @@ pin_bomb(struct emp_qelem *list, struct sctstr *target)
ship_bomb(list, target);
break;
case 'c':
if (opt_SLOW_WAR) {
natp = getnatp(player->cnum);
if (target->sct_own) {
rel = getrel(natp, target->sct_own);
if ((rel != AT_WAR) && (player->cnum != target->sct_own)
&& (target->sct_own) &&
(target->sct_oldown != player->cnum)) {
pr("You're not at war with them!\n");
goto retry;
}
}
}
for (i = 0; i < nbomb; i++) {
if (!target->sct_item[bombcomm[i]])
continue;
@ -307,18 +252,6 @@ pin_bomb(struct emp_qelem *list, struct sctstr *target)
comm_bomb(list, target);
break;
case 'e':
if (opt_SLOW_WAR) {
natp = getnatp(player->cnum);
if (target->sct_own) {
rel = getrel(natp, target->sct_own);
if ((rel != AT_WAR) && (player->cnum != target->sct_own)
&& (target->sct_own) &&
(target->sct_oldown != player->cnum)) {
pr("You're not at war with them!\n");
goto retry;
}
}
}
eff_bomb(list, target);
break;
case 'q':

View file

@ -64,20 +64,6 @@ decl(void)
case 'h':
rel = HOSTILE;
break;
case 'm':
if (!opt_SLOW_WAR)
return RET_SYN;
if (!player->god)
return RET_SYN;
rel = MOBILIZATION;
break;
case 's':
if (!opt_SLOW_WAR)
return RET_SYN;
if (!player->god)
return RET_SYN;
rel = SITZKRIEG;
break;
case 'w':
rel = AT_WAR;
break;

View file

@ -182,8 +182,6 @@ launch_missile(struct plnstr *pp)
struct mchrstr *mcp;
struct shpstr target_ship;
struct sctstr sect;
int rel;
struct natstr *natp;
struct nukstr nuke;
char buf[1024];
@ -230,18 +228,6 @@ launch_missile(struct plnstr *pp)
if (msl_equip(pp, 's') < 0)
return RET_FAIL;
getsect(sx, sy, &sect);
if (opt_SLOW_WAR) {
natp = getnatp(player->cnum);
rel = getrel(natp, sect.sct_own);
if ((rel != AT_WAR) && (sect.sct_own != player->cnum) &&
(sect.sct_own) && (sect.sct_oldown != player->cnum)) {
pr("You are not at war with the player->owner of the target sector!\n");
pr_beep();
pr("Kaboom!!!\n");
pr("Missile monitoring officer destroys RV before detonation.\n");
return RET_OK;
}
}
if (msl_launch(pp, EF_SECTOR, "sector", sx, sy, sect.sct_own,
&sublaunch) < 0)
return RET_OK;

View file

@ -82,8 +82,6 @@ multifire(void)
struct shpstr vship;
struct sctstr vsect;
enum targ_type target;
int rel;
struct natstr *natp;
struct nstr_item nbst;
int type;
struct empobj *attgp;
@ -416,17 +414,6 @@ multifire(void)
break;
}
if (opt_SLOW_WAR) {
if (target == targ_land) {
natp = getnatp(player->cnum);
rel = getrel(natp, vict);
if ((rel != AT_WAR) && (player->cnum != vict) &&
(vict) && (vsect.sct_oldown != player->cnum)) {
pr("You're not at war with them!\n");
continue;
}
}
}
nfiring++;
switch (target) {
case targ_sub:

View file

@ -101,8 +101,6 @@ vers(void)
if (rollover_avail_max)
pr("Up to %d avail can roll over an update.\n",
rollover_avail_max);
if (opt_SLOW_WAR)
pr("Declaring war will cost you $%i\n\n", War_Cost);
pr("Happiness p.e. requires 1 happy stroller per %d civ.\n",
(int)hap_cons / etu_per_update);
pr("Education p.e. requires 1 class of graduates per %d civ.\n",

View file

@ -42,8 +42,7 @@
char *relates[] = {
/* must follow nation relation defines in nat.h */
"At War", "Sitzkrieg", "Mobilizing", "Hostile", "Neutral", "Friendly",
"Allied"
"At War", "Hostile", "Neutral", "Friendly", "Allied"
};
char *

View file

@ -191,9 +191,6 @@ double buil_tower_bt = 100.0; /* tech level required to build a tower */
int buil_tower_bh = 400; /* hcm required to build a bridge tower */
double buil_tower_bc = 3000.0; /* cash required to build a bridge tower */
/* opt_SLOW_WAR */
int War_Cost = 1000; /* Cost to declare war */
float drnuke_const = 0.0; /* research must be at least drnuke_const*tech */
/* in order to build a nuke. For example, if
* drnuke_const is .25, you need a 75 res to

View file

@ -59,7 +59,6 @@ int opt_NO_PLAGUE = 1;
int opt_RAILWAYS = 1;
int opt_RES_POP = 0;
int opt_SAIL = 1;
int opt_SLOW_WAR = 0;
int opt_SUPER_BARS = 0;
int opt_TECH_POP = 0;
int opt_TRADESHIPS = 0;

View file

@ -139,8 +139,6 @@ struct symbol nation_rejects[] = {
struct symbol nation_relations[] = {
{-1, "unknown"},
{AT_WAR, "at-war"},
{SITZKRIEG, "sitzkrieg"},
{MOBILIZATION, "mobilization"},
{HOSTILE, "hostile"},
{NEUTRAL, "neutral"},
{FRIENDLY, "friendly"},

View file

@ -435,9 +435,6 @@ int
att_abort(int combat_mode, struct combat *off, struct combat *def)
{
struct sctstr sect;
int rel;
char y_or_n[512];
struct natstr *natp;
if (player->aborted)
return 1;
@ -513,23 +510,7 @@ att_abort(int combat_mode, struct combat *off, struct combat *def)
setcont(player->cnum, def->own, FOUND_SPY);
setcont(def->own, player->cnum, FOUND_SPY);
}
if (opt_SLOW_WAR && def->own != player->cnum) {
natp = getnatp(player->cnum);
rel = getrel(natp, def->own);
if (rel == ALLIED) {
sprintf(y_or_n, "Sector is owned by %s, your ally, %s [yn]? ",
cname(def->own), att_mode[combat_mode]);
if (!confirm(y_or_n))
return abort_attack();
}
if ((rel != AT_WAR) && (def->own) &&
(sect.sct_oldown != player->cnum)) {
pr("You're not at war with them!\n");
return abort_attack();
}
}
return 0;
}

View file

@ -1011,8 +1011,7 @@ lnd_mar_one_sector(struct emp_qelem *list, int dir, natid actor,
"%s unit spotted in %s\n", cname(player->cnum),
xyas(sect.sct_x, sect.sct_y, sect.sct_own));
setrel(sect.sct_own, llp->unit.land.lnd_own, HOSTILE);
} else if (rel == HOSTILE || rel == AT_WAR ||
rel == SITZKRIEG || rel == MOBILIZATION) {
} else if (rel <= HOSTILE) {
wu(0, sect.sct_own,
"%s spy shot in %s\n", cname(player->cnum),
xyas(sect.sct_x, sect.sct_y, sect.sct_own));

View file

@ -298,7 +298,6 @@ build_mission_list_type(struct genlist *mi, coord x, coord y, int mission,
struct empobj *gp;
union empobj_storage item;
int relat;
struct sctstr sect;
snxtitem_all(&ni, type);
while (nxtitem(&ni, &item)) {
@ -329,25 +328,6 @@ build_mission_list_type(struct genlist *mi, coord x, coord y, int mission,
if (!in_oparea(gp, x, y))
continue;
if (opt_SLOW_WAR) {
if (mission != MI_AIR_DEFENSE) {
getsect(x, y, &sect);
if (getrel(getnatp(gp->own), sect.sct_own) > AT_WAR) {
/*
* If the owner of the unit isn't at war
* with the victim, and doesn't own the
* sect being acted upon, and isn't the
* old owner of that sect, bounce them.
*/
if (sect.sct_type != SCT_WATER &&
sect.sct_own != gp->own &&
sect.sct_oldown != gp->own)
continue;
}
}
}
glp = malloc(sizeof(struct genlist));
memset(glp, 0, sizeof(struct genlist));
glp->thing = malloc(sizeof(item));

View file

@ -53,7 +53,6 @@ setrel(natid us, natid them, int rel)
int n_up = 0;
int n_down = 0;
char *addendum = NULL;
int theirrel;
if (rel < AT_WAR)
rel = AT_WAR;
@ -84,34 +83,6 @@ setrel(natid us, natid them, int rel)
n_up = N_UP_HOSTILE;
n_down = N_DOWN_HOSTILE;
} else if (rel < HOSTILE) {
if (opt_SLOW_WAR) {
struct natstr *natp2;
double cost;
if (!player->god) {
natp2 = themnp;
theirrel = getrel(natp2, us);
if (theirrel <= MOBILIZATION) {
rel = theirrel;
cost = 0;
} else if (us == player->cnum && !update_running) {
if (mynp->nat_money < War_Cost) {
mpr(us, "You don't have the money!\n");
return RET_FAIL;
}
rel = MOBILIZATION;
cost = War_Cost;
} else { /* nreport is forcing us to decl war */
return RET_FAIL;
}
if (rel >= oldrel) {
if (us == player->cnum && !update_running)
mpr(us, "No change required for that!\n");
return RET_FAIL;
}
player->dolcost += cost;
}
}
addendum = "Declaration made (give 'em hell).";
n_down = N_DECL_WAR;
}

View file

@ -59,8 +59,7 @@ update_main(void)
int n;
int i;
struct bp *bp;
int cn, cn2, rel;
struct natstr *cnp;
int cn;
struct natstr *np;
logerror("production update (%d etus)", etu);
@ -130,26 +129,7 @@ update_main(void)
prod_nat(etu);
age_levels(etu);
free(bp);
if (opt_SLOW_WAR) {
/* Update war declarations */
/* MOBILIZATION->SITZKRIEG->AT_WAR */
for (cn = 1; cn < MAXNOC; cn++) {
if (!(cnp = getnatp(cn)))
break;
for (cn2 = 1; cn2 < MAXNOC; cn2++) {
if (cn2 == cn)
continue;
rel = getrel(cnp, cn2);
if (rel == MOBILIZATION) {
rel = SITZKRIEG;
setrel(cn, cn2, rel);
} else if (rel == SITZKRIEG) {
rel = AT_WAR;
setrel(cn, cn2, rel);
}
}
}
}
/* Only update mobility for non-MOB_ACCESS here, since it doesn't
get done for MOB_ACCESS anyway during the update */
if (!opt_MOB_ACCESS) {