Replace the revolting build pointer data structure by a proper data
type. Make it abstract because that's possible. Change data layout so that the slots belonging to a sector are together in memory, it's nicer to the cache. (bp): The new type. Users changed. (get_wp): Update accordingly. (alloc_bp): New. (update_main, calc_all): Use it. Before, calc_all() allocated 1/7 more than necessary.
This commit is contained in:
parent
ac9cdf5bb9
commit
5507e8a1dc
13 changed files with 51 additions and 39 deletions
|
@ -39,10 +39,11 @@
|
||||||
|
|
||||||
#define SCT_EFFIC (SCT_TYPE_MAX + 1)
|
#define SCT_EFFIC (SCT_TYPE_MAX + 1)
|
||||||
|
|
||||||
void fill_update_array(int *bp, struct sctstr *sp);
|
struct bp *alloc_bp(void);
|
||||||
int gt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm);
|
void fill_update_array(struct bp *, struct sctstr *);
|
||||||
void pt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm, int amount);
|
int gt_bg_nmbr(struct bp *, struct sctstr *, i_type);
|
||||||
int get_materials(struct sctstr *, int *, int *, int);
|
void pt_bg_nmbr(struct bp *, struct sctstr *, i_type, int);
|
||||||
|
int get_materials(struct sctstr *, struct bp *, int *, int);
|
||||||
|
|
||||||
extern long money[MAXNOC];
|
extern long money[MAXNOC];
|
||||||
extern long pops[MAXNOC];
|
extern long pops[MAXNOC];
|
||||||
|
|
|
@ -735,12 +735,12 @@ extern void finish_sects(int);
|
||||||
/* human.c */
|
/* human.c */
|
||||||
extern int new_work(struct sctstr *, int);
|
extern int new_work(struct sctstr *, int);
|
||||||
extern int do_feed(struct sctstr *, struct natstr *,
|
extern int do_feed(struct sctstr *, struct natstr *,
|
||||||
short *, int *, int *, int);
|
short *, int *, struct bp *, int);
|
||||||
extern int feed_people(short *, int);
|
extern int feed_people(short *, int);
|
||||||
extern double food_needed(short *, int);
|
extern double food_needed(short *, int);
|
||||||
extern int famine_victims(short *, int);
|
extern int famine_victims(short *, int);
|
||||||
/* land.c */
|
/* land.c */
|
||||||
extern int prod_land(int, int, int *, int);
|
extern int prod_land(int, int, struct bp *, int);
|
||||||
/* main.c */
|
/* main.c */
|
||||||
/* in server.h */
|
/* in server.h */
|
||||||
/* material.c */
|
/* material.c */
|
||||||
|
@ -774,7 +774,7 @@ extern void *nxtitemp(struct nstr_item *);
|
||||||
extern void do_plague(struct sctstr *, struct natstr *, int);
|
extern void do_plague(struct sctstr *, struct natstr *, int);
|
||||||
extern int plague_people(struct natstr *, short *, int *, int *, int);
|
extern int plague_people(struct natstr *, short *, int *, int *, int);
|
||||||
/* plane.c */
|
/* plane.c */
|
||||||
extern int prod_plane(int, int, int *, int);
|
extern int prod_plane(int, int, struct bp *, int);
|
||||||
/* populace.c */
|
/* populace.c */
|
||||||
extern void populace(struct natstr *, struct sctstr *, int);
|
extern void populace(struct natstr *, struct sctstr *, int);
|
||||||
extern int total_work(int, int, int, int, int, int);
|
extern int total_work(int, int, int, int, int, int);
|
||||||
|
@ -782,7 +782,7 @@ extern int total_work(int, int, int, int, int, int);
|
||||||
extern void tax(struct sctstr *, struct natstr *, int, long *, int *,
|
extern void tax(struct sctstr *, struct natstr *, int, long *, int *,
|
||||||
int *, int *);
|
int *, int *);
|
||||||
extern int upd_slmilcosts(natid, int);
|
extern int upd_slmilcosts(natid, int);
|
||||||
extern void prepare_sects(int, int *);
|
extern void prepare_sects(int, struct bp *);
|
||||||
extern int bank_income(struct sctstr *, int);
|
extern int bank_income(struct sctstr *, int);
|
||||||
/* produce.c */
|
/* produce.c */
|
||||||
extern int produce(struct natstr *, struct sctstr *, short *, int, int,
|
extern int produce(struct natstr *, struct sctstr *, short *, int, int,
|
||||||
|
@ -799,9 +799,9 @@ extern void sail_ship(natid);
|
||||||
extern void do_fallout(struct sctstr *, int);
|
extern void do_fallout(struct sctstr *, int);
|
||||||
extern void spread_fallout(struct sctstr *, int);
|
extern void spread_fallout(struct sctstr *, int);
|
||||||
extern void decay_fallout(struct sctstr *, int);
|
extern void decay_fallout(struct sctstr *, int);
|
||||||
extern void produce_sect(int, int, int *, long [][2]);
|
extern void produce_sect(int, int, struct bp *, long [][2]);
|
||||||
/* ship.c */
|
/* ship.c */
|
||||||
extern int prod_ship(int, int, int *, int);
|
extern int prod_ship(int, int, struct bp *, int);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* src/server
|
* src/server
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
typedef unsigned char natid; /* NSC_NATID must match this */
|
typedef unsigned char natid; /* NSC_NATID must match this */
|
||||||
typedef short coord;
|
typedef short coord;
|
||||||
|
|
||||||
|
struct bp;
|
||||||
struct emp_qelem;
|
struct emp_qelem;
|
||||||
struct empobj;
|
struct empobj;
|
||||||
struct lndstr;
|
struct lndstr;
|
||||||
|
|
|
@ -184,7 +184,7 @@ calc_all(long p_sect[][2],
|
||||||
int *planes, int *pbuild, int *npbuild, int *pmaint)
|
int *planes, int *pbuild, int *npbuild, int *pmaint)
|
||||||
{
|
{
|
||||||
struct natstr *np;
|
struct natstr *np;
|
||||||
int *bp;
|
struct bp *bp;
|
||||||
long pop = 0;
|
long pop = 0;
|
||||||
int n, civ_tax, uw_tax, mil_pay;
|
int n, civ_tax, uw_tax, mil_pay;
|
||||||
struct sctstr *sp;
|
struct sctstr *sp;
|
||||||
|
@ -197,7 +197,7 @@ calc_all(long p_sect[][2],
|
||||||
*planes = *pbuild = *npbuild = *pmaint = 0;
|
*planes = *pbuild = *npbuild = *pmaint = 0;
|
||||||
|
|
||||||
np = getnatp(player->cnum);
|
np = getnatp(player->cnum);
|
||||||
bp = calloc(WORLD_X * WORLD_Y * 8, sizeof(int));
|
bp = alloc_bp();
|
||||||
for (n = 0; NULL != (sp = getsectid(n)); n++) {
|
for (n = 0; NULL != (sp = getsectid(n)); n++) {
|
||||||
fill_update_array(bp, sp);
|
fill_update_array(bp, sp);
|
||||||
if (sp->sct_own == player->cnum) {
|
if (sp->sct_own == player->cnum) {
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
*
|
*
|
||||||
* Known contributors to this file:
|
* Known contributors to this file:
|
||||||
* Ville Virrankoski, 1996
|
* Ville Virrankoski, 1996
|
||||||
|
* Markus Armbruster, 2007
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@ -36,18 +37,21 @@
|
||||||
#include "budg.h"
|
#include "budg.h"
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
|
struct bp {
|
||||||
|
int val[7];
|
||||||
|
};
|
||||||
|
|
||||||
static int bud_key[I_MAX + 2] =
|
static int bud_key[I_MAX + 2] =
|
||||||
{ 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 7 };
|
{ 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 7 };
|
||||||
|
|
||||||
static int *
|
static int *
|
||||||
get_wp(int *bp, struct sctstr *sp, int cm)
|
get_wp(struct bp *bp, struct sctstr *sp, int cm)
|
||||||
{
|
{
|
||||||
return (bp + (sp->sct_x + (sp->sct_y * WORLD_X)) +
|
return &bp[sp->sct_x + sp->sct_y * WORLD_X].val[cm - 1];
|
||||||
WORLD_X * WORLD_Y * (cm - 1));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
gt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm)
|
gt_bg_nmbr(struct bp *bp, struct sctstr *sp, i_type comm)
|
||||||
{
|
{
|
||||||
int *wp;
|
int *wp;
|
||||||
int cm;
|
int cm;
|
||||||
|
@ -61,7 +65,7 @@ gt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm, int amount)
|
pt_bg_nmbr(struct bp *bp, struct sctstr *sp, i_type comm, int amount)
|
||||||
{
|
{
|
||||||
int *wp;
|
int *wp;
|
||||||
int cm;
|
int cm;
|
||||||
|
@ -73,7 +77,7 @@ pt_bg_nmbr(int *bp, struct sctstr *sp, i_type comm, int amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fill_update_array(int *bp, struct sctstr *sp)
|
fill_update_array(struct bp *bp, struct sctstr *sp)
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
int *wp;
|
int *wp;
|
||||||
|
@ -87,3 +91,9 @@ fill_update_array(int *bp, struct sctstr *sp)
|
||||||
wp = get_wp(bp, sp, bud_key[I_MAX + 1]);
|
wp = get_wp(bp, sp, bud_key[I_MAX + 1]);
|
||||||
*wp = sp->sct_avail;
|
*wp = sp->sct_avail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct bp *
|
||||||
|
alloc_bp(void)
|
||||||
|
{
|
||||||
|
return calloc(WORLD_X * WORLD_Y, sizeof(struct bp));
|
||||||
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ static int babies(int, int, double, int, int);
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
do_feed(struct sctstr *sp, struct natstr *np, short *vec,
|
do_feed(struct sctstr *sp, struct natstr *np, short *vec,
|
||||||
int *workp, int *bp, int etu)
|
int *workp, struct bp *bp, int etu)
|
||||||
{
|
{
|
||||||
int work_avail;
|
int work_avail;
|
||||||
int starved, sctwork;
|
int starved, sctwork;
|
||||||
|
|
|
@ -46,12 +46,12 @@
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
static void landrepair(struct lndstr *, struct natstr *, int *, int);
|
static void landrepair(struct lndstr *, struct natstr *, struct bp *, int);
|
||||||
static void upd_land(struct lndstr *, int, struct natstr *, int *, int);
|
static void upd_land(struct lndstr *, int, struct natstr *, struct bp *, int);
|
||||||
static int feed_land(struct lndstr *, int);
|
static int feed_land(struct lndstr *, int);
|
||||||
|
|
||||||
int
|
int
|
||||||
prod_land(int etus, int natnum, int *bp, int build)
|
prod_land(int etus, int natnum, struct bp *bp, int build)
|
||||||
/* build = 1, maintain = 0 */
|
/* build = 1, maintain = 0 */
|
||||||
{
|
{
|
||||||
struct lndstr *lp;
|
struct lndstr *lp;
|
||||||
|
@ -104,7 +104,7 @@ prod_land(int etus, int natnum, int *bp, int build)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
upd_land(struct lndstr *lp, int etus,
|
upd_land(struct lndstr *lp, int etus,
|
||||||
struct natstr *np, int *bp, int build)
|
struct natstr *np, struct bp *bp, int build)
|
||||||
/* build = 1, maintain = 0 */
|
/* build = 1, maintain = 0 */
|
||||||
{
|
{
|
||||||
struct lchrstr *lcp;
|
struct lchrstr *lcp;
|
||||||
|
@ -214,7 +214,7 @@ upd_land(struct lndstr *lp, int etus,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
landrepair(struct lndstr *land, struct natstr *np, int *bp, int etus)
|
landrepair(struct lndstr *land, struct natstr *np, struct bp *bp, int etus)
|
||||||
{
|
{
|
||||||
int delta;
|
int delta;
|
||||||
struct sctstr *sp;
|
struct sctstr *sp;
|
||||||
|
|
|
@ -58,7 +58,7 @@ update_main(void *unused)
|
||||||
int etu = etu_per_update;
|
int etu = etu_per_update;
|
||||||
int n;
|
int n;
|
||||||
int x;
|
int x;
|
||||||
int *bp;
|
struct bp *bp;
|
||||||
int cn, cn2, rel;
|
int cn, cn2, rel;
|
||||||
struct natstr *cnp;
|
struct natstr *cnp;
|
||||||
struct natstr *np;
|
struct natstr *np;
|
||||||
|
@ -92,7 +92,7 @@ update_main(void *unused)
|
||||||
memset(air_money, 0, sizeof(air_money));
|
memset(air_money, 0, sizeof(air_money));
|
||||||
memset(sea_money, 0, sizeof(sea_money));
|
memset(sea_money, 0, sizeof(sea_money));
|
||||||
memset(lnd_money, 0, sizeof(lnd_money));
|
memset(lnd_money, 0, sizeof(lnd_money));
|
||||||
bp = calloc(WORLD_X * WORLD_Y * 7, sizeof(int));
|
bp = alloc_bp();
|
||||||
for (n = 0; n < MAXNOC; n++) {
|
for (n = 0; n < MAXNOC; n++) {
|
||||||
money[n] = 0;
|
money[n] = 0;
|
||||||
if (!(np = getnatp(n)))
|
if (!(np = getnatp(n)))
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
* Return adjusted build percentage.
|
* Return adjusted build percentage.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
get_materials(struct sctstr *sp, int *bp, int *mvec, int pct)
|
get_materials(struct sctstr *sp, struct bp *bp, int *mvec, int pct)
|
||||||
{
|
{
|
||||||
int i, amt;
|
int i, amt;
|
||||||
|
|
||||||
|
|
|
@ -42,11 +42,11 @@
|
||||||
#include "ship.h"
|
#include "ship.h"
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
static void planerepair(struct plnstr *, struct natstr *, int *, int);
|
static void planerepair(struct plnstr *, struct natstr *, struct bp *, int);
|
||||||
static void upd_plane(struct plnstr *, int, struct natstr *, int *, int);
|
static void upd_plane(struct plnstr *, int, struct natstr *, struct bp *, int);
|
||||||
|
|
||||||
int
|
int
|
||||||
prod_plane(int etus, int natnum, int *bp, int buildem)
|
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;
|
||||||
|
@ -88,7 +88,7 @@ prod_plane(int etus, int natnum, int *bp, int buildem)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
upd_plane(struct plnstr *pp, int etus,
|
upd_plane(struct plnstr *pp, int etus,
|
||||||
struct natstr *np, int *bp, int build)
|
struct natstr *np, struct bp *bp, int build)
|
||||||
{
|
{
|
||||||
struct plchrstr *pcp = &plchr[(int)pp->pln_type];
|
struct plchrstr *pcp = &plchr[(int)pp->pln_type];
|
||||||
int mult, cost, eff;
|
int mult, cost, eff;
|
||||||
|
@ -125,7 +125,7 @@ upd_plane(struct plnstr *pp, int etus,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
planerepair(struct plnstr *pp, struct natstr *np, int *bp, int etus)
|
planerepair(struct plnstr *pp, struct natstr *np, struct bp *bp, int etus)
|
||||||
{
|
{
|
||||||
int build;
|
int build;
|
||||||
int mvec[I_MAX + 1];
|
int mvec[I_MAX + 1];
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
prepare_sects(int etu, int *bp)
|
prepare_sects(int etu, struct bp *bp)
|
||||||
{
|
{
|
||||||
struct sctstr *sp;
|
struct sctstr *sp;
|
||||||
struct natstr *np;
|
struct natstr *np;
|
||||||
|
|
|
@ -257,7 +257,7 @@ decay_fallout(struct sctstr *sp, int etus)
|
||||||
* Produce for a specific nation
|
* Produce for a specific nation
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
produce_sect(int natnum, int etu, int *bp, long p_sect[][2])
|
produce_sect(int natnum, int etu, struct bp *bp, long p_sect[][2])
|
||||||
{
|
{
|
||||||
struct sctstr *sp;
|
struct sctstr *sp;
|
||||||
struct natstr *np;
|
struct natstr *np;
|
||||||
|
|
|
@ -47,12 +47,12 @@
|
||||||
#include "ship.h"
|
#include "ship.h"
|
||||||
#include "update.h"
|
#include "update.h"
|
||||||
|
|
||||||
static void shiprepair(struct shpstr *, struct natstr *, int *, int);
|
static void shiprepair(struct shpstr *, struct natstr *, struct bp *, int);
|
||||||
static void upd_ship(struct shpstr *, int, struct natstr *, int *, int);
|
static void upd_ship(struct shpstr *, int, struct natstr *, struct bp *, int);
|
||||||
static int feed_ship(struct shpstr *, int);
|
static int feed_ship(struct shpstr *, int);
|
||||||
|
|
||||||
int
|
int
|
||||||
prod_ship(int etus, int natnum, int *bp, int build)
|
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;
|
||||||
|
@ -107,7 +107,7 @@ prod_ship(int etus, int natnum, int *bp, int build)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
upd_ship(struct shpstr *sp, int etus,
|
upd_ship(struct shpstr *sp, int etus,
|
||||||
struct natstr *np, int *bp, int build)
|
struct natstr *np, struct bp *bp, int build)
|
||||||
/* build = 1, maintain = 0 */
|
/* build = 1, maintain = 0 */
|
||||||
{
|
{
|
||||||
struct sctstr *sectp;
|
struct sctstr *sectp;
|
||||||
|
@ -266,7 +266,7 @@ upd_ship(struct shpstr *sp, int etus,
|
||||||
* 8 * 8 * $40 = $2560!
|
* 8 * 8 * $40 = $2560!
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
shiprepair(struct shpstr *ship, struct natstr *np, int *bp, int etus)
|
shiprepair(struct shpstr *ship, struct natstr *np, struct bp *bp, int etus)
|
||||||
{
|
{
|
||||||
int delta;
|
int delta;
|
||||||
struct sctstr *sp;
|
struct sctstr *sp;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue