config: Make work to build sectors configurable

Traditionally, building up 100% takes 100 work.  Make the work to
build configurable, via new sect-chr selector bwork, backed by new
struct dchrstr member d_bwork.  Keep the required work exactly the
same for now.

Tearing down sectors remains four times easier than building.

Clients that hardcode sector build work need to be updated.  Easy,
since build work is now exposed in xdump.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2016-06-05 22:49:07 +02:00
parent bb9619c053
commit 2ffd7b948d
6 changed files with 143 additions and 142 deletions

View file

@ -47,46 +47,43 @@
int
buildeff(struct sctstr *sp)
{
int work_cost = 0;
int avail = sp->sct_avail;
int buildeff_work = avail / 2;
int cost, n, neweff, desig;
int avail = sp->sct_avail / 2 * 100;
int cost;
int delta, build;
struct dchrstr *dcp;
cost = 0;
neweff = sp->sct_effic;
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 > buildeff_work)
work_cost = buildeff_work;
buildeff_work -= work_cost;
n = sp->sct_effic - work_cost * 4;
if (n <= 0) {
n = 0;
dcp = &dchr[sp->sct_type];
build = 4 * avail / dcp->d_bwork;
if (build <= sp->sct_effic)
sp->sct_effic -= build;
else {
build = sp->sct_effic;
sp->sct_effic = 0;
sp->sct_type = sp->sct_newtype;
}
neweff = n;
cost += work_cost;
avail -= (build + 3) / 4 * dcp->d_bwork;
cost += (build + 3) / 4;
}
desig = sp->sct_type;
if (desig == sp->sct_newtype) {
work_cost = 100 - neweff;
if (work_cost > buildeff_work)
work_cost = buildeff_work;
work_cost = get_materials(sp, dchr[sp->sct_type].d_mat, work_cost);
neweff += work_cost;
cost += (work_cost * dchr[desig].d_cost + 99) / 100;
buildeff_work -= work_cost;
if (sp->sct_type == sp->sct_newtype) {
dcp = &dchr[sp->sct_type];
delta = avail / dcp->d_bwork;
if (delta > 100 - sp->sct_effic)
delta = 100 - sp->sct_effic;
build = get_materials(sp, dcp->d_mat, delta);
sp->sct_effic += build;
avail -= build * dcp->d_bwork;
cost += (build * dcp->d_cost + 99) / 100;
}
sp->sct_effic = neweff;
sp->sct_avail = (avail + 1) / 2 + buildeff_work;
sp->sct_avail = (sp->sct_avail + 1) / 2 + avail / 100;
return cost;
}