From ac9cdf5bb930d89d8d2478841508c0a038697efc Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 10 Jan 2007 07:15:45 +0000 Subject: [PATCH] (get_materials): Redesign. (shiprepair, planerepair, landrepair): Use it. Behavioral change: ship repairs outside harbors and plane repairs by a carrier can use fewer materials. Before, such repairs consumed each required commodity as far as available. Now, they consume the same fraction of the real cost of each commodity, i.e. commodity use is limited by the most scarce commodity. Neither old nor new behavior make much sense, but the new code is simpler. --- include/budg.h | 2 +- src/lib/update/land.c | 55 +++++---------------------------------- src/lib/update/material.c | 50 +++++++++++++++++++++-------------- src/lib/update/plane.c | 36 +++++-------------------- src/lib/update/ship.c | 35 +++++-------------------- 5 files changed, 51 insertions(+), 127 deletions(-) diff --git a/include/budg.h b/include/budg.h index 2c0b51d8..6bb5d119 100644 --- a/include/budg.h +++ b/include/budg.h @@ -42,7 +42,7 @@ void fill_update_array(int *bp, struct sctstr *sp); int gt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm); void pt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm, int amount); -void get_materials(struct sctstr *sp, int *bp, int *mvec, int check); +int get_materials(struct sctstr *, int *, int *, int); extern long money[MAXNOC]; extern long pops[MAXNOC]; diff --git a/src/lib/update/land.c b/src/lib/update/land.c index 7c12a007..ece5cf05 100644 --- a/src/lib/update/land.c +++ b/src/lib/update/land.c @@ -213,16 +213,13 @@ upd_land(struct lndstr *lp, int etus, } } -/*ARGSUSED*/ static void landrepair(struct lndstr *land, struct natstr *np, int *bp, int etus) { int delta; struct sctstr *sp; struct lchrstr *lp; - float leftp, buildp; - int left, build; - int mil_needed, lcm_needed, hcm_needed, gun_needed, shell_needed; + int build; int avail; int w_p_eff; int mult; @@ -255,53 +252,13 @@ landrepair(struct lndstr *land, struct natstr *np, int *bp, int etus) return; if (delta > (int)((float)etus * land_grow_scale)) delta = (int)((float)etus * land_grow_scale); - - /* delta is the max amount we can grow */ - - left = 100 - land->lnd_effic; - if (left > delta) - left = delta; - - leftp = left / 100.0; + if (delta > 100 - land->lnd_effic) + delta = 100 - land->lnd_effic; memset(mvec, 0, sizeof(mvec)); - mvec[I_LCM] = lcm_needed = ldround(lp->l_lcm * leftp, 1); - mvec[I_HCM] = hcm_needed = ldround(lp->l_hcm * leftp, 1); -/* - mvec[I_GUN] = gun_needed = ldround(lp->l_gun * leftp, 1); - mvec[I_MILIT] = mil_needed = ldround(lp->l_mil * leftp, 1); - mvec[I_SHELL] = shell_needed = ldround(lp->l_shell *leftp, 1); - */ - mvec[I_GUN] = gun_needed = 0; - mvec[I_MILIT] = mil_needed = 0; - mvec[I_SHELL] = shell_needed = 0; - get_materials(sp, bp, mvec, 0); - - buildp = leftp; - if (mvec[I_MILIT] < mil_needed) - buildp = MIN(buildp, (float)mvec[I_MILIT] / (float)lp->l_mil); - if (mvec[I_LCM] < lcm_needed) - buildp = MIN(buildp, (float)mvec[I_LCM] / (float)lp->l_lcm); - if (mvec[I_HCM] < hcm_needed) - buildp = MIN(buildp, (float)mvec[I_HCM] / (float)lp->l_hcm); - if (mvec[I_GUN] < gun_needed) - buildp = MIN(buildp, (float)mvec[I_GUN] / (float)lp->l_gun); - if (mvec[I_SHELL] < shell_needed) - buildp = MIN(buildp, (float)mvec[I_SHELL] / (float)lp->l_shell); - - build = ldround(buildp * 100.0, 1); - memset(mvec, 0, sizeof(mvec)); - mvec[I_LCM] = roundavg(lp->l_lcm * buildp); - mvec[I_HCM] = roundavg(lp->l_hcm * buildp); -/* - mvec[I_GUN] = roundavg(lp->l_gun * buildp); - mvec[I_MILIT] = roundavg(lp->l_mil * buildp); - mvec[I_SHELL] = roundavg(lp->l_shell *buildp); - */ - mvec[I_GUN] = 0; - mvec[I_MILIT] = 0; - mvec[I_SHELL] = 0; - get_materials(sp, bp, mvec, 1); + mvec[I_LCM] = lp->l_lcm; + mvec[I_HCM] = lp->l_hcm; + build = get_materials(sp, bp, mvec, delta); if ((sp->sct_type != SCT_HEADQ) && (sp->sct_type != SCT_FORTR)) build /= 3; diff --git a/src/lib/update/material.c b/src/lib/update/material.c index ab0155cb..5b733ef2 100644 --- a/src/lib/update/material.c +++ b/src/lib/update/material.c @@ -29,6 +29,7 @@ * * Known contributors to this file: * Ville Virrankoski, 1996 + * Markus Armbruster, 2007 */ #include @@ -37,30 +38,39 @@ #include "player.h" #include "update.h" -void -get_materials(struct sctstr *sp, int *bp, int *mvec, int check) - /* only check if found=0, remove them=1 */ +/* + * Get build materials from sector SP. + * BP is the sector's build pointer. + * MVEC[] defines the materials needed to build 100%. + * PCT is the percentage to build. + * Adjust build percentage downwards so that available materials + * suffice. Remove the materials. + * Return adjusted build percentage. + */ +int +get_materials(struct sctstr *sp, int *bp, int *mvec, int pct) { - i_type i; - int still_left; + int i, amt; for (i = I_NONE + 1; i <= I_MAX; i++) { if (mvec[i] == 0) continue; - - if (check) { - still_left = gt_bg_nmbr(bp, sp, i); - if ((still_left - mvec[i]) < 0) - still_left = 0; - else - still_left -= mvec[i]; - pt_bg_nmbr(bp, sp, i, still_left); - if (!player->simulation) - sp->sct_item[i] = still_left; - - } else { - still_left = gt_bg_nmbr(bp, sp, i); - mvec[i] = MIN(mvec[i], still_left); - } + amt = gt_bg_nmbr(bp, sp, i); + if (amt * 100 < mvec[i] * pct) + pct = amt * 100 / mvec[i]; } + + for (i = I_NONE + 1; i <= I_MAX; i++) { + if (mvec[i] == 0) + continue; + amt = gt_bg_nmbr(bp, sp, i); + amt -= roundavg(mvec[i] * pct / 100.0); + if (CANT_HAPPEN(amt < 0)) + amt = 0; + pt_bg_nmbr(bp, sp, i, amt); + if (!player->simulation) + sp->sct_item[i] = amt; + } + + return pct; } diff --git a/src/lib/update/plane.c b/src/lib/update/plane.c index 499c074f..97fdc078 100644 --- a/src/lib/update/plane.c +++ b/src/lib/update/plane.c @@ -127,9 +127,7 @@ upd_plane(struct plnstr *pp, int etus, static void planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus) { - float leftp, buildp; - int left, build; - int mil_needed, lcm_needed, hcm_needed; + int build; int mvec[I_MAX + 1]; struct shpstr *carrier; struct plchrstr *pcp = &plchr[(int)pp->pln_type]; @@ -180,34 +178,14 @@ planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus) return; if (delta > (int)((float)etus * plane_grow_scale)) delta = (int)((float)etus * plane_grow_scale); + if (delta > 100 - pp->pln_effic) + delta = 100 - pp->pln_effic; - /* delta is the max amount we can grow */ - - left = 100 - pp->pln_effic; - if (left > delta) - left = delta; - - leftp = left / 100.0; memset(mvec, 0, sizeof(mvec)); - mvec[I_MILIT] = mil_needed = ldround(pcp->pl_crew * leftp, 1); - mvec[I_LCM] = lcm_needed = ldround(pcp->pl_lcm * leftp, 1); - mvec[I_HCM] = hcm_needed = ldround(pcp->pl_hcm * leftp, 1); - get_materials(sp, bp, mvec, 0); - - buildp = leftp; - if (mvec[I_MILIT] < mil_needed) - buildp = MIN(buildp, (float)mvec[I_MILIT] / (float)pcp->pl_crew); - if (mvec[I_LCM] < lcm_needed) - buildp = MIN(buildp, (float)mvec[I_LCM] / (float)pcp->pl_lcm); - if (mvec[I_HCM] < hcm_needed) - buildp = MIN(buildp, (float)mvec[I_HCM] / (float)pcp->pl_hcm); - - build = ldround(buildp * 100.0, 1); - memset(mvec, 0, sizeof(mvec)); - mvec[I_MILIT] = roundavg(pcp->pl_crew * buildp); - mvec[I_LCM] = roundavg(pcp->pl_lcm * buildp); - mvec[I_HCM] = roundavg(pcp->pl_hcm * buildp); - get_materials(sp, bp, mvec, 1); + mvec[I_MILIT] = pcp->pl_crew; + mvec[I_LCM] = pcp->pl_lcm; + mvec[I_HCM] = pcp->pl_hcm; + build = get_materials(sp, bp, mvec, delta); if (carrier) build = delta; diff --git a/src/lib/update/ship.c b/src/lib/update/ship.c index 1c58b0c1..fd5863f2 100644 --- a/src/lib/update/ship.c +++ b/src/lib/update/ship.c @@ -271,9 +271,7 @@ shiprepair(struct shpstr *ship, struct natstr *np, int *bp, int etus) int delta; struct sctstr *sp; struct mchrstr *mp; - float leftp, buildp; - int left, build; - int lcm_needed, hcm_needed; + int build; int wf; int avail; int w_p_eff; @@ -322,41 +320,22 @@ shiprepair(struct shpstr *ship, struct natstr *np, int *bp, int etus) return; } - left = 100 - ship->shp_effic; delta = roundavg((double)avail / w_p_eff); if (delta <= 0) return; if (delta > (int)((float)etus * ship_grow_scale)) delta = (int)((float)etus * ship_grow_scale); - if (delta > left) - delta = left; + if (delta > 100 - ship->shp_effic) + delta = 100 - ship->shp_effic; - /* delta is the max amount we can grow */ - - left = 100 - ship->shp_effic; - if (left > delta) - left = delta; - - leftp = left / 100.0; memset(mvec, 0, sizeof(mvec)); - mvec[I_LCM] = lcm_needed = ldround(mp->m_lcm * leftp, 1); - mvec[I_HCM] = hcm_needed = ldround(mp->m_hcm * leftp, 1); - get_materials(sp, bp, mvec, 0); - - buildp = leftp; - if (mvec[I_LCM] < lcm_needed) - buildp = MIN(buildp, (float)mvec[I_LCM] / (float)mp->m_lcm); - if (mvec[I_HCM] < hcm_needed) - buildp = MIN(buildp, (float)mvec[I_HCM] / (float)mp->m_hcm); - - build = ldround(buildp * 100.0, 1); - memset(mvec, 0, sizeof(mvec)); - mvec[I_LCM] = roundavg(mp->m_lcm * buildp); - mvec[I_HCM] = roundavg(mp->m_hcm * buildp); - get_materials(sp, bp, mvec, 1); + mvec[I_LCM] = mp->m_lcm; + mvec[I_HCM] = mp->m_hcm; + build = get_materials(sp, bp, mvec, delta); if (sp->sct_type != SCT_HARBR) build = delta; + wf -= build * w_p_eff; if (wf < 0) { /*