]> git.pond.sub.org Git - empserver/commitdiff
update: Fix income and level use after revolt or revert to deity
authorMarkus Armbruster <armbru@pond.sub.org>
Sat, 4 Jun 2016 15:59:52 +0000 (17:59 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 6 Aug 2017 17:59:58 +0000 (19:59 +0200)
prepare_sects() caches the sector owner's getnatp() across
guerrilla(), do_plague() and populace().  This is wrong, because the
owner may change.  The mistake can be traced back all the way back to
BSD Empire 1.1.

If the sector revolts or reverts to deity, the ex-owner still receives
taxes and bank interest.  The update test demonstrates this bug.

If the sector revolts, we use the ex-owner's instead of the owner's
tech and research for plague, and we use the ex-owners happiness and
required happiness instead of the owner's for loyalty update and civil
unrest.

Change do_plague() and populace() to call getnatp() themselves.  Call
it in prepare_sects() only after we're done messing with the sector
owner.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
include/prototypes.h
src/lib/update/plague.c
src/lib/update/populace.c
src/lib/update/prepare.c
tests/update/99-POGO
tests/update/final.xdump
tests/update/journal.log

index 47385c0b04d19ef43df2a03ad5b05e67f96095d3..c07b7cc95e555d0787a6c970fdc729c561dde73d 100644 (file)
@@ -689,12 +689,12 @@ extern void prod_nat(int);
 /* nxtitemp.c */
 /* in nsc.h */
 /* plague.c */
-extern void do_plague(struct sctstr *, struct natstr *, int);
+extern void do_plague(struct sctstr *, int);
 extern int plague_people(struct natstr *, short *, int *, int *, int);
 /* plane.c */
 extern int prod_plane(int, int, struct bp *, int);
 /* populace.c */
-extern void populace(struct natstr *, struct sctstr *, int);
+extern void populace(struct sctstr *, int);
 extern int total_work(int, int, int, int, int, int);
 /* prepare.c */
 extern void tax(struct sctstr *, int, int *, int *, int *, int *);
index ac526750b442455b317152f2326c9b2d3b3209b3..9a272cfa9116a412e1ecbdf6ed1c63ac619fb28d 100644 (file)
@@ -43,8 +43,9 @@
 static int infect_people(struct natstr *, struct sctstr *);
 
 void
-do_plague(struct sctstr *sp, struct natstr *np, int etu)
+do_plague(struct sctstr *sp, int etu)
 {
+    struct natstr *np = getnatp(sp->sct_own);
     int pstage, ptime;
     int n;
 
index a3b02d3f912d74783772b9934cf130c6349aaf05..441f034028db7697ff1dee7eedfd24ff811861a2 100644 (file)
@@ -38,8 +38,9 @@
 #include "update.h"
 
 void
-populace(struct natstr *np, struct sctstr *sp, int etu)
+populace(struct sctstr *sp, int etu)
 {
+    struct natstr *np = getnatp(sp->sct_own);
     double hap, pct;
     int n;
     int civ = sp->sct_item[I_CIVIL];
index 9252dbd86ebed4a6a1d5639fe2284e38a422a2e8..1826575dd3a3adad1567b959db12ea3d5f41cd39 100644 (file)
@@ -30,6 +30,7 @@
  *     Dave Pare, 1986
  *     Thomas Ruschak, 1992
  *     Steve McClure, 1997
+ *     Markus Armbruster, 2016
  */
 
 #include <config.h>
@@ -76,6 +77,8 @@ prepare_sects(int etu, struct bp *bp)
 
        if (sp->sct_type == SCT_WATER)
            continue;
+       if (getnatp(sp->sct_own)->nat_stat == STAT_SANCT)
+           continue;
 
        /*
         * When running the test suite, reseed PRNG for each sector
@@ -86,17 +89,14 @@ prepare_sects(int etu, struct bp *bp)
            seed_prng(sp->sct_uid);
 
        bp_set_from_sect(bp, sp);
+       guerrilla(sp);
+       do_plague(sp, etu);
+       populace(sp, etu);
        np = getnatp(sp->sct_own);
-
-       if (np->nat_stat != STAT_SANCT) {
-           guerrilla(sp);
-           do_plague(sp, np, etu);
-           populace(np, sp, etu);
-           tax(sp, etu, &pops[sp->sct_own], &civ_tax, &uw_tax, &mil_pay);
-           np->nat_money += civ_tax + uw_tax + mil_pay;
-           if (sp->sct_type == SCT_BANK)
-               np->nat_money += bank_income(sp, etu);
-       }
+       tax(sp, etu, &pops[sp->sct_own], &civ_tax, &uw_tax, &mil_pay);
+       np->nat_money += civ_tax + uw_tax + mil_pay;
+       if (sp->sct_type == SCT_BANK)
+           np->nat_money += bank_income(sp, etu);
     }
     for (n = 0; NULL != (np = getnatp(n)); n++) {
        np->nat_money += upd_slmilcosts(np->nat_cnum, etu);
index ddcd118627a7df4ac37ff73342f240df1bc51489..de4c37a27be23c9ba2ca504a72be2c34bb4b2ec8 100644 (file)
@@ -152,7 +152,6 @@ land 0:31,0:15
 | starvation 0:15,0
 | #30 lost 12% to lack of maintenance
 | #31 lost 1%
-| BUG: income from sectors lost to che not lost
 | BUG: no sector maintenance
 | sector building
 | -16:-12,0 no money
@@ -209,7 +208,6 @@ plane -32:-1,-16:-1
 land -32:-1,-16:-1
 || country#5
 | che retake -16:-14,-8
-| BUG: no income from liberated sectors
 read 5
 nation 5
 || country#6
index abccd0d8fe99525d83a639c24a45e5e3a5ce1799..fc102edb9f5bba78247a4f54e5d49b4a072be80d 100644 (file)
@@ -414,8 +414,8 @@ cnum stat flags cname passwd ip hostname userid xcap ycap xorg yorg update tgms
 1 active (flash beep coastwatch sonar techlists) "1" "1" "127.0.0.1" "" "tester" 0 0 0 0 0 1 0 255 640 0 0 12949 0 0 0 0 102.787 3.37264 21.0875 12.3287 neutral neutral neutral neutral neutral neutral allied friendly neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
 2 active (flash beep coastwatch sonar techlists) "2" "2" "127.0.0.1" "" "tester" -2 0 0 0 0 1 0 255 193 0 975 -5912 0 0 0 0 101.081 1.68632 15.2381 2.74222 neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
 3 active (flash beep coastwatch sonar techlists) "3" "3" "127.0.0.1" "" "tester" 1 -1 0 0 0 1 0 255 640 0 0 4337 0 0 0 0 101.081 1.68632 15.2381 4.44444 neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
-4 active (flash beep coastwatch sonar techlists) "4" "4" "127.0.0.1" "" "tester" -1 -1 0 0 0 1 0 255 640 0 0 20251 0 0 0 0 31.5183 1.68632 3.04762 4.44444 neutral allied neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
-5 active (flash beep coastwatch sonar techlists) "5" "5" "127.0.0.1" "" "tester" -16 -8 0 0 0 1 0 255 99 0 0 25000 0 0 0 0 101.081 1.68632 15.2381 4.44444 neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
+4 active (flash beep coastwatch sonar techlists) "4" "4" "127.0.0.1" "" "tester" -1 -1 0 0 0 1 0 255 640 0 0 18752 0 0 0 0 31.5183 1.68632 3.04762 4.44444 neutral allied neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
+5 active (flash beep coastwatch sonar techlists) "5" "5" "127.0.0.1" "" "tester" -16 -8 0 0 0 1 0 255 99 0 0 26499 0 0 0 0 101.081 1.68632 15.2381 4.44444 neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
 6 active (flash beep coastwatch sonar techlists) "6" "6" "127.0.0.1" "" "tester" 0 8 0 0 0 1 0 255 640 0 0 24812 0 0 0 0 101.081 1.68632 15.2381 4.44444 allied allied allied allied allied allied neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
 7 active (flash beep coastwatch sonar techlists) "7" "7" "127.0.0.1" "" "tester" -2 8 0 0 0 1 0 255 640 0 0 25828 0 0 0 0 101.081 1.68632 15.2381 4.44444 friendly friendly friendly friendly friendly friendly friendly neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral neutral 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () () ()
 /config
index 9c5f2ab66ef4ac8a891c3eeed444a16162c0999a..093d04e118c220e5d5964357e8f4abc033826f1a 100644 (file)
     Play#0 output Play#0 1 total pop was 24000, yielding 0.00 hap, 0.00 edu
     Play#0 output Play#0 1 1.7165 technology (0.0000 + 1.7165), 1.6969 research (0.0000 + 1.6969) produced
     Play#0 output Play#0 1 Army delta $-600, Navy delta $-300, Air force delta $0
-    Play#0 output Play#0 1 money delta was $-4749 for this update
+    Play#0 output Play#0 1 money delta was $-6248 for this update
     Play#0 output Play#0 6 0 640
     Play#0 input nation 4
     Play#0 command nation
     Play#0 output Play#0 1 (#4) 4 Nation Report        Thu Jan  1 00:00:00 1970
     Play#0 output Play#0 1 Nation status is ACTIVE     Bureaucratic Time Units: 640
     Play#0 output Play#0 1 100% eff capital at -1,-1 has 130 civilians & 0 military
-    Play#0 output Play#0 1  The treasury has $20251.00     Military reserves: 0
+    Play#0 output Play#0 1  The treasury has $18752.00     Military reserves: 0
     Play#0 output Play#0 1 Education..........  3.05       Happiness.......  4.44
     Play#0 output Play#0 1 Technology......... 31.52       Research........  1.69
     Play#0 output Play#0 1 Technology factor : 35.21%     Plague factor :   1.29%
     Play#0 output Play#0 1   0 happiness,   0 education produced
     Play#0 output Play#0 1 total pop was 190, yielding 0.00 hap, 0.00 edu
     Play#0 output Play#0 1 1.7165 technology (0.0000 + 1.7165), 1.6969 research (0.0000 + 1.6969) produced
-    Play#0 output Play#0 1 money delta was $0 for this update
+    Play#0 output Play#0 1 money delta was $1499 for this update
     Play#0 output Play#0 6 0 640
     Play#0 input nation 5
     Play#0 command nation
     Play#0 output Play#0 1 (#5) 5 Nation Report        Thu Jan  1 00:00:00 1970
     Play#0 output Play#0 1 Nation status is ACTIVE     Bureaucratic Time Units: 99
     Play#0 output Play#0 1 No capital (was at -16,-8).
-    Play#0 output Play#0 1  The treasury has $25000.00     Military reserves: 0
+    Play#0 output Play#0 1  The treasury has $26499.00     Military reserves: 0
     Play#0 output Play#0 1 Education.......... 15.24       Happiness.......  4.44
     Play#0 output Play#0 1 Technology.........101.08       Research........  1.69
     Play#0 output Play#0 1 Technology factor : 50.18%     Plague factor :   1.98%