X-Git-Url: http://git.pond.sub.org/?p=empserver;a=blobdiff_plain;f=src%2Flib%2Fcommands%2Fprod.c;h=86cd78479e66b02fc13dc7fdc4d874558b9fc563;hp=60ed59aa06d59aa2e8b0572eb67f832f54481fc0;hb=4a714a37d;hpb=41a2f7d1df923b8742785784a8e66d034b93012d diff --git a/src/lib/commands/prod.c b/src/lib/commands/prod.c index 60ed59aa0..86cd78479 100644 --- a/src/lib/commands/prod.c +++ b/src/lib/commands/prod.c @@ -34,12 +34,14 @@ #include +#include #include "commands.h" #include "item.h" #include "optlist.h" #include "product.h" +#include "update.h" -static void prprod(coord, coord, int, double, double, int, char, +static void prprod(struct sctstr *, double, double, char, double, double, double, char[], int[], int[], int); int @@ -63,36 +65,21 @@ int prod(void) { struct natstr *natp; - struct sctstr sect; + struct sctstr sect, scratch_sect; struct nstr_sect nstr; struct pchrstr *pp; double p_e; - double maxr; /* floating version of max */ double prodeff; - double real; /* floating pt version of act */ - int work; int totpop; - int material_consume; /* actual production */ double cost; int i; - int max_consume; /* production w/infinite materials */ int nsect; - double take; - double mtake; - int there; - int unit_work; /* sum of component amounts */ - int mat_limit, res_limit; - double worker_limit; + double real, maxr; + double take, mtake; i_type it; - i_type vtype; unsigned char *resource; char cmnem[MAXPRCON]; int cuse[MAXPRCON], cmax[MAXPRCON]; - int lcms, hcms; - int bwork; - int twork; - int type; - int eff; char mnem; if (!snxtsct(&nstr, player->argp[1])) @@ -107,53 +94,12 @@ prod(void) continue; natp = getnatp(sect.sct_own); - work = do_feed(§, natp, etu_per_update, 1); - bwork = work / 2; - - type = sect.sct_type; - eff = sect.sct_effic; - if (sect.sct_newtype != type) { - twork = (eff + 3) / 4; - if (twork > bwork) { - twork = bwork; - } - bwork -= twork; - eff -= twork * 4; - if (eff <= 0) { - type = sect.sct_newtype; - eff = 0; - } - twork = 100 - eff; - if (twork > bwork) { - twork = bwork; - } - if (dchr[type].d_lcms > 0) { - lcms = sect.sct_item[I_LCM]; - lcms /= dchr[type].d_lcms; - if (twork > lcms) - twork = lcms; - } - if (dchr[type].d_hcms > 0) { - hcms = sect.sct_item[I_HCM]; - hcms /= dchr[type].d_hcms; - if (twork > hcms) - twork = hcms; - } - bwork -= twork; - eff += twork; - } else if (eff < 100) { - twork = 100 - eff; - if (twork > bwork) { - twork = bwork; - } - bwork -= twork; - eff += twork; - } - work = (work + 1) / 2 + bwork; - if (eff < 60) + do_feed(§, natp, etu_per_update, 1); + buildeff(§); + if (sect.sct_effic < 60) continue; - if (type == SCT_ENLIST) { + if (sect.sct_type == SCT_ENLIST) { int maxmil; int enlisted; @@ -170,53 +116,35 @@ prod(void) } if (enlisted < 0) enlisted = 0; - prprod(sect.sct_x, sect.sct_y, type, eff / 100.0, 1.0, work, + prprod(§, sect.sct_effic / 100.0, 1.0, ichr[I_MILIT].i_mnem, enlisted, maxmil, enlisted * 3, "c\0\0", &enlisted, &enlisted, nsect++); continue; } - if (dchr[type].d_prd < 0) + if (dchr[sect.sct_type].d_prd < 0) continue; - pp = &pchr[dchr[type].d_prd]; - vtype = pp->p_type; + pp = &pchr[dchr[sect.sct_type].d_prd]; if (pp->p_nrndx) resource = (unsigned char *)§ + pp->p_nrndx; else resource = NULL; - mat_limit = prod_materials_cost(pp, sect.sct_item, &unit_work); - /* sector p.e. */ - p_e = eff / 100.0; - if (resource) { - unit_work++; + p_e = sect.sct_effic / 100.0; + if (resource) p_e *= *resource / 100.0; - } - if (unit_work == 0) - unit_work = 1; - - worker_limit = work * p_e / (double)unit_work; - res_limit = prod_resource_limit(pp, resource); - max_consume = res_limit; - if (max_consume > worker_limit) - max_consume = (int)worker_limit; - material_consume = MIN(max_consume, mat_limit); + prodeff = prod_eff(sect.sct_type, natp->nat_level[pp->p_nlndx]); - prodeff = prod_eff(type, natp->nat_level[pp->p_nlndx]); - real = (double)material_consume * prodeff; - maxr = (double)max_consume * prodeff; + scratch_sect = sect; + real = prod_output(&scratch_sect, prodeff); - if (vtype != I_NONE) { - real = MIN(999.0, real); - maxr = MIN(999.0, maxr); - if (real < 0.0) - real = 0.0; - /* production backlog? */ - there = MIN(ITEM_MAX, sect.sct_item[vtype]); - real = MIN(real, ITEM_MAX - there); - } + scratch_sect = sect; + for (i = 0; i < MAXPRCON; ++i) + scratch_sect.sct_item[pp->p_ctype[i]] = ITEM_MAX; + scratch_sect.sct_item[pp->p_type] = 0; + maxr = prod_output(&scratch_sect, prodeff); if (prodeff != 0) { take = real / prodeff; @@ -241,18 +169,17 @@ prod(void) if (CANT_HAPPEN(it <= I_NONE || I_MAX < it)) continue; cmnem[i] = ichr[it].i_mnem; - cuse[i] = (int)(take * pp->p_camt[i] + 0.5); - cmax[i] = (int)(mtake * pp->p_camt[i] + 0.5); + cuse[i] = (int)ceil(take * pp->p_camt[i]); + cmax[i] = (int)ceil(mtake * pp->p_camt[i]); } if (pp->p_type != I_NONE) - mnem = ichr[vtype].i_mnem; + mnem = ichr[pp->p_type].i_mnem; else if (pp->p_level == NAT_TLEV || pp->p_level == NAT_RLEV) mnem = '.'; else mnem = 0; - prprod(sect.sct_x, sect.sct_y, type, p_e, prodeff, work, - mnem, real, maxr, cost, + prprod(§, p_e, prodeff, mnem, real, maxr, cost, cmnem, cuse, cmax, nsect++); } player->simulation = 0; @@ -268,7 +195,7 @@ prod(void) } static void -prprod(coord x, coord y, int type, double p_e, double prodeff, int work, +prprod(struct sctstr *sp, double p_e, double prodeff, char mnem, double make, double max, double cost, char cmnem[], int cuse[], int cmax[], int nsect) { @@ -279,8 +206,9 @@ prprod(coord x, coord y, int type, double p_e, double prodeff, int work, pr(" sect des eff avail make p.e. cost use1 use2 use3 max1 max2 max3 max\n"); } - prxy("%4d,%-4d", x, y); - pr(" %c %3.0f%% %5d", dchr[type].d_mnem, p_e * 100.0, work); + prxy("%4d,%-4d", sp->sct_x, sp->sct_y); + pr(" %c %3.0f%% %5d", + dchr[sp->sct_type].d_mnem, p_e * 100.0, sp->sct_avail); if (mnem == '.') pr(" %5.2f", make); else