budget: Fix treasury tracking
The update simply updates each nation's nat_money as it goes. Works. Except it doesn't update when it runs on behalf of budget. But it still checks nat_money to determine whether the nation is solvent. These checks are all broken. Leads to massive mispredictions when you'd go broke or solvent during a real update. Track money unconditionally in nat_budget[].money. Delay update of nat_money until prod_nat(). Replace separate money[] by new nat_budget[].start_money. Closes bug#235. Remaining difference between budget and update in the update test: * #1: budget mispredicts plane #100 gets built (to be fixed) * #2: budget shows ship, plane and land unit maintenance when broke, but update damages them instead (correct) * #2: sector -14,0 converts, quadrupling its taxes (correct) * #4 & #5: bank with dust and bars taken over by che (correct) * #4: plague deaths (correct) Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
parent
058268595f
commit
10789a0365
14 changed files with 78 additions and 99 deletions
|
@ -64,11 +64,13 @@ struct budget {
|
||||||
struct budg_item bm[BUDG_BLD_MAX + 1];
|
struct budg_item bm[BUDG_BLD_MAX + 1];
|
||||||
/* population, taxes, military payroll, bank interest */
|
/* population, taxes, military payroll, bank interest */
|
||||||
struct budg_item civ, mil, uw, bars;
|
struct budg_item civ, mil, uw, bars;
|
||||||
|
/* treasury */
|
||||||
|
int start_money; /* at beginning of update */
|
||||||
|
int money; /* current */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* main.c */
|
/* main.c */
|
||||||
extern struct budget nat_budget[MAXNOC];
|
extern struct budget nat_budget[MAXNOC];
|
||||||
extern int money[MAXNOC];
|
|
||||||
extern int pops[MAXNOC];
|
extern int pops[MAXNOC];
|
||||||
extern int tpops[MAXNOC];
|
extern int tpops[MAXNOC];
|
||||||
/* nat.c */
|
/* nat.c */
|
||||||
|
|
|
@ -151,9 +151,10 @@ calc_all(void)
|
||||||
int etu = etu_per_update;
|
int etu = etu_per_update;
|
||||||
|
|
||||||
memset(nat_budget, 0, sizeof(nat_budget));
|
memset(nat_budget, 0, sizeof(nat_budget));
|
||||||
|
|
||||||
np = getnatp(player->cnum);
|
np = getnatp(player->cnum);
|
||||||
|
budget->start_money = budget->money = np->nat_money;
|
||||||
bp = bp_alloc();
|
bp = bp_alloc();
|
||||||
|
|
||||||
for (n = 0; NULL != (sp = getsectid(n)); n++) {
|
for (n = 0; NULL != (sp = getsectid(n)); n++) {
|
||||||
bp_set_from_sect(bp, sp);
|
bp_set_from_sect(bp, sp);
|
||||||
if (sp->sct_own == player->cnum) {
|
if (sp->sct_own == player->cnum) {
|
||||||
|
@ -180,6 +181,9 @@ calc_all(void)
|
||||||
prod_plane(etu, player->cnum, bp, 1);
|
prod_plane(etu, player->cnum, bp, 1);
|
||||||
prod_land(etu, player->cnum, bp, 1);
|
prod_land(etu, player->cnum, bp, 1);
|
||||||
|
|
||||||
|
if (CANT_HAPPEN(np->nat_money != budget->start_money))
|
||||||
|
np->nat_money = budget->start_money;
|
||||||
|
|
||||||
free(bp);
|
free(bp);
|
||||||
return budget;
|
return budget;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
* Dave Pare, 1986
|
* Dave Pare, 1986
|
||||||
* Thomas Ruschak, 1993
|
* Thomas Ruschak, 1993
|
||||||
* Steve McClure, 1998
|
* Steve McClure, 1998
|
||||||
* Markus Armbruster, 2004-2011
|
* Markus Armbruster, 2004-2016
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@ -52,7 +52,6 @@ finish_sects(int etu)
|
||||||
{
|
{
|
||||||
static double *import_cost;
|
static double *import_cost;
|
||||||
struct sctstr *sp;
|
struct sctstr *sp;
|
||||||
struct natstr *np;
|
|
||||||
int n;
|
int n;
|
||||||
struct rusage rus1, rus2;
|
struct rusage rus1, rus2;
|
||||||
|
|
||||||
|
@ -72,8 +71,7 @@ finish_sects(int etu)
|
||||||
continue;
|
continue;
|
||||||
if (sp->sct_own == 0)
|
if (sp->sct_own == 0)
|
||||||
continue;
|
continue;
|
||||||
np = getnatp(sp->sct_own);
|
if (nat_budget[sp->sct_own].money < 0)
|
||||||
if (np->nat_money < 0)
|
|
||||||
continue;
|
continue;
|
||||||
dodeliver(sp);
|
dodeliver(sp);
|
||||||
}
|
}
|
||||||
|
@ -93,8 +91,7 @@ finish_sects(int etu)
|
||||||
for (n = 0; NULL != (sp = getsectid(n)); n++) {
|
for (n = 0; NULL != (sp = getsectid(n)); n++) {
|
||||||
if (!sp->sct_own)
|
if (!sp->sct_own)
|
||||||
continue;
|
continue;
|
||||||
np = getnatp(sp->sct_own);
|
if (nat_budget[sp->sct_own].money < 0)
|
||||||
if (np->nat_money < 0)
|
|
||||||
continue;
|
continue;
|
||||||
dodistribute(sp, EXPORT, import_cost[n]);
|
dodistribute(sp, EXPORT, import_cost[n]);
|
||||||
}
|
}
|
||||||
|
@ -105,8 +102,7 @@ finish_sects(int etu)
|
||||||
sp->sct_off = 0;
|
sp->sct_off = 0;
|
||||||
if (!sp->sct_own)
|
if (!sp->sct_own)
|
||||||
continue;
|
continue;
|
||||||
np = getnatp(sp->sct_own);
|
if (nat_budget[sp->sct_own].money < 0)
|
||||||
if (np->nat_money < 0)
|
|
||||||
continue;
|
continue;
|
||||||
dodistribute(sp, IMPORT, import_cost[n]);
|
dodistribute(sp, IMPORT, import_cost[n]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
#include "prototypes.h"
|
#include "prototypes.h"
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
static void upd_land(struct lndstr *, int, struct natstr *, struct bp *, int);
|
static void upd_land(struct lndstr *, int, struct bp *, int);
|
||||||
static void landrepair(struct lndstr *, struct natstr *, struct bp *,
|
static void landrepair(struct lndstr *, struct natstr *, struct bp *,
|
||||||
int, struct budget *);
|
int, struct budget *);
|
||||||
static int feed_land(struct lndstr *, int);
|
static int feed_land(struct lndstr *, int);
|
||||||
|
@ -59,9 +59,7 @@ prod_land(int etus, int natnum, struct bp *bp, int build)
|
||||||
{
|
{
|
||||||
struct lndstr *lp;
|
struct lndstr *lp;
|
||||||
struct sctstr *sp;
|
struct sctstr *sp;
|
||||||
struct natstr *np;
|
|
||||||
int i;
|
int i;
|
||||||
int start_money;
|
|
||||||
|
|
||||||
for (i = 0; (lp = getlandp(i)); i++) {
|
for (i = 0; (lp = getlandp(i)); i++) {
|
||||||
if (lp->lnd_own == 0)
|
if (lp->lnd_own == 0)
|
||||||
|
@ -78,21 +76,17 @@ prod_land(int etus, int natnum, struct bp *bp, int build)
|
||||||
sp = getsectp(lp->lnd_x, lp->lnd_y);
|
sp = getsectp(lp->lnd_x, lp->lnd_y);
|
||||||
if (sp->sct_type == SCT_SANCT)
|
if (sp->sct_type == SCT_SANCT)
|
||||||
continue;
|
continue;
|
||||||
np = getnatp(lp->lnd_own);
|
upd_land(lp, etus, bp, build);
|
||||||
start_money = np->nat_money;
|
|
||||||
upd_land(lp, etus, np, bp, build);
|
|
||||||
if (player->simulation)
|
|
||||||
np->nat_money = start_money;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
upd_land(struct lndstr *lp, int etus,
|
upd_land(struct lndstr *lp, int etus, struct bp *bp, int build)
|
||||||
struct natstr *np, struct bp *bp, int build)
|
|
||||||
/* build = 1, maintain = 0 */
|
/* build = 1, maintain = 0 */
|
||||||
{
|
{
|
||||||
struct budget *budget = &nat_budget[lp->lnd_own];
|
struct budget *budget = &nat_budget[lp->lnd_own];
|
||||||
struct lchrstr *lcp;
|
struct lchrstr *lcp = &lchr[lp->lnd_type];
|
||||||
|
struct natstr *np = getnatp(lp->lnd_own);
|
||||||
int pstage, ptime;
|
int pstage, ptime;
|
||||||
int min = morale_base - (int)np->nat_level[NAT_HLEV];
|
int min = morale_base - (int)np->nat_level[NAT_HLEV];
|
||||||
int n, mult, cost, eff_lost;
|
int n, mult, cost, eff_lost;
|
||||||
|
@ -101,9 +95,8 @@ upd_land(struct lndstr *lp, int etus,
|
||||||
if (lp->lnd_retreat < min)
|
if (lp->lnd_retreat < min)
|
||||||
lp->lnd_retreat = min;
|
lp->lnd_retreat = min;
|
||||||
|
|
||||||
lcp = &lchr[(int)lp->lnd_type];
|
|
||||||
if (build == 1) {
|
if (build == 1) {
|
||||||
if (!lp->lnd_off && np->nat_money >= 0)
|
if (!lp->lnd_off && budget->money >= 0)
|
||||||
landrepair(lp, np, bp, etus, budget);
|
landrepair(lp, np, bp, etus, budget);
|
||||||
if (!player->simulation)
|
if (!player->simulation)
|
||||||
lp->lnd_off = 0;
|
lp->lnd_off = 0;
|
||||||
|
@ -115,7 +108,7 @@ upd_land(struct lndstr *lp, int etus,
|
||||||
mult *= 3;
|
mult *= 3;
|
||||||
budget->bm[BUDG_LND_MAINT].count++;
|
budget->bm[BUDG_LND_MAINT].count++;
|
||||||
cost = -(mult * etus * MIN(0.0, money_land * lcp->l_cost));
|
cost = -(mult * etus * MIN(0.0, money_land * lcp->l_cost));
|
||||||
if (np->nat_money < cost && !player->simulation) {
|
if (budget->money < cost && !player->simulation) {
|
||||||
eff_lost = etus / 5;
|
eff_lost = etus / 5;
|
||||||
if (lp->lnd_effic - eff_lost < LAND_MINEFF)
|
if (lp->lnd_effic - eff_lost < LAND_MINEFF)
|
||||||
eff_lost = lp->lnd_effic - LAND_MINEFF;
|
eff_lost = lp->lnd_effic - LAND_MINEFF;
|
||||||
|
@ -126,7 +119,7 @@ upd_land(struct lndstr *lp, int etus,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
budget->bm[BUDG_LND_MAINT].money -= cost;
|
budget->bm[BUDG_LND_MAINT].money -= cost;
|
||||||
np->nat_money -= cost;
|
budget->money -= cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player->simulation) {
|
if (!player->simulation) {
|
||||||
|
@ -249,7 +242,7 @@ landrepair(struct lndstr *land, struct natstr *np, struct bp *bp, int etus,
|
||||||
cost = roundavg(mult * lp->l_cost * build / 100.0);
|
cost = roundavg(mult * lp->l_cost * build / 100.0);
|
||||||
budget->bm[BUDG_LND_BUILD].count += !!build;
|
budget->bm[BUDG_LND_BUILD].count += !!build;
|
||||||
budget->bm[BUDG_LND_BUILD].money -= cost;
|
budget->bm[BUDG_LND_BUILD].money -= cost;
|
||||||
np->nat_money -= cost;
|
budget->money -= cost;
|
||||||
if (!player->simulation)
|
if (!player->simulation)
|
||||||
land->lnd_effic += (signed char)build;
|
land->lnd_effic += (signed char)build;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,6 @@
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
struct budget nat_budget[MAXNOC];
|
struct budget nat_budget[MAXNOC];
|
||||||
int money[MAXNOC];
|
|
||||||
int pops[MAXNOC];
|
int pops[MAXNOC];
|
||||||
int tpops[MAXNOC];
|
int tpops[MAXNOC];
|
||||||
|
|
||||||
|
@ -87,10 +86,9 @@ update_main(void)
|
||||||
memset(nat_budget, 0, sizeof(nat_budget));
|
memset(nat_budget, 0, sizeof(nat_budget));
|
||||||
memset(pops, 0, sizeof(pops));
|
memset(pops, 0, sizeof(pops));
|
||||||
for (n = 0; n < MAXNOC; n++) {
|
for (n = 0; n < MAXNOC; n++) {
|
||||||
money[n] = 0;
|
|
||||||
if (!(np = getnatp(n)))
|
if (!(np = getnatp(n)))
|
||||||
continue;
|
continue;
|
||||||
money[n] = np->nat_money;
|
nat_budget[n].start_money = nat_budget[n].money = np->nat_money;
|
||||||
tpops[n] = count_pop(n);
|
tpops[n] = count_pop(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,6 +206,7 @@ prod_nat(int etu)
|
||||||
np->nat_level[NAT_RLEV] += rlev;
|
np->nat_level[NAT_RLEV] += rlev;
|
||||||
if (tlev != 0.0)
|
if (tlev != 0.0)
|
||||||
np->nat_level[NAT_TLEV] += tlev;
|
np->nat_level[NAT_TLEV] += tlev;
|
||||||
|
|
||||||
bm = nat_budget[n].bm;
|
bm = nat_budget[n].bm;
|
||||||
sea_money = bm[BUDG_SHP_MAINT].money + bm[BUDG_SHP_BUILD].money;
|
sea_money = bm[BUDG_SHP_MAINT].money + bm[BUDG_SHP_BUILD].money;
|
||||||
air_money = bm[BUDG_PLN_MAINT].money + bm[BUDG_PLN_BUILD].money;
|
air_money = bm[BUDG_PLN_MAINT].money + bm[BUDG_PLN_BUILD].money;
|
||||||
|
@ -214,8 +215,12 @@ prod_nat(int etu)
|
||||||
wu(0, n,
|
wu(0, n,
|
||||||
"Army delta $%d, Navy delta $%d, Air force delta $%d\n",
|
"Army delta $%d, Navy delta $%d, Air force delta $%d\n",
|
||||||
lnd_money, sea_money, air_money);
|
lnd_money, sea_money, air_money);
|
||||||
|
if (CANT_HAPPEN(np->nat_money != nat_budget[n].start_money))
|
||||||
|
nat_budget[n].money += np->nat_money - nat_budget[n].start_money;
|
||||||
wu(0, n, "money delta was $%d for this update\n",
|
wu(0, n, "money delta was $%d for this update\n",
|
||||||
np->nat_money - money[n]);
|
nat_budget[n].money - nat_budget[n].start_money);
|
||||||
|
np->nat_money = nat_budget[n].money;
|
||||||
|
|
||||||
if (opt_LOSE_CONTACT) {
|
if (opt_LOSE_CONTACT) {
|
||||||
for (cn = 1; cn < MAXNOC; cn++) {
|
for (cn = 1; cn < MAXNOC; cn++) {
|
||||||
if ((cnp = getnatp(cn)) != NULL)
|
if ((cnp = getnatp(cn)) != NULL)
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
#include "ship.h"
|
#include "ship.h"
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
static void upd_plane(struct plnstr *, int, struct natstr *, struct bp *, int);
|
static void upd_plane(struct plnstr *, int, struct bp *, int);
|
||||||
static void planerepair(struct plnstr *, struct natstr *, struct bp *,
|
static void planerepair(struct plnstr *, struct natstr *, struct bp *,
|
||||||
int, struct budget *);
|
int, struct budget *);
|
||||||
|
|
||||||
|
@ -54,9 +54,7 @@ prod_plane(int etus, int natnum, struct bp *bp, int buildem)
|
||||||
/* Build = 1, maintain =0 */
|
/* Build = 1, maintain =0 */
|
||||||
{
|
{
|
||||||
struct plnstr *pp;
|
struct plnstr *pp;
|
||||||
struct natstr *np;
|
|
||||||
int i;
|
int i;
|
||||||
int start_money;
|
|
||||||
|
|
||||||
for (i = 0; (pp = getplanep(i)); i++) {
|
for (i = 0; (pp = getplanep(i)); i++) {
|
||||||
if (pp->pln_own == 0)
|
if (pp->pln_own == 0)
|
||||||
|
@ -77,24 +75,20 @@ prod_plane(int etus, int natnum, struct bp *bp, int buildem)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
np = getnatp(pp->pln_own);
|
upd_plane(pp, etus, bp, buildem);
|
||||||
start_money = np->nat_money;
|
|
||||||
upd_plane(pp, etus, np, bp, buildem);
|
|
||||||
if (player->simulation)
|
|
||||||
np->nat_money = start_money;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
upd_plane(struct plnstr *pp, int etus,
|
upd_plane(struct plnstr *pp, int etus, struct bp *bp, int build)
|
||||||
struct natstr *np, struct bp *bp, int build)
|
|
||||||
{
|
{
|
||||||
struct budget *budget = &nat_budget[pp->pln_own];
|
struct budget *budget = &nat_budget[pp->pln_own];
|
||||||
struct plchrstr *pcp = &plchr[(int)pp->pln_type];
|
struct plchrstr *pcp = &plchr[pp->pln_type];
|
||||||
|
struct natstr *np = getnatp(pp->pln_own);
|
||||||
int mult, cost, eff_lost;
|
int mult, cost, eff_lost;
|
||||||
|
|
||||||
if (build == 1) {
|
if (build == 1) {
|
||||||
if (!pp->pln_off && np->nat_money >= 0)
|
if (!pp->pln_off && budget->money >= 0)
|
||||||
planerepair(pp, np, bp, etus, budget);
|
planerepair(pp, np, bp, etus, budget);
|
||||||
if (!player->simulation)
|
if (!player->simulation)
|
||||||
pp->pln_off = 0;
|
pp->pln_off = 0;
|
||||||
|
@ -104,7 +98,7 @@ upd_plane(struct plnstr *pp, int etus,
|
||||||
mult = 2;
|
mult = 2;
|
||||||
budget->bm[BUDG_PLN_MAINT].count++;
|
budget->bm[BUDG_PLN_MAINT].count++;
|
||||||
cost = -(mult * etus * MIN(0.0, pcp->pl_cost * money_plane));
|
cost = -(mult * etus * MIN(0.0, pcp->pl_cost * money_plane));
|
||||||
if (np->nat_money < cost && !player->simulation) {
|
if (budget->money < cost && !player->simulation) {
|
||||||
eff_lost = etus / 5;
|
eff_lost = etus / 5;
|
||||||
if (pp->pln_effic - eff_lost < PLANE_MINEFF)
|
if (pp->pln_effic - eff_lost < PLANE_MINEFF)
|
||||||
eff_lost = pp->pln_effic - PLANE_MINEFF;
|
eff_lost = pp->pln_effic - PLANE_MINEFF;
|
||||||
|
@ -115,12 +109,12 @@ upd_plane(struct plnstr *pp, int etus,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
budget->bm[BUDG_PLN_MAINT].money -= cost;
|
budget->bm[BUDG_PLN_MAINT].money -= cost;
|
||||||
np->nat_money -= cost;
|
budget->money -= cost;
|
||||||
}
|
}
|
||||||
/* flight pay is 5x the pay received by other military */
|
/* flight pay is 5x the pay received by other military */
|
||||||
cost = etus * pcp->pl_mat[I_MILIT] * -money_mil * 5;
|
cost = etus * pcp->pl_mat[I_MILIT] * -money_mil * 5;
|
||||||
budget->bm[BUDG_PLN_MAINT].money -= cost;
|
budget->bm[BUDG_PLN_MAINT].money -= cost;
|
||||||
np->nat_money -= cost;
|
budget->money -= cost;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,8 +199,7 @@ planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus,
|
||||||
cost = roundavg(mult * build * pcp->pl_cost / 100.0);
|
cost = roundavg(mult * build * pcp->pl_cost / 100.0);
|
||||||
budget->bm[BUDG_PLN_BUILD].count += !!build;
|
budget->bm[BUDG_PLN_BUILD].count += !!build;
|
||||||
budget->bm[BUDG_PLN_BUILD].money -= cost;
|
budget->bm[BUDG_PLN_BUILD].money -= cost;
|
||||||
np->nat_money -= cost;
|
budget->money -= cost;
|
||||||
if (!player->simulation) {
|
if (!player->simulation)
|
||||||
pp->pln_effic += (signed char)build;
|
pp->pln_effic += (signed char)build;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -101,10 +101,6 @@ prepare_sects(int etu)
|
||||||
for (n = 0; NULL != (np = getnatp(n)); n++) {
|
for (n = 0; NULL != (np = getnatp(n)); n++) {
|
||||||
upd_slmilcosts(etu, np->nat_cnum);
|
upd_slmilcosts(etu, np->nat_cnum);
|
||||||
pay_reserve(np, etu);
|
pay_reserve(np, etu);
|
||||||
np->nat_money += nat_budget[n].mil.money;
|
|
||||||
np->nat_money += nat_budget[n].civ.money;
|
|
||||||
np->nat_money += nat_budget[n].uw.money;
|
|
||||||
np->nat_money += nat_budget[n].bars.money;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,15 +119,18 @@ tax(struct sctstr *sp, int etu, int *pop)
|
||||||
civ_tax /= 4;
|
civ_tax /= 4;
|
||||||
budget->civ.count += sp->sct_item[I_CIVIL];
|
budget->civ.count += sp->sct_item[I_CIVIL];
|
||||||
budget->civ.money += civ_tax;
|
budget->civ.money += civ_tax;
|
||||||
|
budget->money += civ_tax;
|
||||||
|
|
||||||
uw_tax = (int)(0.5 + sp->sct_item[I_UW] * sp->sct_effic *
|
uw_tax = (int)(0.5 + sp->sct_item[I_UW] * sp->sct_effic *
|
||||||
etu * money_uw / 100);
|
etu * money_uw / 100);
|
||||||
budget->uw.count += sp->sct_item[I_UW];
|
budget->uw.count += sp->sct_item[I_UW];
|
||||||
budget->uw.money += uw_tax;
|
budget->uw.money += uw_tax;
|
||||||
|
budget->money += uw_tax;
|
||||||
|
|
||||||
mil_pay = sp->sct_item[I_MILIT] * etu * money_mil;
|
mil_pay = sp->sct_item[I_MILIT] * etu * money_mil;
|
||||||
budget->mil.count += sp->sct_item[I_MILIT];
|
budget->mil.count += sp->sct_item[I_MILIT];
|
||||||
budget->mil.money += mil_pay;
|
budget->mil.money += mil_pay;
|
||||||
|
budget->money += mil_pay;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* only non-captured civs add to census for nation
|
* only non-captured civs add to census for nation
|
||||||
|
@ -145,7 +144,7 @@ upd_slmilcosts(int etu, natid n)
|
||||||
{
|
{
|
||||||
struct shpstr *sp;
|
struct shpstr *sp;
|
||||||
struct lndstr *lp;
|
struct lndstr *lp;
|
||||||
int mil, i;
|
int mil, i, mil_pay;
|
||||||
|
|
||||||
mil = 0;
|
mil = 0;
|
||||||
|
|
||||||
|
@ -161,8 +160,10 @@ upd_slmilcosts(int etu, natid n)
|
||||||
mil += lp->lnd_item[I_MILIT];
|
mil += lp->lnd_item[I_MILIT];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mil_pay = mil * etu * money_mil;
|
||||||
nat_budget[n].mil.count += mil;
|
nat_budget[n].mil.count += mil;
|
||||||
nat_budget[n].mil.money += mil * etu * money_mil;
|
nat_budget[n].mil.money += mil_pay;
|
||||||
|
nat_budget[n].money += mil_pay;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -173,11 +174,14 @@ bank_income(struct sctstr *sp, int etu)
|
||||||
inc = (int)(sp->sct_item[I_BAR] * etu * bankint * sp->sct_effic / 100);
|
inc = (int)(sp->sct_item[I_BAR] * etu * bankint * sp->sct_effic / 100);
|
||||||
nat_budget[sp->sct_own].bars.count += sp->sct_item[I_BAR];
|
nat_budget[sp->sct_own].bars.count += sp->sct_item[I_BAR];
|
||||||
nat_budget[sp->sct_own].bars.money += inc;
|
nat_budget[sp->sct_own].bars.money += inc;
|
||||||
|
nat_budget[sp->sct_own].money += inc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pay_reserve(struct natstr *np, int etu)
|
pay_reserve(struct natstr *np, int etu)
|
||||||
{
|
{
|
||||||
nat_budget[np->nat_cnum].mil.money
|
int pay = (int)(np->nat_reserve * money_res * etu);
|
||||||
+= (int)(np->nat_reserve * money_res * etu);
|
|
||||||
|
nat_budget[np->nat_cnum].mil.money += pay;
|
||||||
|
nat_budget[np->nat_cnum].money += pay;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,8 +163,7 @@ produce(struct natstr *np, struct sctstr *sp)
|
||||||
|
|
||||||
budget->prod[sp->sct_type].count += actual;
|
budget->prod[sp->sct_type].count += actual;
|
||||||
budget->prod[sp->sct_type].money -= cost;
|
budget->prod[sp->sct_type].money -= cost;
|
||||||
if (!player->simulation)
|
budget->money -= cost;
|
||||||
np->nat_money -= cost;
|
|
||||||
|
|
||||||
if (CANT_HAPPEN(p_e <= 0.0))
|
if (CANT_HAPPEN(p_e <= 0.0))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -114,8 +114,7 @@ enlist(struct natstr *np, short *vec, int etu)
|
||||||
|
|
||||||
nat_budget[np->nat_cnum].prod[SCT_ENLIST].count += enlisted;
|
nat_budget[np->nat_cnum].prod[SCT_ENLIST].count += enlisted;
|
||||||
nat_budget[np->nat_cnum].prod[SCT_ENLIST].money -= enlisted * 3;
|
nat_budget[np->nat_cnum].prod[SCT_ENLIST].money -= enlisted * 3;
|
||||||
if (!player->simulation)
|
nat_budget[np->nat_cnum].money -= enlisted * 3;
|
||||||
np->nat_money -= enlisted * 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fallout is calculated here. */
|
/* Fallout is calculated here. */
|
||||||
|
@ -258,7 +257,7 @@ produce_sect(struct natstr *np, int etu, struct bp *bp)
|
||||||
|
|
||||||
do_feed(sp, np, etu, 0);
|
do_feed(sp, np, etu, 0);
|
||||||
|
|
||||||
if (sp->sct_off || np->nat_money < 0) {
|
if (sp->sct_off || budget->money < 0) {
|
||||||
sp->sct_avail = 0;
|
sp->sct_avail = 0;
|
||||||
bp_set_from_sect(bp, sp);
|
bp_set_from_sect(bp, sp);
|
||||||
continue;
|
continue;
|
||||||
|
@ -268,17 +267,15 @@ produce_sect(struct natstr *np, int etu, struct bp *bp)
|
||||||
cost = etu * dchr[sp->sct_type].d_maint;
|
cost = etu * dchr[sp->sct_type].d_maint;
|
||||||
budget->bm[BUDG_SCT_MAINT].count++;
|
budget->bm[BUDG_SCT_MAINT].count++;
|
||||||
budget->bm[BUDG_SCT_MAINT].money -= cost;
|
budget->bm[BUDG_SCT_MAINT].money -= cost;
|
||||||
if (!player->simulation)
|
budget->money -= cost;
|
||||||
np->nat_money -= cost;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((sp->sct_effic < 100 || sp->sct_type != sp->sct_newtype) &&
|
if ((sp->sct_effic < 100 || sp->sct_type != sp->sct_newtype) &&
|
||||||
np->nat_money >= 0) {
|
budget->money >= 0) {
|
||||||
cost = roundavg(buildeff(sp));
|
cost = roundavg(buildeff(sp));
|
||||||
budget->bm[BUDG_SCT_BUILD].count++;
|
budget->bm[BUDG_SCT_BUILD].count++;
|
||||||
budget->bm[BUDG_SCT_BUILD].money -= cost;
|
budget->bm[BUDG_SCT_BUILD].money -= cost;
|
||||||
if (!player->simulation)
|
budget->money -= cost;
|
||||||
np->nat_money -= cost;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sp->sct_type == SCT_ENLIST && sp->sct_effic >= 60 &&
|
if (sp->sct_type == SCT_ENLIST && sp->sct_effic >= 60 &&
|
||||||
|
@ -291,7 +288,7 @@ produce_sect(struct natstr *np, int etu, struct bp *bp)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (sp->sct_effic >= 60) {
|
if (sp->sct_effic >= 60) {
|
||||||
if (np->nat_money >= 0 && dchr[sp->sct_type].d_prd >= 0)
|
if (budget->money >= 0 && dchr[sp->sct_type].d_prd >= 0)
|
||||||
produce(np, sp);
|
produce(np, sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
#include "ship.h"
|
#include "ship.h"
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
static void upd_ship(struct shpstr *, int, struct natstr *, struct bp *, int);
|
static void upd_ship(struct shpstr *, int, struct bp *, int);
|
||||||
static void shiprepair(struct shpstr *, struct natstr *, struct bp *,
|
static void shiprepair(struct shpstr *, struct natstr *, struct bp *,
|
||||||
int, struct budget *);
|
int, struct budget *);
|
||||||
static int feed_ship(struct shpstr *, int);
|
static int feed_ship(struct shpstr *, int);
|
||||||
|
@ -60,9 +60,7 @@ prod_ship(int etus, int natnum, struct bp *bp, int build)
|
||||||
/* build = 1, maintain = 0 */
|
/* build = 1, maintain = 0 */
|
||||||
{
|
{
|
||||||
struct shpstr *sp;
|
struct shpstr *sp;
|
||||||
struct natstr *np;
|
|
||||||
int i;
|
int i;
|
||||||
int start_money;
|
|
||||||
|
|
||||||
for (i = 0; (sp = getshipp(i)); i++) {
|
for (i = 0; (sp = getshipp(i)); i++) {
|
||||||
if (sp->shp_own == 0)
|
if (sp->shp_own == 0)
|
||||||
|
@ -76,22 +74,18 @@ prod_ship(int etus, int natnum, struct bp *bp, int build)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
np = getnatp(sp->shp_own);
|
upd_ship(sp, etus, bp, build);
|
||||||
start_money = np->nat_money;
|
|
||||||
upd_ship(sp, etus, np, bp, build);
|
|
||||||
if (player->simulation)
|
|
||||||
np->nat_money = start_money;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
upd_ship(struct shpstr *sp, int etus,
|
upd_ship(struct shpstr *sp, int etus, struct bp *bp, int build)
|
||||||
struct natstr *np, struct bp *bp, int build)
|
|
||||||
/* build = 1, maintain = 0 */
|
/* build = 1, maintain = 0 */
|
||||||
{
|
{
|
||||||
struct budget *budget = &nat_budget[sp->shp_own];
|
struct budget *budget = &nat_budget[sp->shp_own];
|
||||||
|
struct mchrstr *mp = &mchr[sp->shp_type];
|
||||||
|
struct natstr *np = getnatp(sp->shp_own);
|
||||||
struct sctstr *sectp;
|
struct sctstr *sectp;
|
||||||
struct mchrstr *mp;
|
|
||||||
int pstage, ptime;
|
int pstage, ptime;
|
||||||
int oil_gained;
|
int oil_gained;
|
||||||
int max_oil;
|
int max_oil;
|
||||||
|
@ -101,9 +95,8 @@ upd_ship(struct shpstr *sp, int etus,
|
||||||
int dep;
|
int dep;
|
||||||
int n, mult, cost, eff_lost;
|
int n, mult, cost, eff_lost;
|
||||||
|
|
||||||
mp = &mchr[(int)sp->shp_type];
|
|
||||||
if (build == 1) {
|
if (build == 1) {
|
||||||
if (!sp->shp_off && np->nat_money >= 0)
|
if (!sp->shp_off && budget->money >= 0)
|
||||||
shiprepair(sp, np, bp, etus, budget);
|
shiprepair(sp, np, bp, etus, budget);
|
||||||
if (!player->simulation)
|
if (!player->simulation)
|
||||||
sp->shp_off = 0;
|
sp->shp_off = 0;
|
||||||
|
@ -113,7 +106,7 @@ upd_ship(struct shpstr *sp, int etus,
|
||||||
mult = 2;
|
mult = 2;
|
||||||
budget->bm[BUDG_SHP_MAINT].count++;
|
budget->bm[BUDG_SHP_MAINT].count++;
|
||||||
cost = -(mult * etus * MIN(0.0, money_ship * mp->m_cost));
|
cost = -(mult * etus * MIN(0.0, money_ship * mp->m_cost));
|
||||||
if (np->nat_money < cost && !player->simulation) {
|
if (budget->money < cost && !player->simulation) {
|
||||||
eff_lost = etus / 5;
|
eff_lost = etus / 5;
|
||||||
if (sp->shp_effic - eff_lost < SHIP_MINEFF)
|
if (sp->shp_effic - eff_lost < SHIP_MINEFF)
|
||||||
eff_lost = sp->shp_effic - SHIP_MINEFF;
|
eff_lost = sp->shp_effic - SHIP_MINEFF;
|
||||||
|
@ -124,14 +117,14 @@ upd_ship(struct shpstr *sp, int etus,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
budget->bm[BUDG_SHP_MAINT].money -= cost;
|
budget->bm[BUDG_SHP_MAINT].money -= cost;
|
||||||
np->nat_money -= cost;
|
budget->money -= cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player->simulation) {
|
if (!player->simulation) {
|
||||||
sectp = getsectp(sp->shp_x, sp->shp_y);
|
sectp = getsectp(sp->shp_x, sp->shp_y);
|
||||||
|
|
||||||
/* produce oil */
|
/* produce oil */
|
||||||
if (np->nat_money >= 0
|
if (budget->money >= 0
|
||||||
&& (mp->m_flags & M_OIL) && sectp->sct_type == SCT_WATER) {
|
&& (mp->m_flags & M_OIL) && sectp->sct_type == SCT_WATER) {
|
||||||
product = &pchr[dchr[SCT_OIL].d_prd];
|
product = &pchr[dchr[SCT_OIL].d_prd];
|
||||||
oil_gained = roundavg(total_work(100, etus,
|
oil_gained = roundavg(total_work(100, etus,
|
||||||
|
@ -157,7 +150,7 @@ upd_ship(struct shpstr *sp, int etus,
|
||||||
sp->shp_item[I_OIL] += oil_gained;
|
sp->shp_item[I_OIL] += oil_gained;
|
||||||
}
|
}
|
||||||
/* produce fish */
|
/* produce fish */
|
||||||
if (np->nat_money >= 0
|
if (budget->money >= 0
|
||||||
&& (mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {
|
&& (mp->m_flags & M_FOOD) && sectp->sct_type == SCT_WATER) {
|
||||||
sp->shp_item[I_FOOD]
|
sp->shp_item[I_FOOD]
|
||||||
+= roundavg(total_work(100, etus,
|
+= roundavg(total_work(100, etus,
|
||||||
|
@ -317,7 +310,7 @@ shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus,
|
||||||
cost = roundavg(mult * mp->m_cost * build / 100.0);
|
cost = roundavg(mult * mp->m_cost * build / 100.0);
|
||||||
budget->bm[BUDG_SHP_BUILD].count += !!build;
|
budget->bm[BUDG_SHP_BUILD].count += !!build;
|
||||||
budget->bm[BUDG_SHP_BUILD].money -= cost;
|
budget->bm[BUDG_SHP_BUILD].money -= cost;
|
||||||
np->nat_money -= cost;
|
budget->money -= cost;
|
||||||
if (!player->simulation)
|
if (!player->simulation)
|
||||||
ship->shp_effic += (signed char)build;
|
ship->shp_effic += (signed char)build;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
budget
|
budget
|
||||||
| BUG: military payroll slightly low
|
| BUG: military payroll slightly low
|
||||||
| BUG: expenses ignore going broke
|
|
||||||
| TODO is it accurate?
|
| TODO is it accurate?
|
||||||
production *
|
production *
|
||||||
| Note: ignores going broke
|
| Note: ignores going broke
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
budget
|
budget
|
||||||
| BUG: expenses ignore becoming solvent
|
|
||||||
| TODO is it accurate?
|
| TODO is it accurate?
|
||||||
production *
|
production *
|
||||||
| TODO is it accurate?
|
| TODO is it accurate?
|
||||||
|
|
|
@ -225,23 +225,17 @@
|
||||||
Play#2 input budget
|
Play#2 input budget
|
||||||
Play#2 command budget
|
Play#2 command budget
|
||||||
Play#2 output Play#2 1 Sector Type Production Cost
|
Play#2 output Play#2 1 Sector Type Production Cost
|
||||||
Play#2 output Play#2 1 technical center 1 tech 300
|
|
||||||
Play#2 output Play#2 1 Ship building 2 ships 450
|
|
||||||
Play#2 output Play#2 1 Ship maintenance 3 ships 90
|
Play#2 output Play#2 1 Ship maintenance 3 ships 90
|
||||||
Play#2 output Play#2 1 Plane building 1 plane 360
|
|
||||||
Play#2 output Play#2 1 Plane maintenance 3 planes 144
|
Play#2 output Play#2 1 Plane maintenance 3 planes 144
|
||||||
Play#2 output Play#2 1 Unit building 1 unit 450
|
|
||||||
Play#2 output Play#2 1 Unit maintenance 3 units 90
|
Play#2 output Play#2 1 Unit maintenance 3 units 90
|
||||||
Play#2 output Play#2 1 Sector building 26 sectors 209
|
|
||||||
Play#2 output Play#2 1 Sector maintenance 5 sectors 300
|
|
||||||
Play#2 output Play#2 1 Military payroll 1900 mil, 1000 res 9994
|
Play#2 output Play#2 1 Military payroll 1900 mil, 1000 res 9994
|
||||||
Play#2 output Play#2 1 Total expenses.....................................................12387
|
Play#2 output Play#2 1 Total expenses.....................................................10318
|
||||||
Play#2 output Play#2 1 Income from taxes 6800 civs, 4000 uws +1076
|
Play#2 output Play#2 1 Income from taxes 6800 civs, 4000 uws +1076
|
||||||
Play#2 output Play#2 1 Income from bars 400 bars +2865
|
Play#2 output Play#2 1 Income from bars 400 bars +2865
|
||||||
Play#2 output Play#2 1 Total income.......................................................+3941
|
Play#2 output Play#2 1 Total income.......................................................+3941
|
||||||
Play#2 output Play#2 1 Balance forward 100
|
Play#2 output Play#2 1 Balance forward 100
|
||||||
Play#2 output Play#2 1 Estimated delta -8446
|
Play#2 output Play#2 1 Estimated delta -6377
|
||||||
Play#2 output Play#2 1 Estimated new treasury.............................................-8346
|
Play#2 output Play#2 1 Estimated new treasury.............................................-6277
|
||||||
Play#2 output Play#2 1 After processsing sectors, you will be broke!
|
Play#2 output Play#2 1 After processsing sectors, you will be broke!
|
||||||
Play#2 output Play#2 1 Sectors will not produce, distribute, or deliver!
|
Play#2 output Play#2 1 Sectors will not produce, distribute, or deliver!
|
||||||
Play#2 output Play#2 1
|
Play#2 output Play#2 1
|
||||||
|
@ -279,13 +273,16 @@
|
||||||
Play#3 input budget
|
Play#3 input budget
|
||||||
Play#3 command budget
|
Play#3 command budget
|
||||||
Play#3 output Play#3 1 Sector Type Production Cost
|
Play#3 output Play#3 1 Sector Type Production Cost
|
||||||
|
Play#3 output Play#3 1 uranium mine 67 rad 156
|
||||||
|
Play#3 output Play#3 1 Sector building 56 sectors 39
|
||||||
|
Play#3 output Play#3 1 Sector maintenance 1 sector 60
|
||||||
Play#3 output Play#3 1 Military payroll 170 mil, 0 res 848
|
Play#3 output Play#3 1 Military payroll 170 mil, 0 res 848
|
||||||
Play#3 output Play#3 1 Total expenses.......................................................848
|
Play#3 output Play#3 1 Total expenses......................................................1103
|
||||||
Play#3 output Play#3 1 Income from taxes 16549 civs, 150 uws +5540
|
Play#3 output Play#3 1 Income from taxes 16549 civs, 150 uws +5540
|
||||||
Play#3 output Play#3 1 Total income.......................................................+5540
|
Play#3 output Play#3 1 Total income.......................................................+5540
|
||||||
Play#3 output Play#3 1 Balance forward -100
|
Play#3 output Play#3 1 Balance forward -100
|
||||||
Play#3 output Play#3 1 Estimated delta +4692
|
Play#3 output Play#3 1 Estimated delta +4437
|
||||||
Play#3 output Play#3 1 Estimated new treasury..............................................4592
|
Play#3 output Play#3 1 Estimated new treasury..............................................4337
|
||||||
Play#3 output Play#3 6 0 99
|
Play#3 output Play#3 6 0 99
|
||||||
Play#3 input production *
|
Play#3 input production *
|
||||||
Play#3 command production
|
Play#3 command production
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue