From: Markus Armbruster Date: Sat, 4 Jun 2016 08:55:44 +0000 (+0200) Subject: neweff prod work: Use update code instead of duplicating it X-Git-Tag: v4.4.0~246 X-Git-Url: http://git.pond.sub.org/?p=empserver;a=commitdiff_plain;h=b7b99c95c2b1063e13370219e0f1e5ec5cf30dfc neweff prod work: Use update code instead of duplicating it The code to build sectors got quadruplicated in Chainsaw. We've since fixed numerous inconsistencies, but still have four copies of the code. Thanks to the recent work on upd_buildeff(), we can now use it to replace the other three copies. Rename it back to to buildeff() while there. Signed-off-by: Markus Armbruster --- diff --git a/include/prototypes.h b/include/prototypes.h index 2d6576c6e..05332517e 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -713,6 +713,7 @@ extern int update_removewants(void); extern void revolt(struct sctstr *); extern void guerrilla(struct sctstr *); /* sect.c */ +extern int buildeff(struct sctstr *); extern void do_fallout(struct sctstr *, int); extern void spread_fallout(struct sctstr *, int); extern void decay_fallout(struct sctstr *, int); diff --git a/src/lib/commands/newe.c b/src/lib/commands/newe.c index 5351c78e4..0ebd816cc 100644 --- a/src/lib/commands/newe.c +++ b/src/lib/commands/newe.c @@ -43,12 +43,7 @@ newe(void) struct natstr *natp; struct sctstr sect; struct nstr_sect nstr; - double work, lcms, hcms; int nsect; - int bwork; - int twork; - int type; - int eff; if (!snxtsct(&nstr, player->argp[1])) return RET_SYN; @@ -60,70 +55,16 @@ newe(void) continue; if (!sect.sct_off) { 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 = (int)(lcms / dchr[type].d_lcms); - if (twork > lcms) - twork = lcms; - } - if (dchr[type].d_hcms > 0) { - hcms = sect.sct_item[I_HCM]; - hcms = (int)(hcms / dchr[type].d_hcms); - if (twork > hcms) - twork = hcms; - } - eff += twork; - } else if (eff < 100) { - twork = 100 - eff; - if (twork > bwork) { - twork = bwork; - } - if (dchr[type].d_lcms > 0) { - lcms = sect.sct_item[I_LCM]; - lcms = (int)(lcms / dchr[type].d_lcms); - if (twork > lcms) - twork = lcms; - } - if (dchr[type].d_hcms > 0) { - hcms = sect.sct_item[I_HCM]; - hcms = (int)(hcms / dchr[type].d_hcms); - if (twork > hcms) - twork = hcms; - } - eff += twork; - } - } else { - eff = sect.sct_effic; - type = sect.sct_type; + sect.sct_avail = do_feed(§, natp, etu_per_update, 1); + buildeff(§); } if (nsect++ == 0) { pr("EFFICIENCY SIMULATION\n"); pr(" sect des projected eff\n"); } prxy("%4d,%-4d", nstr.x, nstr.y); - pr(" %c", dchr[type].d_mnem); - pr(" %3d%%\n", eff); + pr(" %c", dchr[sect.sct_type].d_mnem); + pr(" %3d%%\n", sect.sct_effic); } player->simulation = 0; if (nsect == 0) { diff --git a/src/lib/commands/prod.c b/src/lib/commands/prod.c index 60ed59aa0..6bd35fc9e 100644 --- a/src/lib/commands/prod.c +++ b/src/lib/commands/prod.c @@ -39,7 +39,7 @@ #include "optlist.h" #include "product.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 @@ -70,7 +70,6 @@ prod(void) 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; @@ -88,11 +87,6 @@ prod(void) 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 +101,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) + sect.sct_avail = 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,15 +123,15 @@ 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]; + pp = &pchr[dchr[sect.sct_type].d_prd]; vtype = pp->p_type; if (pp->p_nrndx) resource = (unsigned char *)§ + pp->p_nrndx; @@ -188,7 +141,7 @@ prod(void) mat_limit = prod_materials_cost(pp, sect.sct_item, &unit_work); /* sector p.e. */ - p_e = eff / 100.0; + p_e = sect.sct_effic / 100.0; if (resource) { unit_work++; p_e *= *resource / 100.0; @@ -196,7 +149,7 @@ prod(void) if (unit_work == 0) unit_work = 1; - worker_limit = work * p_e / (double)unit_work; + worker_limit = sect.sct_avail * p_e / (double)unit_work; res_limit = prod_resource_limit(pp, resource); max_consume = res_limit; @@ -204,7 +157,7 @@ prod(void) max_consume = (int)worker_limit; material_consume = MIN(max_consume, mat_limit); - prodeff = prod_eff(type, natp->nat_level[pp->p_nlndx]); + prodeff = prod_eff(sect.sct_type, natp->nat_level[pp->p_nlndx]); real = (double)material_consume * prodeff; maxr = (double)max_consume * prodeff; @@ -251,8 +204,7 @@ prod(void) 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 +220,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 +231,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 diff --git a/src/lib/commands/work.c b/src/lib/commands/work.c index 5a9496430..66fd45218 100644 --- a/src/lib/commands/work.c +++ b/src/lib/commands/work.c @@ -27,7 +27,7 @@ * work.c: Implementation of the work command * * Known contributors to this file: - * Markus Armbruster, 2009-2010 + * Markus Armbruster, 2009-2016 */ #include @@ -37,8 +37,6 @@ #include "land.h" #include "optlist.h" -static int buildeff(struct sctstr *, int, double *); - int work(void) { @@ -46,7 +44,7 @@ work(void) struct nstr_item ni; struct sctstr sect; struct lndstr land; - int work_amt, eff_amt, w; + int work_amt, eff_amt, w, sect_avail; char *p; char buf[1024]; double cost; @@ -85,8 +83,11 @@ work(void) prland(&land)); continue; } - cost = 0.0; - w = buildeff(§, w, &cost); + sect_avail = sect.sct_avail; + sect.sct_avail = w; + cost = buildeff(§); + w = sect.sct_avail - sect_avail; + sect.sct_avail = sect_avail; if (w == 0) { pr("%s can't change efficiency in %s\n", prland(&land), xyas(land.lnd_x, land.lnd_y, player->cnum)); @@ -119,59 +120,3 @@ work(void) pr("%d unit%s\n", nunits, splur(nunits)); return RET_OK; } - -static int -buildeff(struct sctstr *sp, int work, double *money) -{ - int work_cost; - int n, hcms, lcms; - int effdone = 0; - - if (sp->sct_type != sp->sct_newtype) { - /* - * Tear down existing sector. - * Easier to destroy than to build. - */ - work_cost = (sp->sct_effic + 3) / 4; - if (work_cost > work) - work_cost = work; - n = sp->sct_effic - work_cost * 4; - if (n <= 0) { - n = 0; - sp->sct_type = sp->sct_newtype; - } - sp->sct_effic = n; - work -= work_cost; - *money += work_cost; - effdone += work_cost; - } - if (sp->sct_type == sp->sct_newtype) { - work_cost = 100 - sp->sct_effic; - if (work_cost > work) - work_cost = work; - - if (dchr[sp->sct_type].d_lcms > 0) { - lcms = sp->sct_item[I_LCM]; - lcms /= dchr[sp->sct_type].d_lcms; - if (work_cost > lcms) - work_cost = lcms; - } - if (dchr[sp->sct_type].d_hcms > 0) { - hcms = sp->sct_item[I_HCM]; - hcms /= dchr[sp->sct_type].d_hcms; - if (work_cost > hcms) - work_cost = hcms; - } - - sp->sct_effic += work_cost; - *money += work_cost * dchr[sp->sct_type].d_build; - - if ((dchr[sp->sct_type].d_lcms > 0) || - (dchr[sp->sct_type].d_hcms > 0)) { - sp->sct_item[I_LCM] -= work_cost * dchr[sp->sct_type].d_lcms; - sp->sct_item[I_HCM] -= work_cost * dchr[sp->sct_type].d_hcms; - } - effdone += work_cost; - } - return effdone; -} diff --git a/src/lib/update/sect.c b/src/lib/update/sect.c index 152e9216b..d3127f46a 100644 --- a/src/lib/update/sect.c +++ b/src/lib/update/sect.c @@ -44,8 +44,8 @@ #include "ship.h" #include "update.h" -static int -upd_buildeff(struct sctstr *sp) +int +buildeff(struct sctstr *sp) { int work_cost = 0; int avail = sp->sct_avail; @@ -304,7 +304,7 @@ produce_sect(struct natstr *np, int etu, struct bp *bp, int p_sect[][2]) if ((sp->sct_effic < 100 || sp->sct_type != sp->sct_newtype) && np->nat_money >= 0) { - cost = upd_buildeff(sp); + cost = buildeff(sp); bp_put_items(bp, sp); p_sect[SCT_EFFIC][0]++; p_sect[SCT_EFFIC][1] += cost;