]> git.pond.sub.org Git - empserver/blobdiff - src/lib/update/sect.c
config: Make work to build sectors configurable
[empserver] / src / lib / update / sect.c
index 136e5bf9fff7a3c82c27c6600c23af50c2cd2f6f..4cdb3503787ea6f710b012f6ec6bb00ffbeb3642 100644 (file)
 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;
 }