]> git.pond.sub.org Git - empserver/commitdiff
Make sector maintenance cost configurable
authorMarkus Armbruster <armbru@pond.sub.org>
Fri, 20 Feb 2009 17:58:01 +0000 (18:58 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 19 Jul 2009 17:58:47 +0000 (13:58 -0400)
Replace the fixed $1 per ETU maintenance for capital/city sectors that
are at least 60% efficient by a configurable maintenance cost, payable
regardless of efficiency.  The only change in the default
configuration is that inefficient capitals now pay maintenance.
Charging sector maintenance regardless of efficiency is consistent
with unit maintenance.

New struct dchrstr member d_maint and sector-chr selector maint.  Make
show_sect_build() show it.  Change produce_sect() to record
maintenance in new slot p_sect[SCT_MAINT] instead of abusing
p_sect[SCT_CAPIT].  Replace the "Capital maintenance" line in budget
by "Sector maintenance".

include/budg.h
include/sect.h
info/Sector-types.t
info/Update-sequence.t
info/budget.t
src/lib/commands/budg.c
src/lib/common/nsc.c
src/lib/global/sect.config
src/lib/subs/show.c
src/lib/update/sect.c

index f07cff133eb3608c672b59f9687aca329916ab08..50474c21886469ac5b774a38a94a117d4138aa02 100644 (file)
@@ -38,7 +38,8 @@
 #include "item.h"
 
 #define SCT_EFFIC (SCT_TYPE_MAX + 1)
-#define SCT_BUDG_MAX SCT_EFFIC
+#define SCT_MAINT (SCT_TYPE_MAX + 2)
+#define SCT_BUDG_MAX SCT_MAINT
 
 struct bp *bp_alloc(void);
 void bp_set_from_sect(struct bp *, struct sctstr *);
index f5d6722e0630ba9036158f0e5746d1799209ce58..b03384af141de2f9f6d7c2e31d588d3d2abfb227 100644 (file)
@@ -116,6 +116,7 @@ struct dchrstr {
     int d_build;               /* cost multiplier for eff */
     int d_lcms;                        /* lcm's needed per point of eff */
     int d_hcms;                        /* hcm's needed per point of eff */
+    int d_maint;               /* maintenance cost per ETU */
     int d_maxpop;              /* maximum population */
     char *d_name;              /* full name of sector type */
 };
index 9e29b6edd3bda3214ab9d257d1b2b87578d96d4b..94c0de0b04f2570b5cb7ba7dff64d8173ad0239e 100644 (file)
@@ -237,11 +237,12 @@ The \*Qshow\*U command can be used to show special things about sector
 types.  To check out build costs, you do:
 .EX show sect build
 .NF
-                        desig   build 100% eff
-sector type                 $   lcm   hcm     $
-- wilderness                0     0     0     0
-f fortress                  0     0   100   500
-any other                   0     0     0   100
+                        desig   build 100% eff  maint
+sector type                 $   lcm  hcm     $      $
+- wilderness                0     0    0     0      0
+c capital                   0     0    0   100     60
+f fortress                  0     0  100   500      0
+any other                   0     0    0   100      0
 
 Infrastructure building - adding 1 point of efficiency costs:
        type          lcms    hcms    mobility    $$$$
@@ -259,6 +260,8 @@ The lcm required to build the sector.
 The hcm required to build the sector.
 .L "build $"
 What it costs to build the sector.
+.L "maint $"
+Cost of maintenance per update.
 .in
 .s1
 The show command also shows infrastructure build costs.
index cb431c09f14da9dea4d0b1d8a33c091daab53a8c..6b5c9a3f28c1a17826727dcf545cc5b655a0f19f 100644 (file)
@@ -24,17 +24,16 @@ This document gives a rough order of events during the update.
        d) land unit maintenance
                pay maintenance, then feed and plague people on board
        e) produce for all sectors
-                a) if the sector is a cap, it costs $1 per etu since
-                       the last update
-                b) people in non-sanctuary sectors eat
+                a) people in non-sanctuary sectors eat
                         If not enough is available, the excess people will
                        starve off.  No more than 50% of the people
                         in a sector can die; the uw's die first, then
                         the civs, then the mil.
-                c) if there was starvation, the work percentage is set
+                b) if there was starvation, the work percentage is set
                         to 0, otherwise the work rate rises by
                         8+(1-15), max of 100
-                d) population grows and is truncated
+                c) population grows and is truncated
+                d) pay sector maintenance
                 e) sectors that are stopped are skipped (see info stop)
                 f) first increase eff
                 g) then make things
index acab8c3bb9d191d85b0743216b83b6d0a109e376..872b11037f25ba8110a66634d2fd847ddb4ee850 100644 (file)
@@ -22,8 +22,8 @@ Ship maintenance                25 ships                          6327
 Plane building                  9 planes                           2508
 Plane maintenance               219 planes                         8874
 Sector building                                                     2398
+Sector maintenance             5 sectors                            300
 Military payroll                7648 mil, 338 res                  38247
-City maintenance                5 cities                             300
 Total expenses....................................................147490
 Income from taxes               320709 civs, 100235 uws           +92513
 Income from bars                7986 bars                         +95832
index 846d04d6f8d4091b969c907d028146636d620cac..2a40b033ae325da21f01cd1b892a4d4bfe734d85 100644 (file)
@@ -84,7 +84,7 @@ budg(void)
     expenses = 0;
     pr("Sector Type\t\t\tProduction\t\t\t    Cost\n");
     for (i = 0; i <= SCT_TYPE_MAX; i++) {
-       if (!p_sect[i][1] || i == SCT_CAPIT)
+       if (!p_sect[i][1])
            continue;
        pr("%-17s\t\t", dchr[i].d_name);
        if (i == SCT_ENLIST)
@@ -137,22 +137,19 @@ budg(void)
           p_sect[SCT_EFFIC][0], p_sect[SCT_EFFIC][1]);
        expenses += p_sect[SCT_EFFIC][1];
     }
+    if (p_sect[SCT_MAINT][0]) {
+       sprintf(buf, "%ld sector%s",
+               p_sect[SCT_MAINT][0], splur(p_sect[SCT_MAINT][0]));
+       pr("Sector maintenance\t\t%-16s\t\t%8ld\n",
+          buf, p_sect[SCT_MAINT][1]);
+       expenses += p_sect[SCT_MAINT][1];
+    }
     if (mil) {
        n = (mil - np->nat_reserve * money_res * etu) / (etu * money_mil);
        sprintf(in, "%d mil, %d res", n, (int)np->nat_reserve);
        pr("Military payroll\t\t%-32s%8d\n", in, -mil);
        expenses -= mil;
     }
