(total_work): New parameter maxpop. Callers changed.
(newe, prod): Use total_work(). Old code failed to limit military
workers, thus didn't match the update.
(do_feed): Simplify.
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 *);
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;
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;
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)
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;
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) {
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;
*/
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;
}
}
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;
}
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));
}
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));