empserver/include/update.h
Markus Armbruster 4be4a2c540 update budget produce: Count loaded civilians for TECH_POP
When option TECH_POP is enabled, the cost of tech increases when
civilian population exceeds 50000.  Only civilians in old-owned
sectors count.  This differs from education and happiness, where
civilians loaded on ships and land units count, too.

The update counts population for TECH_POP with count_pop().  This is
an extra pass over all sectors.

produce also uses count_pop(), once per tech center examined.
Wasteful.

budget avoids count_pop(): it uses tax()'s civilian count.  More
efficient, but the difference to the update is ugly.

Change TECH_POP to use the same civilian count as education and
happiness, i.e. count civilians on ships and land units, too.

This count is available in nat_budget[] in time for produce(): it's
computed by tax() and by ship and land unit maintenance.  So use it
there.  This takes care of the update and budget.  produce doesn't run
enough update code to do the same.  Keep calling count_pop() there.
Update it to match the update, and give it internal linkage.
Duplicating update's workings there is ugly, so mark it FIXME.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
2017-08-06 20:08:30 +02:00

154 lines
4.7 KiB
C

/*
* Empire - A multi-player, client/server Internet based war game.
* Copyright (C) 1986-2016, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* See files README, COPYING and CREDITS in the root of the source
* tree for related information and legal notices. It is expected
* that future projects/authors will amend these files as needed.
*
* ---
*
* update.h: Definitions related to the update
*
* Known contributors to this file:
* Ville Virrankoski, 1995
* Markus Armbruster, 2004-2016
*/
#ifndef UPDATE_H
#define UPDATE_H
#include "sect.h"
#define IMPORT 0
#define EXPORT 1
enum {
BUDG_SHP_BUILD,
BUDG_SHP_MAINT,
BUDG_PLN_BUILD,
BUDG_PLN_MAINT,
BUDG_LND_BUILD,
BUDG_LND_MAINT,
BUDG_SCT_BUILD,
BUDG_SCT_MAINT,
BUDG_BLD_MAX = BUDG_SCT_MAINT
};
struct budg_item {
double money; /* money delta */
int count; /* #things making/consuming the money */
};
/* A nation's budget for an update */
struct budget {
/* production by sector type */
struct budg_item prod[SCT_TYPE_MAX + 1];
/* building and maintenance */
struct budg_item bm[BUDG_BLD_MAX + 1];
/* population, taxes, military payroll, bank interest */
struct budg_item civ, mil, uw, bars;
/* treasury */
int start_money; /* at beginning of update */
double money; /* current */
/* population before growth */
int oldowned_civs;
};
/* main.c */
extern struct budget nat_budget[MAXNOC];
/* nat.c */
extern float levels[MAXNOC][4];
/* age.c */
extern int age_people(int, int);
extern void age_levels(int);
/* anno.c */
extern void delete_old_announcements(void);
/* bp.c */
extern struct bp *bp_alloc(void);
extern void bp_set_from_sect(struct bp *, struct sctstr *);
extern void bp_to_sect(struct bp *, struct sctstr *);
/* deliver.c */
extern void dodeliver(struct sctstr *);
/* distribute.c */
extern int dodistribute(struct sctstr *, int, double);
/* finish.c */
extern void finish_sects(int);
/* human.c */
extern void do_feed(struct sctstr *, struct natstr *, int, int);
extern int feed_people(short *, int);
extern double food_needed(short *, int);
extern int famine_victims(short *, int);
/* land.c */
extern void prod_land(int, int, struct bp *, int);
/* main.c */
/* in server.h */
/* material.c */
extern int get_materials(struct sctstr *, short[], int);
/* mobility.c */
extern void mob_sect(void);
extern void mob_ship(void);
extern void mob_land(void);
extern void mob_plane(void);
extern void sct_do_upd_mob(struct sctstr *sp);
extern void shp_do_upd_mob(struct shpstr *sp);
extern void lnd_do_upd_mob(struct lndstr *lp);
extern void pln_do_upd_mob(struct plnstr *pp);
/* move_sat.c */
extern void move_sat(struct plnstr *);
/* nat.c */
extern void prod_nat(int);
/* nxtitemp.c */
/* in nsc.h */
/* plague.c */
extern void do_plague(struct sctstr *, int);
extern int plague_people(struct natstr *, short *, int *, int *, int);
/* plane.c */
extern void prod_plane(int, int, struct bp *, int);
/* populace.c */
extern void populace(struct sctstr *, int);
extern int total_work(int, int, int, int, int, int);
/* prepare.c */
extern void prepare_sects(int);
extern void tax(struct sctstr *, int);
extern void upd_slmilcosts(int, natid);
extern void bank_income(struct sctstr *, int);
extern void pay_reserve(struct natstr *, int);
/* produce.c */
extern void produce(struct natstr *, struct sctstr *);
extern double prod_output(struct sctstr *, double);
extern double prod_materials_cost(struct pchrstr *, short[], int *);
extern double prod_resource_limit(struct pchrstr *, unsigned char *);
extern double prod_eff(int, float);
/* removewants.c */
extern int update_removewants(void);
/* revolt.c */
extern void revolt(struct sctstr *);
extern void guerrilla(struct sctstr *);
/* sect.c */
extern double buildeff(struct sctstr *);
extern void do_fallout(struct sctstr *, int);
extern void spread_fallout(struct sctstr *, int);
extern void decay_fallout(struct sctstr *, int);
extern void produce_sect(struct natstr *, int, struct bp *);
/* ship.c */
extern void prod_ship(int, int, struct bp *, int);
#endif