-    if (p_sect[SCT_CAPIT][0]) {
-       pr("%c%s maintenance\t\t",
-          toupper(dchr[SCT_CAPIT].d_name[0]),
-          dchr[SCT_CAPIT].d_name + 1);
-       n = p_sect[SCT_CAPIT][0];
-       sprintf(in, "%d %s", n, dchr[SCT_CAPIT].d_name);
-       plurize(in, sizeof(in), n);
-       pr("%-32s%8ld\n", in, p_sect[SCT_CAPIT][1]);
-       expenses += p_sect[SCT_CAPIT][1];
-    }
     pr("Total expenses%s\n", dotsprintf(buf, "%58d", expenses));
     if (taxes) {
        sprintf(in, "%d civ%s, %d uw%s",
index 5753907ad2b1f3bcdbdce803a59f6ae2751e9dee..462007982e307b6d2ddf53363c430cc7dcc6184e 100644 (file)
@@ -203,6 +203,7 @@ struct castr dchr_ca[] = {
     {"build", fldoff(d_build), NSC_INT, 0, NULL, EF_BAD, 0},
     {"lcms", fldoff(d_lcms), NSC_INT, 0, NULL, EF_BAD, 0},
     {"hcms", fldoff(d_hcms), NSC_INT, 0, NULL, EF_BAD, 0},
+    {"maint", fldoff(d_maint), NSC_INT, 0, NULL, EF_BAD, 0},
     {"maxpop", fldoff(d_maxpop), NSC_INT, 0, NULL, EF_BAD, 0},
     {NULL, 0, NSC_NOTYPE, 0, NULL, EF_BAD, 0}
 #undef CURSTR
index bd3619d838c6aa0c111158832075f8bc57d7c2c5..dd2aa00f03f3d24ea31dd0ca82eef2ab9b2774d0 100644 (file)
 # econfig key custom_tables.
 
 config sect-chr
-uid mnem terra prd peff mob0 mob1  nav  pkg ostr dstr val cost bui lcm hcm maxp name
-  0  "."    0   -1    0   -1   -1  sea norm  0.0  0.0   0   -1   0   0   0    0 "sea"
-  1  "^"    1 dust   75  2.4  1.2 land norm  1.0  4.0   5   -1   1   0   0  100 "mountain"
-  2  "s"    4   -1    0   -1   -1 land norm  0.0 99.0 127   -1   0   0   0 1000 "sanctuary"
-  3 "\134"  3   -1    0   -1   -1 land norm  0.0 99.0   0   -1   0   0   0    0 "wasteland"
-  4  "-"    4   -1    0  0.4  0.4 land norm  1.0  2.0   1    0   0   0   0 1000 "wilderness"
+uid mnem terra prd peff mob0 mob1  nav  pkg ostr dstr val cost bui lcm hcm maint maxp name
+  0  "."    0   -1    0   -1   -1  sea norm  0.0  0.0   0   -1   0   0   0     0    0 "sea"
+  1  "^"    1 dust   75  2.4  1.2 land norm  1.0  4.0   5   -1   1   0   0     0  100 "mountain"
+  2  "s"    4   -1    0   -1   -1 land norm  0.0 99.0 127   -1   0   0   0     0 1000 "sanctuary"
+  3 "\134"  3   -1    0   -1   -1 land norm  0.0 99.0   0   -1   0   0   0     0    0 "wasteland"
+  4  "-"    4   -1    0  0.4  0.4 land norm  1.0  2.0   1    0   0   0   0     0 1000 "wilderness"
 # Uncomment one of the following two.  The second one is for big cities.
-  5  "c"    4   -1    0  0.4  0.2 land norm  1.0  2.0  30    0   1   0   0 1000 "capital"
-# 5  "c"    4   -1    0  0.4  0.2 cana urba  1.0  2.0  30    0  10   1   2 1000 "city"
-  6  "u"    4  rad  100  0.4  0.2 land norm  1.0  2.0  15    0   1   0   0 1000 "uranium mine"
-  7  "p"    4  hap  100  0.4  0.2 land norm  1.0  1.5   5    0   1   0   0 1000 "park"
-  8  "d"    4  gun  100  0.4  0.2 land norm  1.0  1.5   7    0   1   0   0 1000 "defense plant"
-  9  "i"    4   sh  100  0.4  0.2 land norm  1.0  1.5   6    0   1   0   0 1000 "shell industry"
- 10  "m"    4 iron  100  0.4  0.2 land norm  1.0  2.0   5    0   1   0   0 1000 "mine"
- 11  "g"    4 dust  100  0.4  0.2 land norm  1.0  2.0   8    0   1   0   0 1000 "gold mine"
- 12  "h"    4   -1    0  0.4  0.2 harb ware  1.0  1.5  12    0   1   0   0 1000 "harbor"
- 13  "w"    4   -1    0  0.4  0.2 land ware  1.0  1.5   7    0   1   0   0 1000 "warehouse"
- 14  "*"    4   -1    0  0.4  0.2 land norm  1.0  1.25 12    0   1   0   0 1000 "airfield"
- 15  "a"    4 food  900  0.4  0.2 land norm  1.0  1.5   2    0   1   0   0 1000 "agribusiness"
- 16  "o"    4  oil  100  0.4  0.2 land norm  1.0  1.5   5    0   1   0   0 1000 "oil field"
- 17  "j"    4  lcm  100  0.4  0.2 land norm  1.0  1.5   3    0   1   0   0 1000 "light manufacturing"
- 18  "k"    4  hcm  100  0.4  0.2 land norm  1.0  1.5   4    0   1   0   0 1000 "heavy manufacturing"
- 19  "f"    4   -1    0  0.4  0.2 land norm  2.0  4.0  10    0   5   0   1 1000 "fortress"
- 20  "t"    4 tech  100  0.4  0.2 land norm  1.0  1.5  10    0   1   0   0 1000 "technical center"
- 21  "r"    4  med  100  0.4  0.2 land norm  1.0  1.5   9    0   1   0   0 1000 "research lab"
- 22  "n"    4   -1    0  0.4  0.2 land norm  1.0  2.0  10    0   1   0   0 1000 "nuclear plant"
- 23  "l"    4  edu  100  0.4  0.2 land norm  1.0  1.5   4    0   1   0   0 1000 "library/school"
- 24  "+"    4   -1    0  0.4  0.0 land norm  1.0  1.0   3    0   1   0   0 1000 "highway"
- 25  ")"    4   -1    0  0.4  0.2 land norm  1.0  1.5   4    0   1   0   0 1000 "radar installation"
- 26  "!"    4   -1    0  0.4  0.2 land norm  1.0  1.5  12    0   1   0   0 1000 "headquarters"
- 27  "#"    4   -1    0  0.4  0.0 land norm  1.0  1.0   3    0   1   0   0 1000 "bridge head"
- 28  "="    0   -1    0  0.4  0.0 brid norm  1.0  1.0   5   -1   1   0   0  100 "bridge span"
- 29  "b"    4 bars  100  0.4  0.2 land bank  1.0  2.25 10    0   1   0   0 1000 "bank"
- 30  "%"    4  pet 1000  0.4  0.2 land norm  1.0  1.5   2    0   1   0   0 1000 "refinery"
- 31  "e"    4   -1    0  0.4  0.2 land norm  1.0  2.0   7    0   1   0   0 1000 "enlistment center"
- 32  "~"   32   -1    0  0.4  0.2 land norm  1.0  1.5   1   -1   1   0   0  100 "plains"
- 33  "@"    0   -1    0  0.4  0.0 land norm  1.0  1.5   4   -1   1   0   0  100 "bridge tower"
+  5  "c"    4   -1    0  0.4  0.2 land norm  1.0  2.0  30    0   1   0   0     1 1000 "capital"
+# 5  "c"    4   -1    0  0.4  0.2 cana urba  1.0  2.0  30    0  10   1   2     1 1000 "city"
+  6  "u"    4  rad  100  0.4  0.2 land norm  1.0  2.0  15    0   1   0   0     0 1000 "uranium mine"
+  7  "p"    4  hap  100  0.4  0.2 land norm  1.0  1.5   5    0   1   0   0     0 1000 "park"
+  8  "d"    4  gun  100  0.4  0.2 land norm  1.0  1.5   7    0   1   0   0     0 1000 "defense plant"
+  9  "i"    4   sh  100  0.4  0.2 land norm  1.0  1.5   6    0   1   0   0     0 1000 "shell industry"
+ 10  "m"    4 iron  100  0.4  0.2 land norm  1.0  2.0   5    0   1   0   0     0 1000 "mine"
+ 11  "g"    4 dust  100  0.4  0.2 land norm  1.0  2.0   8    0   1   0   0     0 1000 "gold mine"
+ 12  "h"    4   -1    0  0.4  0.2 harb ware  1.0  1.5  12    0   1   0   0     0 1000 "harbor"
+ 13  "w"    4   -1    0  0.4  0.2 land ware  1.0  1.5   7    0   1   0   0     0 1000 "warehouse"
+ 14  "*"    4   -1    0  0.4  0.2 land norm  1.0  1.25 12    0   1   0   0     0 1000 "airfield"
+ 15  "a"    4 food  900  0.4  0.2 land norm  1.0  1.5   2    0   1   0   0     0 1000 "agribusiness"
+ 16  "o"    4  oil  100  0.4  0.2 land norm  1.0  1.5   5    0   1   0   0     0 1000 "oil field"
+ 17  "j"    4  lcm  100  0.4  0.2 land norm  1.0  1.5   3    0   1   0   0     0 1000 "light manufacturing"
+ 18  "k"    4  hcm  100  0.4  0.2 land norm  1.0  1.5   4    0   1   0   0     0 1000 "heavy manufacturing"
+ 19  "f"    4   -1    0  0.4  0.2 land norm  2.0  4.0  10    0   5   0   1     0 1000 "fortress"
+ 20  "t"    4 tech  100  0.4  0.2 land norm  1.0  1.5  10    0   1   0   0     0 1000 "technical center"
+ 21  "r"    4  med  100  0.4  0.2 land norm  1.0  1.5   9    0   1   0   0     0 1000 "research lab"
+ 22  "n"    4   -1    0  0.4  0.2 land norm  1.0  2.0  10    0   1   0   0     0 1000 "nuclear plant"
+ 23  "l"    4  edu  100  0.4  0.2 land norm  1.0  1.5   4    0   1   0   0     0 1000 "library/school"
+ 24  "+"    4   -1    0  0.4  0.0 land norm  1.0  1.0   3    0   1   0   0     0 1000 "highway"
+ 25  ")"    4   -1    0  0.4  0.2 land norm  1.0  1.5   4    0   1   0   0     0 1000 "radar installation"
+ 26  "!"    4   -1    0  0.4  0.2 land norm  1.0  1.5  12    0   1   0   0     0 1000 "headquarters"
+ 27  "#"    4   -1    0  0.4  0.0 land norm  1.0  1.0   3    0   1   0   0     0 1000 "bridge head"
+ 28  "="    0   -1    0  0.4  0.0 brid norm  1.0  1.0   5   -1   1   0   0     0  100 "bridge span"
+ 29  "b"    4 bars  100  0.4  0.2 land bank  1.0  2.25 10    0   1   0   0     0 1000 "bank"
+ 30  "%"    4  pet 1000  0.4  0.2 land norm  1.0  1.5   2    0   1   0   0     0 1000 "refinery"
+ 31  "e"    4   -1    0  0.4  0.2 land norm  1.0  2.0   7    0   1   0   0     0 1000 "enlistment center"
+ 32  "~"   32   -1    0  0.4  0.2 land norm  1.0  1.5   1   -1   1   0   0     0  100 "plains"
+ 33  "@"    0   -1    0  0.4  0.0 land norm  1.0  1.5   4   -1   1   0   0     0  100 "bridge tower"
 /config
index fe65d8bf2aa6db5e037527f0ad24ffb22336a247..f2ae16855109b882a85981314b1a2e8d3cf22a0d 100644 (file)
@@ -460,27 +460,29 @@ show_sect_build(int foo)
 {
     int i, first;
 
-    pr("                        desig   build 100%% eff\n"
-       "sector type                 $   lcm   hcm     $\n");
+    pr("                        desig   build 100%% eff  maint\n"
+       "sector type                 $   lcm  hcm     $      $\n");
     for (i = 0; dchr[i].d_name; i++) {
        if (dchr[i].d_mnem == 0)
            continue;
        if (dchr[i].d_mob0 < 0)
            continue;
        if (dchr[i].d_cost <= 0 && dchr[i].d_build == 1
-           && dchr[i].d_lcms == 0 && dchr[i].d_hcms == 0)
+           && dchr[i].d_lcms == 0 && dchr[i].d_hcms == 0
+           && dchr[i].d_maint == 0)
            continue;           /* the usual, skip */
        pr("%c %-21.21s", dchr[i].d_mnem, dchr[i].d_name);
        if (dchr[i].d_cost < 0)
            pr(" can't");
        else
            pr(" %5d", dchr[i].d_cost);
-       pr(" %5d %5d %5d\n",
+       pr(" %5d%5d %5d  %5d\n",
           100 * dchr[i].d_lcms,
           100 * dchr[i].d_hcms,
-          100 * dchr[i].d_build);
+          100 * dchr[i].d_build,
+          dchr[i].d_maint * etu_per_update);
     }
-    pr("any other                   0     0     0   100\n");
+    pr("any other                   0     0    0   100      0\n");
 
     first = 1;
     for (i = 0; intrchr[i].in_name; i++) {
index 5f72fc85cfd0ba55d0ac45d3fbe1f597a3e4dd91..9f154e2bfbb2368505ed507eb3d9387161ceec12 100644 (file)
@@ -278,13 +278,6 @@ produce_sect(int natnum, int etu, struct bp *bp, long p_sect[][2])
 
        np = getnatp(natnum);
 
-       if (sp->sct_type == SCT_CAPIT && sp->sct_effic >= 60) {
-           p_sect[SCT_CAPIT][0]++;
-           p_sect[SCT_CAPIT][1] += etu;
-           if (!player->simulation)
-               np->nat_money -= etu;
-       }
-
        if (player->simulation) {
            /* work on a copy, which will be discarded */
            memcpy(buf, sp->sct_item, sizeof(buf));
@@ -321,6 +314,14 @@ produce_sect(int natnum, int etu, struct bp *bp, long p_sect[][2])
 
        desig = sp->sct_type;
 
+       if (dchr[desig].d_maint) {
+           cost = etu * dchr[desig].d_maint;
+           p_sect[SCT_MAINT][0]++;
+           p_sect[SCT_MAINT][1] += cost;
+           if (!player->simulation)
+               np->nat_money -= cost;
+       }
+
        if ((sp->sct_effic < 100 || sp->sct_type != sp->sct_newtype) &&
            np->nat_money >= 0) {
            neweff = upd_buildeff(np, sp, &work, vec, etu, &desig, sctwork,