ref: 24e3f38bb4e102aebca99a107ccbe99dbf4a107f
dir: /sim.c/
#include <u.h> #include <libc.h> #include "dat.h" #include "fns.h" static Tile **objs, **objhead; static int maxobj; enum{ UpkeepΔt = 150, }; static int stock[Gtot], rstock[Rtot]; static void spawn(Tile *m, int n) { Tile **o; if(objhead - objs >= maxobj) sysfatal("spawn: out of bounds"); m->t = terrains + Tplain; m->b = buildings + n; for(o=objhead-1; o>=objs; o--) if((*o)->b - buildings <= n) break; /* push in front of lower priority object */ if(++o < objhead) memmove(o+1, o, (objhead - o) * sizeof *o); *o = m; objhead++; } static void upkeep(void) { Tile **o; if(clock % UpkeepΔt != 0 || clock == 0) return; for(o=objhead-1; o>=objs; o--){ /* if upkeep can't be kept, stop production immediately * else decrease stock */ } } static void updateobj(void) { /* iterate through obj stack build call for supplies, start travel towards building site done? start production upgrade finished? start production destroy finished? despawn produce call for supplies enough supplies? else wait until next tick (loop) decrement stocks, start traveling from townhall reached building? increment supplies begin production while producing, if we can call for supplies earlier to restart immediately, do it finished producing? start travel towards building reached building? call for pickup loop */ } void step(void) { upkeep(); updateobj(); } void init(void) { int i; initmap(); maxobj = mapwidth * mapheight; objs = emalloc(maxobj * sizeof *objs); objhead = objs; spawn(map + nrand(maxobj), Btownhall); for(i=0; i<nelem(initialstock); i++){ stock[i] = initialstock[i]; rstock[goods[i].resource] += stock[i]; } }