/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2004, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
int left;
int mcost, dam;
int infected;
- int stype;
int vtype;
int amt_src;
int amt_dst;
- struct dchrstr *dp;
struct ichrstr *ip;
int work;
int loyal;
* military control necessary to move
* goodies in occupied territory.
*/
- if (!istest && sect.sct_oldown != player->cnum && vtype != V_MILIT) {
- int tot_mil = 0;
- struct nstr_item ni;
- struct lndstr land;
- snxtitem_xy(&ni, EF_LAND, sect.sct_x, sect.sct_y);
- while (nxtitem(&ni, (s_char *)&land)) {
- if (land.lnd_own == player->cnum)
- tot_mil += total_mil(&land);
- }
- if ((sect.sct_item[I_MILIT] + tot_mil) * 10 < sect.sct_item[I_CIVIL]) {
+ if (!istest && sect.sct_oldown != player->cnum && vtype != I_MILIT) {
+ if (!military_control(§)) {
pr("Military control required to move goods.\n");
return RET_FAIL;
}
}
- stype = sect.sct_type;
- dp = &dchr[stype];
infected = sect.sct_pstage == PLG_INFECT;
amt_src = sect.sct_item[vtype];
if (!istest && amt_src <= 0) {
}
own = sect.sct_own;
mob = (int)sect.sct_mobil;
- if (!istest && vtype == V_CIVIL && sect.sct_oldown != own) {
+ if (!istest && vtype == I_CIVIL && sect.sct_oldown != own) {
pr("You can't move conquered populace!\n");
return RET_FAIL;
}
xyas(sect.sct_x, sect.sct_y, player->cnum));
return RET_SYN;
}
- if (vtype == V_CIVIL) {
- work = sect.sct_work;
- if (work != 100)
- pr("Warning: civil unrest\n");
- loyal = sect.sct_loyal;
- } else if (vtype == V_MILIT) {
- work = 100;
- loyal = 0;
- }
+
+ /* only used when moving civs; but prevent spurious compiler warnings */
+ work = sect.sct_work;
+ loyal = sect.sct_loyal;
+ if (vtype == I_CIVIL && work != 100)
+ pr("Warning: civil unrest\n");
+
if (istest)
sprintf(prompt, "Number of %s to test move? ", ip->i_name);
else
}
}
- if (!want_to_abandon(§, vtype, amount, 0)) {
+ if (!istest && !want_to_abandon(§, vtype, amount, 0)) {
pr("Move cancelled.\n");
return RET_FAIL;
}
if (amount <= 0)
return RET_SYN;
- packing = ip->i_pkg[dp->d_pkg];
- if (packing > 1 && sect.sct_effic < 60)
- packing = 1;
- weight = (double)amount *ip->i_lbs / packing;
+ packing = sect.sct_effic >= 60 ? dchr[sect.sct_type].d_pkg : IPKG;
+ weight = (double)amount * ip->i_lbs / ip->i_pkg[packing];
/*
* First remove commodities from source sector
*/
left = mob;
} else if (!istest) {
/*
- * decrement mobility appropriately.
+ * decrement mobility appropriately.
*/
getsect(x, y, &start);
mob = start.sct_mobil;
pr("Somebody has captured that sector!\n");
getsect(x, y, §);
}
- if (vtype == V_CIVIL && sect.sct_item[I_CIVIL]
+ if (vtype == I_CIVIL && sect.sct_item[I_CIVIL]
&& sect.sct_oldown != player->cnum) {
pr("Your civilians don't want to stay!\n");
getsect(x, y, §);
}
amt_dst = sect.sct_item[vtype];
- if (32767 - amt_dst < amount) {
+ if (amount > ITEM_MAX - amt_dst) {
pr("Only enough room for %d in %s. The goods will be returned.\n",
- 32767 - amt_dst, xyas(sect.sct_x, sect.sct_y, player->cnum));
+ ITEM_MAX - amt_dst, xyas(sect.sct_x, sect.sct_y, player->cnum));
+ /* FIXME Not nice. Move what we can and return the rest. */
getsect(x, y, §);
}
pr("%d mob left in %s\n", left,
xyas(start.sct_x, start.sct_y, player->cnum));
+ if (amount <= 0) {
+ getsect(x, y, &start);
+ start.sct_flags &= ~MOVE_IN_PROGRESS;
+ putsect(&start);
+ return RET_OK;
+ }
+
/* If the sector that things are going to is no longer
owned by the player, and was the starting sector,
try to find somewhere to dump the stuff. If nowhere
if (tsct.sct_own != player->cnum)
continue;
amt_dst = tsct.sct_item[vtype];
- if (32767 - amt_dst < amount)
+ if (amount > ITEM_MAX - amt_dst)
continue;
n = -1;
break;
*/
if (infected && sect.sct_pstage == PLG_HEALTHY)
sect.sct_pstage = PLG_EXPOSED;
- if (vtype == V_CIVIL) {
- if (opt_NEW_WORK) {
- sect.sct_loyal = ((amt_dst * sect.sct_loyal) +
- (amount * loyal)) / (amt_dst + amount);
- sect.sct_work = ((amt_dst * sect.sct_work) +
- (amount * work)) / (amt_dst + amount);
- } else { /* ! NEW_WORK */
-
- /* It only takes one bad apple... */
- if (sect.sct_loyal < loyal)
- sect.sct_loyal = loyal;
- if (sect.sct_work > work)
- sect.sct_work = work;
- } /* end NEW_WORK */
+ if (vtype == I_CIVIL) {
+ sect.sct_loyal
+ = (amt_dst * sect.sct_loyal + amount * loyal) / (amt_dst + amount);
+ sect.sct_work
+ = (amt_dst * sect.sct_work + amount * work) / (amt_dst + amount);
}
putsect(§);
getsect(x, y, &start);
{
int mil, civs, loyalcivs;
- if ((vtype != V_CIVIL) && (vtype != V_MILIT))
+ if ((vtype != I_CIVIL) && (vtype != I_MILIT))
return 0;
mil = sp->sct_item[I_MILIT];
civs = sp->sct_item[I_CIVIL];
- if (vtype == V_MILIT)
+ if (vtype == I_MILIT)
mil -= amnt;
- if (vtype == V_CIVIL)
+ if (vtype == I_CIVIL)
civs -= amnt;
if (sp->sct_own == sp->sct_oldown)