(upd_ship, upd_land, do_plague): Work directly on item arrays instead
of copies made by getvec(). This is safe, because the new code changes the item array precisely when the old code writes back a changed copy. (starv_ships, starv_units): Replace getvec() by direct, read-only item access. (feed_ship, feed_land): Remove parameter vec, work with sp->shp_item[] and lp->lnd_item[] instead. (plague_people): Change argument type to match uncopied item arrays.
This commit is contained in:
parent
979f74709b
commit
c922b571db
5 changed files with 55 additions and 70 deletions
|
@ -555,7 +555,7 @@ extern int do_feed(register struct sctstr *, register struct natstr *,
|
||||||
extern int feed_people(register int *, int, int *);
|
extern int feed_people(register int *, int, int *);
|
||||||
/* land.c */
|
/* land.c */
|
||||||
extern int prod_land(int, int, int *, int);
|
extern int prod_land(int, int, int *, int);
|
||||||
extern int feed_land(struct lndstr *, register int *, int, int *, int);
|
extern int feed_land(struct lndstr *, int, int *, int);
|
||||||
/* main.c */
|
/* main.c */
|
||||||
/* in server.h */
|
/* in server.h */
|
||||||
/* material.c */
|
/* material.c */
|
||||||
|
@ -591,7 +591,7 @@ extern s_char *nxtitemp(struct nstr_item *, int);
|
||||||
extern struct sctstr *nxtsctp(register struct nstr_sect *);
|
extern struct sctstr *nxtsctp(register struct nstr_sect *);
|
||||||
/* plague.c */
|
/* plague.c */
|
||||||
extern void do_plague(struct sctstr *, struct natstr *, int);
|
extern void do_plague(struct sctstr *, struct natstr *, int);
|
||||||
extern int plague_people(struct natstr *, int *, u_short *, u_short *, int);
|
extern int plague_people(struct natstr *, short *, u_short *, u_short *, int);
|
||||||
/* plane.c */
|
/* plane.c */
|
||||||
extern int prod_plane(int, int, int *, int);
|
extern int prod_plane(int, int, int *, int);
|
||||||
/* populace.c */
|
/* populace.c */
|
||||||
|
@ -623,7 +623,7 @@ extern void produce_sect(int natnum, int etu, int *bp,
|
||||||
long int (*p_sect)[2], int sector_type);
|
long int (*p_sect)[2], int sector_type);
|
||||||
/* ship.c */
|
/* ship.c */
|
||||||
extern int prod_ship(int, int, int *, int);
|
extern int prod_ship(int, int, int *, int);
|
||||||
extern int feed_ship(struct shpstr *, register int *, int, int *, int);
|
extern int feed_ship(struct shpstr *, int, int *, int);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* src/server
|
* src/server
|
||||||
|
|
|
@ -164,7 +164,7 @@ starv_ships(s_char *range)
|
||||||
struct nstr_item ni;
|
struct nstr_item ni;
|
||||||
struct shpstr ship;
|
struct shpstr ship;
|
||||||
int nship = 0;
|
int nship = 0;
|
||||||
int vec[I_MAX + 1], s, needed;
|
int s, needed;
|
||||||
|
|
||||||
if (!snxtitem(&ni, EF_SHIP, range))
|
if (!snxtitem(&ni, EF_SHIP, range))
|
||||||
return;
|
return;
|
||||||
|
@ -173,9 +173,7 @@ starv_ships(s_char *range)
|
||||||
if (!player->owner || !ship.shp_own)
|
if (!player->owner || !ship.shp_own)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
getvec(VT_ITEM, vec, (s_char *)&ship, EF_SHIP);
|
s = feed_ship(&ship, etu_per_update, &needed, 0);
|
||||||
s = feed_ship(&ship, vec, etu_per_update, &needed, 0);
|
|
||||||
|
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
continue;
|
continue;
|
||||||
if (nship++ == 0)
|
if (nship++ == 0)
|
||||||
|
@ -214,7 +212,7 @@ starv_units(s_char *range)
|
||||||
struct nstr_item ni;
|
struct nstr_item ni;
|
||||||
struct lndstr land;
|
struct lndstr land;
|
||||||
int nunit = 0;
|
int nunit = 0;
|
||||||
int vec[I_MAX + 1], s, needed;
|
int s, needed;
|
||||||
|
|
||||||
if (!snxtitem(&ni, EF_LAND, range))
|
if (!snxtitem(&ni, EF_LAND, range))
|
||||||
return;
|
return;
|
||||||
|
@ -223,9 +221,7 @@ starv_units(s_char *range)
|
||||||
if (!player->owner || !land.lnd_own)
|
if (!player->owner || !land.lnd_own)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
getvec(VT_ITEM, vec, (s_char *)&land, EF_LAND);
|
s = feed_land(&land, etu_per_update, &needed, 0);
|
||||||
s = feed_land(&land, vec, etu_per_update, &needed, 0);
|
|
||||||
|
|
||||||
if (s == 0)
|
if (s == 0)
|
||||||
continue;
|
continue;
|
||||||
if (nunit++ == 0)
|
if (nunit++ == 0)
|
||||||
|
|
|
@ -117,7 +117,6 @@ upd_land(register struct lndstr *lp, register int etus,
|
||||||
{
|
{
|
||||||
struct lchrstr *lcp;
|
struct lchrstr *lcp;
|
||||||
u_short pstage, ptime;
|
u_short pstage, ptime;
|
||||||
int vec[I_MAX + 1];
|
|
||||||
int n;
|
int n;
|
||||||
int min = morale_base - (int)np->nat_level[NAT_HLEV];
|
int min = morale_base - (int)np->nat_level[NAT_HLEV];
|
||||||
int mult;
|
int mult;
|
||||||
|
@ -170,8 +169,7 @@ upd_land(register struct lndstr *lp, register int etus,
|
||||||
resupply_commod(lp, I_FOOD);
|
resupply_commod(lp, I_FOOD);
|
||||||
|
|
||||||
if (!player->simulation) {
|
if (!player->simulation) {
|
||||||
getvec(VT_ITEM, vec, (s_char *)lp, EF_LAND);
|
if ((n = feed_land(lp, etus, &needed, 1)) > 0) {
|
||||||
if ((n = feed_land(lp, vec, etus, &needed, 1)) > 0) {
|
|
||||||
wu(0, lp->lnd_own, "%d starved in %s%s\n",
|
wu(0, lp->lnd_own, "%d starved in %s%s\n",
|
||||||
n, prland(lp),
|
n, prland(lp),
|
||||||
(lp->lnd_effic < LAND_MINEFF ? ", killing it" : ""));
|
(lp->lnd_effic < LAND_MINEFF ? ", killing it" : ""));
|
||||||
|
@ -185,7 +183,7 @@ upd_land(register struct lndstr *lp, register int etus,
|
||||||
pstage = lp->lnd_pstage;
|
pstage = lp->lnd_pstage;
|
||||||
ptime = lp->lnd_ptime;
|
ptime = lp->lnd_ptime;
|
||||||
if (pstage != PLG_HEALTHY) {
|
if (pstage != PLG_HEALTHY) {
|
||||||
n = plague_people(np, vec, &pstage, &ptime, etus);
|
n = plague_people(np, lp->lnd_item, &pstage, &ptime, etus);
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case PLG_DYING:
|
case PLG_DYING:
|
||||||
wu(0, lp->lnd_own,
|
wu(0, lp->lnd_own,
|
||||||
|
@ -229,7 +227,6 @@ upd_land(register struct lndstr *lp, register int etus,
|
||||||
lp->lnd_pstage = pstage;
|
lp->lnd_pstage = pstage;
|
||||||
lp->lnd_ptime = ptime;
|
lp->lnd_ptime = ptime;
|
||||||
}
|
}
|
||||||
putvec(VT_ITEM, vec, (s_char *)lp, EF_LAND);
|
|
||||||
} /* end !player->simulation */
|
} /* end !player->simulation */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -248,14 +245,12 @@ landrepair(register struct lndstr *land, struct natstr *np,
|
||||||
int avail;
|
int avail;
|
||||||
int w_p_eff;
|
int w_p_eff;
|
||||||
int mult;
|
int mult;
|
||||||
int svec[I_MAX + 1];
|
|
||||||
int mvec[I_MAX + 1];
|
int mvec[I_MAX + 1];
|
||||||
|
|
||||||
lp = &lchr[(int)land->lnd_type];
|
lp = &lchr[(int)land->lnd_type];
|
||||||
sp = getsectp(land->lnd_x, land->lnd_y);
|
sp = getsectp(land->lnd_x, land->lnd_y);
|
||||||
if (sp->sct_off)
|
if (sp->sct_off)
|
||||||
return 1;
|
return 1;
|
||||||
getvec(VT_ITEM, svec, (s_char *)sp, EF_SECTOR);
|
|
||||||
mult = 1;
|
mult = 1;
|
||||||
if (np->nat_level[NAT_TLEV] < land->lnd_tech * 0.85)
|
if (np->nat_level[NAT_TLEV] < land->lnd_tech * 0.85)
|
||||||
mult = 2;
|
mult = 2;
|
||||||
|
@ -360,8 +355,7 @@ landrepair(register struct lndstr *land, struct natstr *np,
|
||||||
* returns the number who starved, if any.
|
* returns the number who starved, if any.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
feed_land(struct lndstr *lp, register int *vec, int etus, int *needed,
|
feed_land(struct lndstr *lp, int etus, int *needed, int doit)
|
||||||
int doit)
|
|
||||||
{
|
{
|
||||||
double food_eaten, ship_eaten;
|
double food_eaten, ship_eaten;
|
||||||
int ifood_eaten;
|
int ifood_eaten;
|
||||||
|
@ -388,32 +382,32 @@ feed_land(struct lndstr *lp, register int *vec, int etus, int *needed,
|
||||||
* the ship, tho...
|
* the ship, tho...
|
||||||
*/
|
*/
|
||||||
/* doit - Only try to take food off the ship during the update */
|
/* doit - Only try to take food off the ship during the update */
|
||||||
if (ifood_eaten > vec[I_FOOD] && lp->lnd_ship >= 0 && doit) {
|
if (ifood_eaten > lp->lnd_item[I_FOOD] && lp->lnd_ship >= 0 && doit) {
|
||||||
need = ifood_eaten - vec[I_FOOD];
|
need = ifood_eaten - lp->lnd_item[I_FOOD];
|
||||||
sp = getshipp(lp->lnd_ship);
|
sp = getshipp(lp->lnd_ship);
|
||||||
ship_eaten = etus * eatrate * (sp->shp_item[I_CIVIL]
|
ship_eaten = etus * eatrate * (sp->shp_item[I_CIVIL]
|
||||||
+ sp->shp_item[I_MILIT]
|
+ sp->shp_item[I_MILIT]
|
||||||
+ sp->shp_item[I_UW]);
|
+ sp->shp_item[I_UW]);
|
||||||
if (sp->shp_item[I_FOOD] - need > ship_eaten) {
|
if (sp->shp_item[I_FOOD] - need > ship_eaten) {
|
||||||
vec[I_FOOD] += need;
|
lp->lnd_item[I_FOOD] += need;
|
||||||
sp->shp_item[I_FOOD] -= need;
|
sp->shp_item[I_FOOD] -= need;
|
||||||
} else if (sp->shp_item[I_FOOD] - ship_eaten > 0) {
|
} else if (sp->shp_item[I_FOOD] - ship_eaten > 0) {
|
||||||
vec[I_FOOD] += sp->shp_item[I_FOOD] - ship_eaten;
|
lp->lnd_item[I_FOOD] += sp->shp_item[I_FOOD] - ship_eaten;
|
||||||
sp->shp_item[I_FOOD] -= sp->shp_item[I_FOOD] - ship_eaten;
|
sp->shp_item[I_FOOD] -= sp->shp_item[I_FOOD] - ship_eaten;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ifood_eaten > vec[I_FOOD]) {
|
if (ifood_eaten > lp->lnd_item[I_FOOD]) {
|
||||||
*needed = ifood_eaten - vec[I_FOOD];
|
*needed = ifood_eaten - lp->lnd_item[I_FOOD];
|
||||||
people_left = (vec[I_FOOD] + 0.01) / (food_eaten + 0.01);
|
people_left = (lp->lnd_item[I_FOOD] + 0.01) / (food_eaten + 0.01);
|
||||||
/* only want to starve off at most 1/2 the populace. */
|
/* only want to starve off at most 1/2 the populace. */
|
||||||
if (people_left < 0.5)
|
if (people_left < 0.5)
|
||||||
people_left = 0.5;
|
people_left = 0.5;
|
||||||
starved = total_people * (1 - people_left);
|
starved = total_people * (1 - people_left);
|
||||||
vec[I_MILIT] -= starved;
|
lp->lnd_item[I_MILIT] -= starved;
|
||||||
vec[I_FOOD] = 0;
|
lp->lnd_item[I_FOOD] = 0;
|
||||||
} else {
|
} else {
|
||||||
vec[I_FOOD] -= (int)food_eaten;
|
lp->lnd_item[I_FOOD] -= (int)food_eaten;
|
||||||
}
|
}
|
||||||
return starved;
|
return starved;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,6 @@ static int infect_people(struct natstr *, struct sctstr *);
|
||||||
void
|
void
|
||||||
do_plague(struct sctstr *sp, struct natstr *np, int etu)
|
do_plague(struct sctstr *sp, struct natstr *np, int etu)
|
||||||
{
|
{
|
||||||
int vec[I_MAX + 1];
|
|
||||||
u_short pstage, ptime;
|
u_short pstage, ptime;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
@ -66,8 +65,7 @@ do_plague(struct sctstr *sp, struct natstr *np, int etu)
|
||||||
pstage = infect_people(np, sp);
|
pstage = infect_people(np, sp);
|
||||||
ptime = 0;
|
ptime = 0;
|
||||||
} else {
|
} else {
|
||||||
getvec(VT_ITEM, vec, (s_char *)sp, EF_SECTOR);
|
n = plague_people(np, sp->sct_item, &pstage, &ptime, etu);
|
||||||
n = plague_people(np, vec, &pstage, &ptime, etu);
|
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case PLG_DYING:
|
case PLG_DYING:
|
||||||
wu(0, sp->sct_own, "PLAGUE deaths reported in %s.\n",
|
wu(0, sp->sct_own, "PLAGUE deaths reported in %s.\n",
|
||||||
|
@ -107,7 +105,6 @@ do_plague(struct sctstr *sp, struct natstr *np, int etu)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
putvec(VT_ITEM, vec, (s_char *)sp, EF_SECTOR);
|
|
||||||
}
|
}
|
||||||
if (sp->sct_item[I_CIVIL] == 0 && sp->sct_item[I_MILIT] == 0
|
if (sp->sct_item[I_CIVIL] == 0 && sp->sct_item[I_MILIT] == 0
|
||||||
&& !has_units(sp->sct_x, sp->sct_y, sp->sct_own, 0)) {
|
&& !has_units(sp->sct_x, sp->sct_y, sp->sct_own, 0)) {
|
||||||
|
@ -154,7 +151,7 @@ infect_people(struct natstr *np, struct sctstr *sp)
|
||||||
* stage. No reports generated here anymore.
|
* stage. No reports generated here anymore.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
plague_people(struct natstr *np, register int *vec,
|
plague_people(struct natstr *np, short *vec,
|
||||||
u_short *pstage, u_short *ptime,
|
u_short *pstage, u_short *ptime,
|
||||||
int etus)
|
int etus)
|
||||||
{
|
{
|
||||||
|
|
|
@ -116,7 +116,6 @@ upd_ship(register struct shpstr *sp, register int etus,
|
||||||
{
|
{
|
||||||
struct sctstr *sectp;
|
struct sctstr *sectp;
|
||||||
struct mchrstr *mp;
|
struct mchrstr *mp;
|
||||||
int vec[I_MAX + 1];
|
|
||||||
u_short pstage, ptime;
|
u_short pstage, ptime;
|
||||||
int oil_gained;
|
int oil_gained;
|
||||||
int max_oil;
|
int max_oil;
|
||||||
|
@ -163,19 +162,18 @@ upd_ship(register struct shpstr *sp, register int etus,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player->simulation) {
|
if (!player->simulation) {
|
||||||
getvec(VT_ITEM, vec, (s_char *)sp, EF_SHIP);
|
|
||||||
sectp = getsectp(sp->shp_x, sp->shp_y);
|
sectp = getsectp(sp->shp_x, sp->shp_y);
|
||||||
|
|
||||||
if ((mp->m_flags & M_OIL) && sectp->sct_type == SCT_WATER) {
|
if ((mp->m_flags & M_OIL) && sectp->sct_type == SCT_WATER) {
|
||||||
/*
|
/*
|
||||||
* take care of oil production
|
* take care of oil production
|
||||||
*/
|
*/
|
||||||
oil_gained = roundavg((vec[I_CIVIL] * etus / 10000.0)
|
oil_gained = roundavg((sp->shp_item[I_CIVIL] * etus / 10000.0)
|
||||||
* sectp->sct_oil);
|
* sectp->sct_oil);
|
||||||
vec[I_OIL] += oil_gained;
|
sp->shp_item[I_OIL] += oil_gained;
|
||||||
max_oil = vl_find(V_OIL, mp->m_vtype, mp->m_vamt, mp->m_nv);
|
max_oil = vl_find(V_OIL, mp->m_vtype, mp->m_vamt, mp->m_nv);
|
||||||
if (vec[I_OIL] > max_oil)
|
if (sp->shp_item[I_OIL] > max_oil)
|
||||||
vec[I_OIL] = max_oil;
|
sp->shp_item[I_OIL] = max_oil;
|
||||||
product = &pchr[P_OIL];
|
product = &pchr[P_OIL];
|
||||||
if (product->p_nrdep != 0 && oil_gained > 0) {
|
if (product->p_nrdep != 0 && oil_gained > 0) {
|
||||||
resource = ((s_char *)sectp) + product->p_nrndx;
|
resource = ((s_char *)sectp) + product->p_nrndx;
|
||||||
|
@ -184,17 +182,17 @@ upd_ship(register struct shpstr *sp, register int etus,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {
|
if ((mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {
|
||||||
vec[I_FOOD] += ((vec[I_CIVIL] * etus) / 1000.0)
|
sp->shp_item[I_FOOD] += ((sp->shp_item[I_CIVIL] * etus) / 1000.0)
|
||||||
* sectp->sct_fertil;
|
* sectp->sct_fertil;
|
||||||
}
|
}
|
||||||
if ((n = feed_ship(sp, vec, etus, &needed, 1)) > 0) {
|
if ((n = feed_ship(sp, etus, &needed, 1)) > 0) {
|
||||||
wu(0, sp->shp_own, "%d starved on %s\n", n, prship(sp));
|
wu(0, sp->shp_own, "%d starved on %s\n", n, prship(sp));
|
||||||
if (n > 10)
|
if (n > 10)
|
||||||
nreport(sp->shp_own, N_DIE_FAMINE, 0, 1);
|
nreport(sp->shp_own, N_DIE_FAMINE, 0, 1);
|
||||||
}
|
}
|
||||||
max_food = vl_find(V_FOOD, mp->m_vtype, mp->m_vamt, mp->m_nv);
|
max_food = vl_find(V_FOOD, mp->m_vtype, mp->m_vamt, mp->m_nv);
|
||||||
if (vec[I_FOOD] > max_food)
|
if (sp->shp_item[I_FOOD] > max_food)
|
||||||
vec[I_FOOD] = max_food;
|
sp->shp_item[I_FOOD] = max_food;
|
||||||
/*
|
/*
|
||||||
* do plague stuff. plague can't break out on ships,
|
* do plague stuff. plague can't break out on ships,
|
||||||
* but it can still kill people.
|
* but it can still kill people.
|
||||||
|
@ -202,7 +200,7 @@ upd_ship(register struct shpstr *sp, register int etus,
|
||||||
pstage = sp->shp_pstage;
|
pstage = sp->shp_pstage;
|
||||||
ptime = sp->shp_ptime;
|
ptime = sp->shp_ptime;
|
||||||
if (pstage != PLG_HEALTHY) {
|
if (pstage != PLG_HEALTHY) {
|
||||||
n = plague_people(np, vec, &pstage, &ptime, etus);
|
n = plague_people(np, sp->shp_item, &pstage, &ptime, etus);
|
||||||
switch (n) {
|
switch (n) {
|
||||||
case PLG_DYING:
|
case PLG_DYING:
|
||||||
wu(0, sp->shp_own,
|
wu(0, sp->shp_own,
|
||||||
|
@ -247,8 +245,7 @@ upd_ship(register struct shpstr *sp, register int etus,
|
||||||
sp->shp_pstage = pstage;
|
sp->shp_pstage = pstage;
|
||||||
sp->shp_ptime = ptime;
|
sp->shp_ptime = ptime;
|
||||||
}
|
}
|
||||||
putvec(VT_ITEM, vec, (s_char *)sp, EF_SHIP);
|
pops[sp->shp_own] += sp->shp_item[I_CIVIL];
|
||||||
pops[sp->shp_own] += vec[I_CIVIL];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -423,8 +420,7 @@ shiprepair(register struct shpstr *ship, struct natstr *np,
|
||||||
* returns the number who starved, if any.
|
* returns the number who starved, if any.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
feed_ship(struct shpstr *sp, register int *vec, int etus, int *needed,
|
feed_ship(struct shpstr *sp, int etus, int *needed, int doit)
|
||||||
int doit)
|
|
||||||
{
|
{
|
||||||
double food_eaten, land_eaten;
|
double food_eaten, land_eaten;
|
||||||
int ifood_eaten;
|
int ifood_eaten;
|
||||||
|
@ -438,63 +434,65 @@ feed_ship(struct shpstr *sp, register int *vec, int etus, int *needed,
|
||||||
if (opt_NOFOOD)
|
if (opt_NOFOOD)
|
||||||
return 0; /* no food no work to do */
|
return 0; /* no food no work to do */
|
||||||
|
|
||||||
total_people = vec[I_CIVIL] + vec[I_MILIT] + vec[I_UW];
|
total_people
|
||||||
|
= sp->shp_item[I_CIVIL] + sp->shp_item[I_MILIT] + sp->shp_item[I_UW];
|
||||||
food_eaten = etus * eatrate * total_people;
|
food_eaten = etus * eatrate * total_people;
|
||||||
ifood_eaten = (int)food_eaten;
|
ifood_eaten = (int)food_eaten;
|
||||||
if (food_eaten - ifood_eaten > 0)
|
if (food_eaten - ifood_eaten > 0)
|
||||||
ifood_eaten++;
|
ifood_eaten++;
|
||||||
starved = 0;
|
starved = 0;
|
||||||
*needed = 0;
|
*needed = 0;
|
||||||
if (!player->simulation && ifood_eaten > vec[I_FOOD])
|
if (!player->simulation && ifood_eaten > sp->shp_item[I_FOOD])
|
||||||
vec[I_FOOD] += supply_commod(sp->shp_own, sp->shp_x, sp->shp_y,
|
sp->shp_item[I_FOOD]
|
||||||
I_FOOD, ifood_eaten - vec[I_FOOD]);
|
+= supply_commod(sp->shp_own, sp->shp_x, sp->shp_y,
|
||||||
|
I_FOOD, ifood_eaten - sp->shp_item[I_FOOD]);
|
||||||
|
|
||||||
/* doit - only steal food from land units during the update */
|
/* doit - only steal food from land units during the update */
|
||||||
if (ifood_eaten > vec[I_FOOD] && sp->shp_nland > 0 && doit) {
|
if (ifood_eaten > sp->shp_item[I_FOOD] && sp->shp_nland > 0 && doit) {
|
||||||
snxtitem_all(&ni, EF_LAND);
|
snxtitem_all(&ni, EF_LAND);
|
||||||
while ((lp = (struct lndstr *)nxtitemp(&ni, 0)) &&
|
while ((lp = (struct lndstr *)nxtitemp(&ni, 0)) &&
|
||||||
ifood_eaten > vec[I_FOOD]) {
|
ifood_eaten > sp->shp_item[I_FOOD]) {
|
||||||
if (lp->lnd_ship != sp->shp_uid)
|
if (lp->lnd_ship != sp->shp_uid)
|
||||||
continue;
|
continue;
|
||||||
need = ifood_eaten - vec[I_FOOD];
|
need = ifood_eaten - sp->shp_item[I_FOOD];
|
||||||
land_eaten = etus * eatrate * lnd_getmil(lp);
|
land_eaten = etus * eatrate * lnd_getmil(lp);
|
||||||
if (lp->lnd_item[I_FOOD] - need > land_eaten) {
|
if (lp->lnd_item[I_FOOD] - need > land_eaten) {
|
||||||
vec[I_FOOD] += need;
|
sp->shp_item[I_FOOD] += need;
|
||||||
lp->lnd_item[I_FOOD] -= need;
|
lp->lnd_item[I_FOOD] -= need;
|
||||||
} else if (lp->lnd_item[I_FOOD] - land_eaten > 0) {
|
} else if (lp->lnd_item[I_FOOD] - land_eaten > 0) {
|
||||||
vec[I_FOOD] += lp->lnd_item[I_FOOD] - land_eaten;
|
sp->shp_item[I_FOOD] += lp->lnd_item[I_FOOD] - land_eaten;
|
||||||
lp->lnd_item[I_FOOD] -= lp->lnd_item[I_FOOD] - land_eaten;
|
lp->lnd_item[I_FOOD] -= lp->lnd_item[I_FOOD] - land_eaten;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ifood_eaten > vec[I_FOOD]) {
|
if (ifood_eaten > sp->shp_item[I_FOOD]) {
|
||||||
*needed = ifood_eaten - vec[I_FOOD];
|
*needed = ifood_eaten - sp->shp_item[I_FOOD];
|
||||||
can_eat = vec[I_FOOD] / (etus * eatrate);
|
can_eat = sp->shp_item[I_FOOD] / (etus * eatrate);
|
||||||
/* only want to starve off at most 1/2 the populace. */
|
/* only want to starve off at most 1/2 the populace. */
|
||||||
if (can_eat < total_people / 2)
|
if (can_eat < total_people / 2)
|
||||||
can_eat = total_people / 2;
|
can_eat = total_people / 2;
|
||||||
|
|
||||||
to_starve = total_people - can_eat;
|
to_starve = total_people - can_eat;
|
||||||
while (to_starve && vec[I_UW]) {
|
while (to_starve && sp->shp_item[I_UW]) {
|
||||||
to_starve--;
|
to_starve--;
|
||||||
starved++;
|
starved++;
|
||||||
vec[I_UW]--;
|
sp->shp_item[I_UW]--;
|
||||||
}
|
}
|
||||||
while (to_starve && vec[I_CIVIL]) {
|
while (to_starve && sp->shp_item[I_CIVIL]) {
|
||||||
to_starve--;
|
to_starve--;
|
||||||
starved++;
|
starved++;
|
||||||
vec[I_CIVIL]--;
|
sp->shp_item[I_CIVIL]--;
|
||||||
}
|
}
|
||||||
while (to_starve && vec[I_MILIT]) {
|
while (to_starve && sp->shp_item[I_MILIT]) {
|
||||||
to_starve--;
|
to_starve--;
|
||||||
starved++;
|
starved++;
|
||||||
vec[I_MILIT]--;
|
sp->shp_item[I_MILIT]--;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec[I_FOOD] = 0;
|
sp->shp_item[I_FOOD] = 0;
|
||||||
} else {
|
} else {
|
||||||
vec[I_FOOD] -= (int)food_eaten;
|
sp->shp_item[I_FOOD] -= (int)food_eaten;
|
||||||
}
|
}
|
||||||
return starved;
|
return starved;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue