X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.h;h=e5849937a5b0a1f6822bbb22b150963fae6efd6f;hp=2af0f192703c146121ff4f136b385f11ae53d79b;hb=459d6afcbe13be588b29c8bd1fbffb39b13fdee1;hpb=8700dc6a521fe201815aad02cf05f7f4c297c305 diff --git a/src/sst.h b/src/sst.h index 2af0f19..e584993 100644 --- a/src/sst.h +++ b/src/sst.h @@ -7,6 +7,7 @@ #include #include #include +#include #ifdef DATA_DIR #define SSTDOC DATA_DIR"/"DOC_NAME @@ -19,8 +20,6 @@ #define min(x, y) ((x)<(y)?(x):(y)) #define max(x, y) ((x)>(y)?(x):(y)) -// #define DEBUG - #define PHASEFAC (2.0) #define GALSIZE (8) #define NINHAB (GALSIZE * GALSIZE / 2) @@ -41,9 +40,12 @@ #define for_local_enemies(i) for (i = 1; i <= game.nenhere; i++) #define for_starbases(i) for (i = 1; i <= game.state.rembase; i++) +typedef struct {int x; int y;} coord; + +#define same(c1, c2) (c1.x == c2.x && c1.y == c2.y) + typedef struct { - int x; /* Quadrant location of planet */ - int y; + coord w; enum {M=0, N=1, O=2} pclass; int inhabited; /* if NZ, an index into a name array */ #define UNINHABITED -1 @@ -62,26 +64,28 @@ typedef struct { rembase, // remaining bases starkl, // destroyed stars basekl, // destroyed bases - cx[QUADSIZE+1],cy[QUADSIZE+1], // Commander quadrant coordinates - baseqx[BASEMAX+1], // Base quadrant X - baseqy[BASEMAX+1], // Base quadrant Y - isx, isy, // Coordinate of Super Commander nromrem, // Romulans remaining nplankl; // destroyed planets planet plnets[PLNETMAX]; // Planet information double date, // stardate remres, // remaining resources remtime; // remaining time - struct { + coord baseq[BASEMAX+1]; // Base quadrant coordinates + coord kcmdr[QUADSIZE+1]; // Commander quadrant coordinates + coord kscmdr; // Supercommander quadrant coordinates + struct quadrant { int stars; planet *planet; - int starbase; + bool starbase; int klingons; int romulans; - int supernova; - int charted; + bool supernova; + bool charted; +#ifdef EXPERIMENTAL + enum {secure, distressed, enslaved} status; +#endif /* EXPERIMENTAL */ } galaxy[GALSIZE+1][GALSIZE+1]; // The Galaxy (subscript 0 not used) - struct { + struct page { int stars; int starbase; int klingons; @@ -152,7 +156,28 @@ typedef struct { #define FSCMOVE 6 // Supercommander moves (might attack base) #define FSCDBAS 7 // Supercommander destroys base #define FDSPROB 8 // Move deep space probe +#ifndef EXPERIMENTAL #define NEVENTS (9) +#else /* EXPERIMENTAL */ +#define FDISTR 9 // Emit distress call from an inhabited world +#define FENSLV 10 // Inhabited word is enslaved */ +#define FREPRO 11 // Klingons build a ship in an enslaved system +#define NEVENTS (12) +#endif /* EXPERIMENTAL */ + +/* + * abstract out the event handling -- underlying data structures will change + * when we implement stateful events + */ +extern void unschedule(int); +extern int is_scheduled(int); +extern void schedule(int, double); +extern void postpone(int, double); +extern double scheduled(int); + +#ifdef EXPERIMENTAL +#define MAXDISTR 5 /* maximum concurrent distress calls */ +#endif /* EXPERIMENTAL */ #define SSTMAGIC "SST2.0\n" @@ -168,8 +193,21 @@ struct game { double damage[NDEVICES]; // damage encountered double future[NEVENTS]; // future events char passwd[10]; // Self Destruct password - int kx[(QUADSIZE+1)*(QUADSIZE+1)]; // enemy sector locations - int ky[(QUADSIZE+1)*(QUADSIZE+1)]; + coord ks[(QUADSIZE+1)*(QUADSIZE+1)]; // enemy sector locations + coord quadrant, sector; // where we are + coord tholian; // coordinates of Tholian + coord base; // position of base in current quadrant + coord battle; // base coordinates being attacked + coord plnet; // location of planet in quadrant + coord probec; // current probe quadrant + bool gamewon, // Finished! + ididit, // Action taken -- allows enemy to attack + alive, // We are alive (not killed) + justin, // just entered quadrant + alldone, // game is now finished + neutz, // Romulan Neutral Zone + isarmed, // probe is armed + thawed; // thawed game int inkling, // Initial number of klingons inbase, // Initial number of bases incom, // Initial number of commanders @@ -180,27 +218,14 @@ struct game { condit, // Condition (red/yellow/green/docked) torps, // number of torpedoes ship, // Ship type -- 'E' is Enterprise - quadx, // where we are - quady, // - sectx, // where we are - secty, // length, // length of game skill, // skill level - basex, // position of base in current quadrant - basey, // klhere, // klingons here comhere, // commanders here casual, // causalties nhelp, // calls for help nkinks, // count of energy-barrier crossings - ididit, // Action taken -- allows enemy to attack - gamewon, // Finished! - alive, // We are alive (not killed) - justin, // just entered quadrant - alldone, // game is now finished shldchg, // shield is changing (affects efficiency) - plnetx, // location of planet in quadrant - plnety, // inorbit, // orbiting landed, // party on planet (1), on ship (-1) iplnet, // planet # in quadrant @@ -208,30 +233,21 @@ struct game { inplan, // initial planets nenhere, // number of enemies in quadrant ishere, // super-commander in quandrant - neutz, // Romulan Neutral Zone irhere, // Romulans in quadrant icraft, // Kirk in Galileo ientesc, // attempted escape from supercommander iscraft, // =1 if craft on ship, -1 if removed from game isatb, // =1 if super commander is attacking base iscate, // super commander is here -#ifdef DEBUG - idebug, // debug mode -#endif iattak, // attack recursion elimination (was cracks[4]) icrystl, // dilithium crystals aboard tourn, // tournament number - thawed, // thawed game - batx, // base coordinates being attacked - baty, // ithere, // Tholian is here - ithx, // coordinates of Tholian - ithy, // iseenit, // seen base attack report - probecx, // current probe quadrant - probecy, // +#ifdef EXPERIMENTAL + ndistr, //* count of distress calls */ +#endif /* EXPERIMENTAL */ proben, // number of moves for probe - isarmed, // probe is armed nprobes; // number of probes available double inresor, // initial resources intime, // initial time @@ -267,9 +283,14 @@ extern int iscore, iskill; // Common PLAQ extern double perdate; extern double aaitem; extern char citem[10]; +extern int seed; +extern bool randready; +extern bool idebug; +extern FILE *logfp; /* the Space Thingy's global state should *not* be saved! */ -extern int thingx, thingy, iqhere, iqengry; +extern coord thing; +extern int iqhere, iqengry; typedef enum {FWON, FDEPLETE, FLIFESUP, FNRG, FBATTLE, FNEG3, FNOVA, FSNOVAED, FABANDN, FDILITHIUM, @@ -278,11 +299,6 @@ typedef enum {FWON, FDEPLETE, FLIFESUP, FNRG, FBATTLE, FHOLE} FINTYPE ; enum loctype {neither, quadrant, sector}; -#ifndef TRUE -#define TRUE (1) -#define FALSE (0) -#endif - #define IHR 'R' #define IHK 'K' #define IHC 'C' @@ -311,7 +327,7 @@ enum loctype {neither, quadrant, sector}; /* Function prototypes */ void prelim(void); void attack(int); -int choose(int); +bool choose(bool); void setup(int); void score(void); void atover(int); @@ -336,7 +352,7 @@ void abandn(void); void finish(FINTYPE); void dstrct(void); void kaboom(void); -void freeze(int); +void freeze(bool); int thaw(void); void plaque(void); int scan(void); @@ -350,21 +366,21 @@ void prout(char *, ...); void proutn(char *, ...); void stars(void); void newqad(int); -int ja(void); +bool ja(void); void cramen(int); void crmshp(void); -char *cramlc(enum loctype, int, int); +char *cramlc(enum loctype, coord w); double expran(double); double Rand(void); void iran(int, int *, int *); #define square(i) ((i)*(i)) -void dropin(int, int*, int*); +void dropin(int, coord*); void newcnd(void); void sortkl(void); void imove(void); -void ram(int, int, int, int); -void crmena(int, int, int, int, int); -void deadkl(int, int, int, int, int); +void ram(int, int, coord); +void crmena(int, int, int, coord w); +void deadkl(coord, int, int, int); void timwrp(void); void movcom(void); void torpedo(double, double, int, int, double *, int, int); @@ -397,10 +413,11 @@ void tracktorpedo(int ix, int iy, int l, int i, int n, int iquad); void cgetline(char *, int); void waitfor(void); void setpassword(void); -void commandhook(char *, int); +void commandhook(char *, bool); void makechart(void); void enqueue(char *); char *systemname(planet *); +void newkling(int, coord *); /* mode arguments for srscan() */ #define SCAN_FULL 1