]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/budg.c
commands: Rename the command functions
[empserver] / src / lib / commands / budg.c
index e8bac00e604c3cc369481862e6e416f5111d8cba..5c26a45fc59553b1172697bb28ac5567f8f67849 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2014, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2021, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                Ken Stevens, Steve McClure, Markus Armbruster
  *
  *  Empire is free software: you can redistribute it and/or modify
  *     Thomas Ruschak, 1992
  *     Ville Virrankoski, 1995
  *     Steve McClure, 1997-2000
- *     Markus Armbruster, 2004-2013
+ *     Markus Armbruster, 2004-2020
  */
 
 #include <config.h>
 
-#include <ctype.h>
-#include "budg.h"
+#include <limits.h>
 #include "commands.h"
 #include "item.h"
 #include "optlist.h"
 #include "product.h"
+#include "update.h"
 
-static void calc_all(int (*p_sect)[2], int *taxes, int *Ncivs,
-                    int *Nuws, int *bars, int *Nbars, int *mil,
-                    int *ships, int *sbuild, int *nsbuild, int *smaint,
-                    int *units, int *lbuild, int *nlbuild, int *lmaint,
-                    int *planes, int *pbuild, int *npbuild, int *pmaint);
+static struct budget *calc_all(void);
 static char *dotsprintf(char *buf, char *format, int data);
 
 int
-budg(void)
+c_budget(void)
 {
-    int i;
-    int p_sect[SCT_BUDG_MAX+1][2];
-    int taxes, Ncivs, Nuws, bars, Nbars, mil;
-    int ships, sbuild, nsbuild, smaint;
-    int units, lbuild, nlbuild, lmaint;
-    int planes, pbuild, npbuild, pmaint;
-    int n, etu;
-    int income, expenses;
+    static struct {
+       char *activity;
+       char *object;
+    } bm_name[] = {
+       { "Ship building", "ship" },
+       { "Ship maintenance", "ship" },
+       { "Plane building", "plane" },
+       { "Plane maintenance", "plane" },
+       { "Unit building", "unit" },
+       { "Unit maintenance", "unit" },
+       { "Sector building", "sector" },
+       { "Sector maintenance", "sector" }
+    };
+    unsigned i;
+    struct budget *budget;
+    int income, expenses, taxes;
     struct natstr *np;
     char buf[1024];
-    char in[80];
-
-    etu = etu_per_update;
 
     np = getnatp(player->cnum);
 
     player->simulation = 1;
-    calc_all(p_sect,
-            &taxes, &Ncivs, &Nuws, &bars, &Nbars, &mil,
-            &ships, &sbuild, &nsbuild, &smaint,
-            &units, &lbuild, &nlbuild, &lmaint,
-            &planes, &pbuild, &npbuild, &pmaint);
+    budget = calc_all();
     player->simulation = 0;
 
-    income = taxes + bars;
-    expenses = 0;
+    income = 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])
+    for (i = 0; i < ARRAY_SIZE(budget->prod); i++) {
+       if (!budget->prod[i].money)
            continue;
        pr("%-17s\t\t", dchr[i].d_name);
        if (i == SCT_ENLIST)
-           pr("%d mil    \t", p_sect[i][0]);
+           pr("%d mil    \t", budget->prod[i].count);
        else if (dchr[i].d_prd >= 0)
-           pr("%d %-7s\t", p_sect[i][0], pchr[dchr[i].d_prd].p_sname);
+           pr("%d %-7s\t", budget->prod[i].count,
+              pchr[dchr[i].d_prd].p_sname);
        else
            pr("\t\t");
-       pr("\t\t%8d\n", p_sect[i][1]);
-       expenses += p_sect[i][1];
-    }
-
-    if (sbuild) {
-       sprintf(buf, "%d ship%s", nsbuild, splur(nsbuild));
-       pr("Ship building\t\t\t%-16s\t\t%8d\n", buf, -sbuild);
-       expenses += -sbuild;
+       pr("\t\t%8.0f\n", -budget->prod[i].money);
+       expenses -= budget->prod[i].money;
     }
 
-    if (smaint) {
-       sprintf(buf, "%d ship%s", ships, splur(ships));
-       pr("Ship maintenance\t\t%-16s\t\t%8d\n", buf, -smaint);
-       expenses += -smaint;
-    }
-
-    if (pbuild) {
-       sprintf(buf, "%d plane%s", npbuild, splur(npbuild));
-       pr("Plane building\t\t\t%-16s\t\t%8d\n", buf, -pbuild);
-       expenses += -pbuild;
-    }
-
-    if (pmaint) {
-       sprintf(buf, "%d plane%s", planes, splur(planes));
-       pr("Plane maintenance\t\t%-16s\t\t%8d\n", buf, -pmaint);
-       expenses += -pmaint;
-    }
-    if (lbuild) {
-       sprintf(buf, "%d unit%s", nlbuild, splur(nlbuild));
-       pr("Unit building\t\t\t%-16s\t\t%8d\n", buf, -lbuild);
-       expenses += -lbuild;
+    for (i = 0; i <= BUDG_BLD_MAX; i++) {
+       if (!budget->bm[i].money)
+           continue;
+       snprintf(buf, sizeof(buf), "%d %s%s",
+                budget->bm[i].count, bm_name[i].object,
+                splur(budget->bm[i].count));
+       pr("%-20s\t\t%-16s\t\t%8.0f\n",
+          bm_name[i].activity, buf, -budget->bm[i].money);
+       expenses -= budget->bm[i].money;
     }
 
-    if (lmaint) {
-       sprintf(buf, "%d unit%s", units, splur(units));
-       pr("Unit maintenance\t\t%-16s\t\t%8d\n", buf, -lmaint);
-       expenses += -lmaint;
+    if (budget->mil.money) {
+       snprintf(buf, sizeof(buf), "%d mil, %d res",
+                budget->mil.count, np->nat_reserve);
+       pr("Military payroll\t\t%-32s%8.0f\n",
+          buf, -budget->mil.money);
+       expenses -= budget->mil.money;
     }
 
-    if (p_sect[SCT_EFFIC][1]) {
-       sprintf(buf, "%d sector%s",
-               p_sect[SCT_EFFIC][0], splur(p_sect[SCT_EFFIC][0]));
-       pr("Sector building\t\t\t%-16s\t\t%8d\n",
-          buf, p_sect[SCT_EFFIC][1]);
-       expenses += p_sect[SCT_EFFIC][1];
-    }
-    if (p_sect[SCT_MAINT][0]) {
-       sprintf(buf, "%d sector%s",
-               p_sect[SCT_MAINT][0], splur(p_sect[SCT_MAINT][0]));
-       pr("Sector maintenance\t\t%-16s\t\t%8d\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, np->nat_reserve);
-       pr("Military payroll\t\t%-32s%8d\n", in, -mil);
-       expenses -= mil;
-    }
     pr("Total expenses%s\n", dotsprintf(buf, "%58d", expenses));
+    taxes = budget->civ.money + budget->uw.money;
     if (taxes) {
-       sprintf(in, "%d civ%s, %d uw%s",
-               Ncivs, splur(Ncivs), Nuws, splur(Nuws));
-       pr("Income from taxes\t\t%-32s%+8d\n", in, taxes);
+       snprintf(buf, sizeof(buf), "%d civ%s, %d uw%s",
+                budget->civ.count, splur(budget->civ.count),
+                budget->uw.count, splur(budget->uw.count));
+       pr("Income from taxes\t\t%-32s%+8d\n", buf, taxes);
+       income += taxes;
     }
-    if (bars) {
-       sprintf(in, "%d bar%s", Nbars, splur(Nbars));
-       pr("Income from bars\t\t%-32s%+8d\n", in, bars);
+    if (budget->bars.money) {
+       snprintf(buf, sizeof(buf), "%d bar%s",
+                budget->bars.count, splur(budget->bars.count));
+       pr("Income from bars\t\t%-32s%+8.0f\n",
+          buf, budget->bars.money);
+       income += budget->bars.money;
     }
     pr("Total income%s\n", dotsprintf(buf, "%+60d", income));
     pr("Balance forward\t\t\t\t\t\t      %10d\n", np->nat_money);
@@ -164,92 +132,54 @@ budg(void)
     pr("Estimated new treasury%s\n",
        dotsprintf(buf, "%50d", np->nat_money + income - expenses));
     if (np->nat_money + income - expenses < 0 && !player->god) {
-       pr("After processsing sectors, you will be broke!\n");
+       pr("After processing sectors, you will be broke!\n");
        pr("Sectors will not produce, distribute, or deliver!\n\n");
     }
 
     return RET_OK;
 }
 
-static void
-calc_all(int p_sect[][2],
-        int *taxes, int *Ncivs, int *Nuws, int *bars, int *Nbars, int *mil,
-        int *ships, int *sbuild, int *nsbuild, int *smaint,
-        int *units, int *lbuild, int *nlbuild, int *lmaint,
-        int *planes, int *pbuild, int *npbuild, int *pmaint)
+static struct budget *
+calc_all(void)
 {
+    struct budget *budget = &nat_budget[player->cnum];
     struct natstr *np;
     struct bp *bp;
-    int pop = 0;
-    int n, civ_tax, uw_tax, mil_pay;
-    struct sctstr *sp;
+    int i;
     int etu = etu_per_update;
 
-    memset(p_sect, 0, sizeof(**p_sect) * (SCT_BUDG_MAX+1) * 2);
-    *taxes = *Ncivs = *Nuws = *bars = *Nbars = *mil = 0;
-    *ships = *sbuild = *nsbuild = *smaint = 0;
-    *units = *lbuild = *nlbuild = *lmaint = 0;
-    *planes = *pbuild = *npbuild = *pmaint = 0;
-
+    memset(nat_budget, 0, sizeof(nat_budget));
     np = getnatp(player->cnum);
+    /* Take care not to disclose others going broke: */
+    for (i = 0; i < MAXNOC; i++)
+       nat_budget[i].start_money = nat_budget[i].money = INT_MAX;
+    budget->start_money = budget->money = np->nat_money;
     bp = bp_alloc();
-    for (n = 0; NULL != (sp = getsectid(n)); n++) {
-       bp_set_from_sect(bp, sp);
-       if (sp->sct_own == player->cnum) {
-           sp->sct_updated = 0;
-           tax(sp, np, etu, &pop, &civ_tax, &uw_tax, &mil_pay);
-           *Ncivs += sp->sct_item[I_CIVIL];
-           *Nuws += sp->sct_item[I_UW];
-           *taxes += civ_tax + uw_tax;
-           *mil += mil_pay;
-           if (sp->sct_type == SCT_BANK) {
-               *bars += bank_income(sp, etu);
-               *Nbars += sp->sct_item[I_BAR];
-           }
-       }
-    }
-    tpops[player->cnum] = pop;
-    *mil += (int)(np->nat_reserve * money_res * etu);
-
-    *mil += upd_slmilcosts(np->nat_cnum, etu);
 
-    /* Maintain ships */
-    sea_money[player->cnum] = 0;
-    *ships = prod_ship(etu, player->cnum, bp, 0);
-    *smaint = sea_money[player->cnum];
+    prep_ships(etu, bp);
+    prep_planes(etu, bp);
+    prep_lands(etu, bp);
+    prepare_sects(etu, bp);
+    pay_reserve(np, etu);
 
-    /* Maintain planes */
-    air_money[player->cnum] = 0;
-    *planes = prod_plane(etu, player->cnum, bp, 0);
-    *pmaint = air_money[player->cnum];
-
-    /* Maintain land units */
-    lnd_money[player->cnum] = 0;
-    *units = prod_land(etu, player->cnum, bp, 0);
-    *lmaint = lnd_money[player->cnum];
+    /* Maintain ships, planes and land units */
+    prod_ship(etu, bp, 0);
+    prod_plane(etu, bp, 0);
+    prod_land(etu, bp, 0);
 
     /* Produce */
-    produce_sect(player->cnum, etu, bp, p_sect);
-
-    /* Build ships */
-    sea_money[player->cnum] = 0;
-    *nsbuild = prod_ship(etu, player->cnum, bp, 1);
-    *sbuild = sea_money[player->cnum];
-    sea_money[player->cnum] = 0;
+    produce_sect(etu, bp);
 
-    /* Build planes */
-    air_money[player->cnum] = 0;
-    *npbuild = prod_plane(etu, player->cnum, bp, 1);
-    *pbuild = air_money[player->cnum];
-    air_money[player->cnum] = 0;
+    /* Build ships, planes and land units */
+    prod_ship(etu, bp, 1);
+    prod_plane(etu, bp, 1);
+    prod_land(etu, bp, 1);
 
-    /* Build land units */
-    lnd_money[player->cnum] = 0;
-    *nlbuild = prod_land(etu, player->cnum, bp, 1);
-    *lbuild = lnd_money[player->cnum];
-    lnd_money[player->cnum] = 0;
+    if (CANT_HAPPEN(np->nat_money != budget->start_money))
+       np->nat_money = budget->start_money;
 
     free(bp);
+    return budget;
 }
 
 static char *