diff --git a/include/prototypes.h b/include/prototypes.h index 5caf8404..e001a6c2 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -774,8 +774,7 @@ extern int plague_people(struct natstr *, short *, int *, int *, int); extern int prod_plane(int, int, int *, int); /* populace.c */ extern void populace(struct natstr *, register struct sctstr *, int); -extern int total_work(register int, register int, register int, - register int, register int); +extern int total_work(int, int, int, int, int, int); /* prepare.c */ extern void tax(struct sctstr *, struct natstr *, int, long *, int *, int *, int *); diff --git a/src/lib/commands/newe.c b/src/lib/commands/newe.c index 0b82d3ff..ea7a083d 100644 --- a/src/lib/commands/newe.c +++ b/src/lib/commands/newe.c @@ -71,14 +71,12 @@ newe(void) uws = (1.0 + uwbrate * etu_per_update) * sect.sct_item[I_UW]; natp = getnatp(sect.sct_own); maxpop = max_pop(natp->nat_level[NAT_RLEV], §); - civs = min(civs, maxpop); - uws = min(uws, maxpop); /* This isn't quite right, since research might rise/fall */ /* during the update, but it's the best we can really do */ - wforce = (int)((civs * sect.sct_work) / 100.0 - + uws + sect.sct_item[I_MILIT] * 2 / 5.0); - - work = new_work(§, wforce * etu_per_update / 100); + work = new_work(§, + total_work(sect.sct_work, etu_per_update, + civs, sect.sct_item[I_MILIT], uws, + maxpop)); bwork = work / 2; type = sect.sct_type; diff --git a/src/lib/commands/prod.c b/src/lib/commands/prod.c index 3e2f97d9..eb425ca2 100644 --- a/src/lib/commands/prod.c +++ b/src/lib/commands/prod.c @@ -84,7 +84,6 @@ prod(void) int there; int unit_work; /* sum of component amounts */ int used; /* production w/infinite workforce */ - int wforce; i_type it; i_type vtype; u_char *resource; @@ -113,15 +112,12 @@ prod(void) uws = (1.0 + uwbrate * etu_per_update) * sect.sct_item[I_UW]; natp = getnatp(sect.sct_own); maxpop = max_pop(natp->nat_level[NAT_RLEV], §); - civs = min(civs, maxpop); - uws = min(uws, maxpop); /* This isn't quite right, since research might rise/fall */ /* during the update, but it's the best we can really do */ - wforce = (int)(((double)civs * sect.sct_work) / 100.0 - + uws - + sect.sct_item[I_MILIT] * 2.0 / 5.0); - work = new_work(§, wforce * etu_per_update / 100); + work = new_work(§, + total_work(sect.sct_work, etu_per_update, + civs, sect.sct_item[I_MILIT], uws, maxpop)); bwork = work / 2; if (sect.sct_off) @@ -146,13 +142,11 @@ prod(void) natp = getnatp(sect.sct_own); maxpop = max_population(natp->nat_level[NAT_RLEV], type, eff); - civs = min(civs, maxpop); - uws = min(uws, maxpop); - wforce = (int)(((double)civs * sect.sct_work) / 100.0 - + uws - + sect.sct_item[I_MILIT] * 2 / 5.0); - work = etu_per_update * wforce / 100; - bwork = min((int)(work / 2), bwork); + work = new_work(§, + total_work(sect.sct_work, etu_per_update, + civs, sect.sct_item[I_MILIT], + uws, maxpop)); + bwork = min(work / 2, bwork); } } twork = 100 - eff; diff --git a/src/lib/update/human.c b/src/lib/update/human.c index a06d34ef..ae4c752f 100644 --- a/src/lib/update/human.c +++ b/src/lib/update/human.c @@ -65,19 +65,17 @@ do_feed(struct sctstr *sp, struct natstr *np, short *vec, int people; int work_avail; int starved, sctwork; - int needed, dummy; - int civvies, uws; - int mil; + int needed; int maxpop; /* grow people & stuff */ sctwork = sp->sct_work; maxpop = max_pop(np->nat_level[NAT_RLEV], sp); - civvies = (vec[I_CIVIL] > maxpop) ? maxpop : vec[I_CIVIL]; - uws = (vec[I_UW] > maxpop) ? maxpop : vec[I_UW]; - mil = (vec[I_MILIT] > maxpop) ? maxpop : vec[I_MILIT]; - work_avail = new_work(sp, total_work(sctwork, etu, civvies, mil, uws)); + work_avail = new_work(sp, + total_work(sctwork, etu, + vec[I_CIVIL], vec[I_MILIT], vec[I_UW], + maxpop)); people = vec[I_CIVIL] + vec[I_MILIT] + vec[I_UW]; if (sp->sct_type != SCT_SANCT) { @@ -126,7 +124,7 @@ do_feed(struct sctstr *sp, struct natstr *np, short *vec, sctwork = 100; if (!player->simulation) sp->sct_work = sctwork; - dummy = grow_people(sp, etu, np, &work_avail, sctwork, vec); + grow_people(sp, etu, np, &work_avail, sctwork, vec); } } else sctwork = sp->sct_work = 100; @@ -307,7 +305,7 @@ grow_people(struct sctstr *sp, int etu, */ if (opt_NOFOOD == 0 && (newciv || newuw)) vec[I_FOOD] -= roundavg((newciv + newuw) * babyeat); - *workp += total_work(sctwork, etu, newciv, 0, newuw); + *workp += total_work(sctwork, etu, newciv, 0, newuw, ITEM_MAX); return newciv + newuw; } diff --git a/src/lib/update/populace.c b/src/lib/update/populace.c index bbc8100b..987362da 100644 --- a/src/lib/update/populace.c +++ b/src/lib/update/populace.c @@ -131,9 +131,14 @@ populace(struct natstr *np, struct sctstr *sp, int etu) } int -total_work(int sctwork, int etu, int civil, - int milit, int uw) +total_work(int sctwork, int etu, int civil, int milit, int uw, int maxpop) { - return ((int)((((civil * sctwork) / 100.0 + - (milit * 2 / 5.0) + uw)) * etu) / 100); + if (civil > maxpop) + civil = maxpop; + if (milit > maxpop) + milit = maxpop; + if (uw > maxpop) + uw = maxpop; + + return (civil * sctwork / 100.0 + milit * 0.4 + uw) * etu / 100.0; } diff --git a/src/lib/update/ship.c b/src/lib/update/ship.c index dedd6634..0db3d727 100644 --- a/src/lib/update/ship.c +++ b/src/lib/update/ship.c @@ -172,7 +172,8 @@ upd_ship(struct shpstr *sp, int etus, oil_gained = roundavg(total_work(100, etus, sp->shp_item[I_CIVIL], sp->shp_item[I_MILIT], - sp->shp_item[I_UW]) + sp->shp_item[I_UW], + ITEM_MAX) * (double)sp->shp_effic / 100.0 * (double)sectp->sct_oil / 100.0 * prod_eff(product, sp->shp_tech)); @@ -190,13 +191,15 @@ upd_ship(struct shpstr *sp, int etus, } if ((mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) { product = &pchr[P_FOOD]; - sp->shp_item[I_FOOD] += roundavg(total_work(100, etus, - sp->shp_item[I_CIVIL], - sp->shp_item[I_MILIT], - sp->shp_item[I_UW]) - * (double)sp->shp_effic / 100.0 - * (double)sectp->sct_fertil / 100.0 - * prod_eff(product, sp->shp_tech)); + sp->shp_item[I_FOOD] + += roundavg(total_work(100, etus, + sp->shp_item[I_CIVIL], + sp->shp_item[I_MILIT], + sp->shp_item[I_UW], + ITEM_MAX) + * sp->shp_effic / 100.0 + * sectp->sct_fertil / 100.0 + * prod_eff(product, sp->shp_tech)); } if ((n = feed_ship(sp, etus, &needed, 1)) > 0) { wu(0, sp->shp_own, "%d starved on %s\n", n, prship(sp));