diff --git a/include/budg.h b/include/budg.h index f16cd865..0a5b452e 100644 --- a/include/budg.h +++ b/include/budg.h @@ -48,8 +48,7 @@ void bp_put_item(struct bp *, struct sctstr *, i_type, int); void bp_put_items(struct bp *, struct sctstr *); int bp_get_avail(struct bp *, struct sctstr *); void bp_put_avail(struct bp *, struct sctstr *, int); - -int get_materials(struct sctstr *, struct bp *, short[], int); +void bp_to_sect(struct bp *, struct sctstr *); extern int money[MAXNOC]; extern int pops[MAXNOC]; diff --git a/include/prototypes.h b/include/prototypes.h index 950e25e3..fd3a20ac 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -672,7 +672,7 @@ extern int prod_land(int, int, struct bp *, int); /* main.c */ /* in server.h */ /* material.c */ -/* in budg.h */ +extern int get_materials(struct sctstr *, short[], int); /* mobility.c */ extern void mob_sect(void); extern void mob_ship(void); diff --git a/src/lib/update/bp.c b/src/lib/update/bp.c index 0041c334..020cf1c2 100644 --- a/src/lib/update/bp.c +++ b/src/lib/update/bp.c @@ -132,6 +132,21 @@ bp_set_from_sect(struct bp *bp, struct sctstr *sp) bp_put_avail(bp, sp, sp->sct_avail); } +/* Copy the values tracked in @bp for sector @sp back to @sp. */ +void +bp_to_sect(struct bp *bp, struct sctstr *sp) +{ + i_type i; + enum bp_item_idx idx; + + for (i = I_NONE + 1; i <= I_MAX; i++) { + idx = bud_key[i]; + if (idx >= 0) + sp->sct_item[i] = bp[sp->sct_uid].bp_item[idx]; + } + sp->sct_avail = bp[sp->sct_uid].bp_avail; +} + /* * Return a new bp map. * Caller should pass it to free() when done with it. diff --git a/src/lib/update/land.c b/src/lib/update/land.c index 0d9bd9b1..5eb96500 100644 --- a/src/lib/update/land.c +++ b/src/lib/update/land.c @@ -196,7 +196,7 @@ landrepair(struct lndstr *land, struct natstr *np, struct bp *bp, int etus) { struct lchrstr *lp = &lchr[(int)land->lnd_type]; int delta; - struct sctstr *sp; + struct sctstr *sp, scratch_sect; int build; int avail; int mult; @@ -211,14 +211,17 @@ landrepair(struct lndstr *land, struct natstr *np, struct bp *bp, int etus) if (relations_with(sp->sct_own, land->lnd_own) != ALLIED) return; + if (player->simulation) { + scratch_sect = *sp; + bp_to_sect(bp, &scratch_sect); + sp = &scratch_sect; + } + mult = 1; if (np->nat_level[NAT_TLEV] < land->lnd_tech * 0.85) mult = 2; - if (!player->simulation) - avail = sp->sct_avail * 100; - else - avail = bp_get_avail(bp, sp) * 100; + avail = sp->sct_avail * 100; delta = roundavg((double)avail / lp->l_bwork); if (delta <= 0) @@ -228,7 +231,7 @@ landrepair(struct lndstr *land, struct natstr *np, struct bp *bp, int etus) if (delta > 100 - land->lnd_effic) delta = 100 - land->lnd_effic; - build = get_materials(sp, bp, lp->l_mat, delta); + build = get_materials(sp, lp->l_mat, delta); if ((sp->sct_type != SCT_HEADQ) && (sp->sct_type != SCT_FORTR)) build /= 3; @@ -236,13 +239,9 @@ landrepair(struct lndstr *land, struct natstr *np, struct bp *bp, int etus) avail -= build * lp->l_bwork; if (avail < 0) avail = 0; - if (!player->simulation) - sp->sct_avail = avail / 100; - else - bp_put_avail(bp, sp, avail / 100); + sp->sct_avail = avail / 100; - if (build < 0) - logerror("land unit %d building %d ! \n", land->lnd_uid, build); + bp_set_from_sect(bp, sp); np->nat_money -= mult * lp->l_cost * build / 100.0; if (!player->simulation) { land->lnd_effic += (signed char)build; diff --git a/src/lib/update/material.c b/src/lib/update/material.c index 4fa3f185..5781719c 100644 --- a/src/lib/update/material.c +++ b/src/lib/update/material.c @@ -33,14 +33,11 @@ #include -#include "budg.h" #include "chance.h" -#include "player.h" #include "update.h" /* * Get build materials from sector @sp. - * @bp is the sector's build pointer. * Array @mvec[ITEM_MAX+1] defines the materials needed to build 100%. * @pct is the percentage to build. * Adjust build percentage downwards so that available materials @@ -48,14 +45,14 @@ * Return adjusted build percentage. */ int -get_materials(struct sctstr *sp, struct bp *bp, short mvec[], int pct) +get_materials(struct sctstr *sp, short mvec[], int pct) { int i, amt; for (i = I_NONE + 1; i <= I_MAX; i++) { if (mvec[i] == 0) continue; - amt = bp_get_item(bp, sp, i); + amt = sp->sct_item[i]; if (amt * 100 < mvec[i] * pct) pct = amt * 100 / mvec[i]; } @@ -63,13 +60,11 @@ get_materials(struct sctstr *sp, struct bp *bp, short mvec[], int pct) for (i = I_NONE + 1; i <= I_MAX; i++) { if (mvec[i] == 0) continue; - amt = bp_get_item(bp, sp, i); + amt = sp->sct_item[i]; amt -= roundavg(mvec[i] * pct / 100.0); if (CANT_HAPPEN(amt < 0)) amt = 0; - bp_put_item(bp, sp, i, amt); - if (!player->simulation) - sp->sct_item[i] = amt; + sp->sct_item[i] = amt; } return pct; diff --git a/src/lib/update/plane.c b/src/lib/update/plane.c index 713676df..4b1c867c 100644 --- a/src/lib/update/plane.c +++ b/src/lib/update/plane.c @@ -126,7 +126,7 @@ planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus) struct plchrstr *pcp = &plchr[(int)pp->pln_type]; int build; struct shpstr *carrier; - struct sctstr *sp; + struct sctstr *sp, scratch_sect; int delta; int mult; int avail; @@ -155,14 +155,17 @@ planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus) return; } + if (player->simulation) { + scratch_sect = *sp; + bp_to_sect(bp, &scratch_sect); + sp = &scratch_sect; + } + mult = 1; if (np->nat_level[NAT_TLEV] < pp->pln_tech * 0.85) mult = 2; - if (!player->simulation) - avail = sp->sct_avail * 100; - else - avail = bp_get_avail(bp, sp) * 100; + avail = sp->sct_avail * 100; if (carrier) avail += etus * carrier->shp_item[I_MILIT] / 2; @@ -174,7 +177,7 @@ planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus) if (delta > 100 - pp->pln_effic) delta = 100 - pp->pln_effic; - build = get_materials(sp, bp, pcp->pl_mat, delta); + build = get_materials(sp, pcp->pl_mat, delta); if (carrier) build = delta; @@ -184,17 +187,10 @@ planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus) * I didn't use roundavg here, because I want to * penalize the player with a large number of planes. */ - if (!player->simulation) - avail = (sp->sct_avail * 100 - used) / 100; - else - avail = (bp_get_avail(bp, sp) * 100 - used) / 100; - + avail = (sp->sct_avail * 100 - used) / 100; if (avail < 0) avail = 0; - if (!player->simulation) - sp->sct_avail = avail; - else - bp_put_avail(bp, sp, avail); + sp->sct_avail = avail; if (sp->sct_type != SCT_AIRPT) build /= 3; @@ -203,6 +199,7 @@ planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus) build = 80 - pp->pln_effic; } + bp_set_from_sect(bp, sp); np->nat_money -= mult * build * pcp->pl_cost / 100.0; if (!player->simulation) diff --git a/src/lib/update/ship.c b/src/lib/update/ship.c index 27ee0e8f..bf280e51 100644 --- a/src/lib/update/ship.c +++ b/src/lib/update/ship.c @@ -243,7 +243,7 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus) { struct mchrstr *mp = &mchr[(int)ship->shp_type]; int delta; - struct sctstr *sp; + struct sctstr *sp, scratch_sect; int build; int wf; int avail; @@ -260,6 +260,12 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus) && relations_with(sp->sct_own, ship->shp_own) < FRIENDLY) return; + if (player->simulation) { + scratch_sect = *sp; + bp_to_sect(bp, &scratch_sect); + sp = &scratch_sect; + } + mult = 1; if (np->nat_level[NAT_TLEV] < ship->shp_tech * 0.85) mult = 2; @@ -273,10 +279,8 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus) if (sp->sct_type != SCT_HARBR) { wf /= 3; avail = wf; - } else if (!player->simulation) + } else avail = wf + sp->sct_avail * 100; - else - avail = wf + bp_get_avail(bp, sp) * 100; delta = roundavg((double)avail / mp->m_bwork); if (delta <= 0) @@ -286,7 +290,7 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus) if (delta > 100 - ship->shp_effic) delta = 100 - ship->shp_effic; - build = get_materials(sp, bp, mp->m_mat, delta); + build = get_materials(sp, mp->m_mat, delta); if (sp->sct_type != SCT_HARBR) build = delta; @@ -297,16 +301,10 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus) * I didn't use roundavg here, because I want to penalize * the player with a large number of ships. */ - if (!player->simulation) - avail = (sp->sct_avail * 100 + wf) / 100; - else - avail = (bp_get_avail(bp, sp) * 100 + wf) / 100; + avail = (sp->sct_avail * 100 + wf) / 100; if (avail < 0) avail = 0; - if (!player->simulation) - sp->sct_avail = avail; - else - bp_put_avail(bp, sp, avail); + sp->sct_avail = avail; } if (sp->sct_type != SCT_HARBR) if ((build + ship->shp_effic) > 80) { @@ -315,6 +313,7 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus) build = 0; } + bp_set_from_sect(bp, sp); np->nat_money -= mult * mp->m_cost * build / 100.0; if (!player->simulation) ship->shp_effic += (signed char)build;