From abaf9e06ecab1df10941974f068e7722b4d9a220 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Thu, 11 Mar 2004 15:27:59 +0000 Subject: [PATCH] (feed_land): Simplify. Amount of food taken from ship could be off by one due to rounding, fix. However, the fixed code is currently unreachable, as caller runs resupply_commod() before feed_land(). (feed_ship): Simplify. No functional changes. --- src/lib/update/land.c | 36 +++++++++++------------------- src/lib/update/ship.c | 52 +++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 52 deletions(-) diff --git a/src/lib/update/land.c b/src/lib/update/land.c index 4aad1a37..7c403526 100644 --- a/src/lib/update/land.c +++ b/src/lib/update/land.c @@ -364,29 +364,32 @@ feed_land(struct lndstr *lp, register int *vec, int etus, int *needed, int doit) { double food_eaten, ship_eaten; + int ifood_eaten; double people_left; - int can_eat, need; + int need; int total_people; int starved; - struct lchrstr *lcp; struct shpstr *sp; if (opt_NOFOOD) return 0; /* no food no work to be done */ - lcp = &lchr[(int)lp->lnd_type]; - - food_eaten = (etus * eatrate) * total_mil(lp); + total_people = total_mil(lp); + food_eaten = etus * eatrate * total_people; + ifood_eaten = (int)food_eaten; + if (food_eaten - ifood_eaten > 0) + ifood_eaten++; starved = 0; *needed = 0; + /* * If we're on a ship, and we don't have enough food, * get some food off the carrying ship. (Don't starve * the ship, tho... */ /* doit - Only try to take food off the ship during the update */ - if ((food_eaten > vec[I_FOOD]) && (lp->lnd_ship >= 0) && doit) { - need = (int)food_eaten - vec[I_FOOD]; + if (ifood_eaten > vec[I_FOOD] && lp->lnd_ship >= 0 && doit) { + need = ifood_eaten - vec[I_FOOD]; sp = getshipp(lp->lnd_ship); ship_eaten = etus * eatrate * (sp->shp_item[I_CIVIL] + sp->shp_item[I_MILIT] @@ -400,26 +403,13 @@ feed_land(struct lndstr *lp, register int *vec, int etus, int *needed, } } - if (food_eaten > vec[I_FOOD]) { - *needed = food_eaten - vec[I_FOOD]; - if (*needed < (food_eaten - vec[I_FOOD])) - (*needed)++; - can_eat = (vec[I_FOOD] / (etus * eatrate)); - total_people = total_mil(lp); - /* only want to starve off at most 1/2 the populace. */ - if (can_eat < (total_people / 2)) - can_eat = total_people / 2; - + if (ifood_eaten > vec[I_FOOD]) { + *needed = ifood_eaten - vec[I_FOOD]; people_left = (vec[I_FOOD] + 0.01) / (food_eaten + 0.01); /* only want to starve off at most 1/2 the populace. */ if (people_left < 0.5) people_left = 0.5; -/* lp->lnd_effic *= people_left;*/ - starved = vec[I_MILIT] - (vec[I_MILIT] * people_left); -/* if (!player->simulation) - wu(0, lp->lnd_own, "%d mil starved on unit %s.\n", - starved, - prland(lp));*/ + starved = total_people * (1 - people_left); vec[I_MILIT] -= starved; vec[I_FOOD] = 0; } else { diff --git a/src/lib/update/ship.c b/src/lib/update/ship.c index dc81e1fc..e9e303dc 100644 --- a/src/lib/update/ship.c +++ b/src/lib/update/ship.c @@ -438,47 +438,41 @@ feed_ship(struct shpstr *sp, register int *vec, int etus, int *needed, if (opt_NOFOOD) return 0; /* no food no work to do */ - food_eaten = - (etus * eatrate) * (vec[I_CIVIL] + vec[I_MILIT] + vec[I_UW]); + total_people = vec[I_CIVIL] + vec[I_MILIT] + vec[I_UW]; + food_eaten = etus * eatrate * total_people; ifood_eaten = (int)food_eaten; - if ((food_eaten - ifood_eaten) > 0) + if (food_eaten - ifood_eaten > 0) ifood_eaten++; starved = 0; *needed = 0; - if (!player->simulation && food_eaten > vec[I_FOOD]) + if (!player->simulation && ifood_eaten > vec[I_FOOD]) vec[I_FOOD] += supply_commod(sp->shp_own, sp->shp_x, sp->shp_y, - I_FOOD, (ifood_eaten - vec[I_FOOD])); + I_FOOD, ifood_eaten - vec[I_FOOD]); - if (food_eaten > vec[I_FOOD]) { /* doit - only steal food from land units during the update */ - if (sp->shp_nland > 0 && doit) { - snxtitem_all(&ni, EF_LAND); - while ((lp = (struct lndstr *)nxtitemp(&ni, 0)) && - (food_eaten > vec[I_FOOD])) { - if (lp->lnd_ship != sp->shp_uid) - continue; - need = ifood_eaten - vec[I_FOOD]; - land_eaten = (etus * eatrate) * (double)lnd_getmil(lp); - if (lp->lnd_item[I_FOOD] - need > land_eaten) { - vec[I_FOOD] += need; - lp->lnd_item[I_FOOD] -= need; - } else if (lp->lnd_item[I_FOOD] - land_eaten > 0) { - vec[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] && sp->shp_nland > 0 && doit) { + snxtitem_all(&ni, EF_LAND); + while ((lp = (struct lndstr *)nxtitemp(&ni, 0)) && + ifood_eaten > vec[I_FOOD]) { + if (lp->lnd_ship != sp->shp_uid) + continue; + need = ifood_eaten - vec[I_FOOD]; + land_eaten = etus * eatrate * lnd_getmil(lp); + if (lp->lnd_item[I_FOOD] - need > land_eaten) { + vec[I_FOOD] += need; + lp->lnd_item[I_FOOD] -= need; + } else if (lp->lnd_item[I_FOOD] - land_eaten > 0) { + vec[I_FOOD] += lp->lnd_item[I_FOOD] - land_eaten; + lp->lnd_item[I_FOOD] -= lp->lnd_item[I_FOOD] - land_eaten; } } } - if (food_eaten > vec[I_FOOD]) { - *needed = food_eaten - vec[I_FOOD]; - if (*needed < (food_eaten - vec[I_FOOD])) - (*needed)++; - can_eat = (vec[I_FOOD] / (etus * eatrate)); - total_people = vec[I_CIVIL] + vec[I_MILIT] + vec[I_UW]; - + if (ifood_eaten > vec[I_FOOD]) { + *needed = ifood_eaten - vec[I_FOOD]; + can_eat = vec[I_FOOD] / (etus * eatrate); /* 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; to_starve = total_people - can_eat;