X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fsst.h;h=c4a7a99e32b8eef6de34bd8538fc3e464628fc28;hb=c8f91a7e3437017d237a3bad0166054b97206d8d;hp=0c0e49274f80cd7715e736b5a23ba63cccb4843f;hpb=e535e2ef833a03ec84d0f002d684c07ddde893f1;p=super-star-trek.git diff --git a/src/sst.h b/src/sst.h index 0c0e492..c4a7a99 100644 --- a/src/sst.h +++ b/src/sst.h @@ -4,7 +4,10 @@ #include #include #include +#include +#include #include +#include #ifdef DATA_DIR #define SSTDOC DATA_DIR"/"DOC_NAME @@ -12,14 +15,18 @@ #define SSTDOC DOC_NAME #endif +#define _(str) gettext(str) + #define min(x, y) ((x)<(y)?(x):(y)) #define max(x, y) ((x)>(y)?(x):(y)) // #define DEBUG #define PHASEFAC (2.0) -#define PLNETMAX (10) #define GALSIZE (8) +#define NINHAB (GALSIZE * GALSIZE / 2) +#define MAXUNINHAB (10) +#define PLNETMAX (NINHAB + MAXUNINHAB) #define QUADSIZE (10) #define BASEMAX (5) @@ -32,14 +39,20 @@ #define for_quadrants(i) for (i = 1; i <= GALSIZE; i++) #define for_sectors(i) for (i = 1; i <= QUADSIZE; i++) #define for_commanders(i) for (i = 1; i <= game.state.remcom; i++) -#define for_local_enemies(i) for (i = 1; i <= nenhere; i++) +#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 int crystals; /* has crystals */ +#define MINED -1 /* used to have crystals, but they were mined out */ enum {unknown, known, shuttle_down} known; } planet; @@ -53,38 +66,40 @@ 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; - int planets; - int starbase; + planet *planet; + 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; } chart[GALSIZE+1][GALSIZE+1]; // the starchart (subscript 0 not used) } snapshot; // Data that is snapshot -#define NKILLK (inkling - game.state.remkl) -#define NKILLC (incom - game.state.remcom) -#define NKILLSC (inscom - game.state.nscrem) -#define NKILLROM (inrom - game.state.nromrem) +#define NKILLK (game.inkling - game.state.remkl) +#define NKILLC (game.incom - game.state.remcom) +#define NKILLSC (game.inscom - game.state.nscrem) +#define NKILLROM (game.inrom - game.state.nromrem) #define KLINGREM (game.state.remkl + game.state.remcom + game.state.nscrem) -#define INKLINGTOT (inkling + incom + inscom) +#define INKLINGTOT (game.inkling + game.incom + game.inscom) #define KLINGKILLED (INKLINGTOT - KLINGREM) #define SKILL_NONE 0 @@ -108,6 +123,7 @@ typedef struct { #define OPTION_MVBADDY 0x00000100 /* more enemies can move */ #define OPTION_BLKHOLE 0x00000200 /* black hole may timewarp you */ #define OPTION_BASE 0x00000400 /* bases have good shields */ +#define OPTION_WORLDS 0x00000800 /* logic for inhabited worlds */ #define OPTION_PLAIN 0x01000000 /* user chose plain game */ #define OPTION_ALMY 0x02000000 /* user chose Almy variant */ @@ -142,16 +158,30 @@ 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 */ -// Scalar variables that are needed for freezing the game -// are placed in a structure. #defines are used to access by their -// original names. Gee, I could have done this with the d structure, -// but I just didn't think of it back when I started. +/* + * 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); -#define SSTMAGIC "SST2.0\n" +#ifdef EXPERIMENTAL +#define MAXDISTR 5 /* maximum concurrent distress calls */ +#endif /* EXPERIMENTAL */ -extern WINDOW *curwnd; +#define SSTMAGIC "SST2.0\n" struct game { char magic[sizeof(SSTMAGIC)]; @@ -165,188 +195,93 @@ 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)]; - /* members with macro definitions start here */ - int inkling, - inbase, - incom, - inscom, - inrom, - instar, - intorps, - condit, - torps, - ship, - quadx, - quady, - sectx, - secty, - length, - skill, - basex, - basey, - klhere, - comhere, - casual, - nhelp, - nkinks, - ididit, - gamewon, - alive, - justin, - alldone, - shldchg, - plnetx, - plnety, - inorbit, - landed, - iplnet, - imine, - inplan, - nenhere, - ishere, - neutz, - irhere, - icraft, - ientesc, - iscraft, - isatb, - iscate, + 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 + isatb, // =1 if super commander is attacking base + isarmed, // probe is armed + thawed, // thawed game + iscate; // super commander is here + int inkling, // Initial number of klingons + inbase, // Initial number of bases + incom, // Initial number of commanders + inscom, // Initial number of commanders + inrom, // Initial number of commanders + instar, // Initial stars + intorps, // Initial/Max torpedoes + condit, // Condition (red/yellow/green/docked) + torps, // number of torpedoes + ship, // Ship type -- 'E' is Enterprise + length, // length of game + skill, // skill level + klhere, // klingons here + comhere, // commanders here + casual, // causalties + nhelp, // calls for help + nkinks, // count of energy-barrier crossings + shldchg, // shield is changing (affects efficiency) + inorbit, // orbiting + landed, // party on planet (1), on ship (-1) + iplnet, // planet # in quadrant + imine, // mining + inplan, // initial planets + nenhere, // number of enemies in quadrant + ishere, // super-commander in quandrant + irhere, // Romulans in quadrant + icraft, // Kirk in Galileo + ientesc, // attempted escape from supercommander + iscraft, // =1 if craft on ship, -1 if removed from game #ifdef DEBUG - idebug, + idebug, // debug mode #endif - iattak, - icrystl, - tourn, - thawed, - batx, - baty, - ithere, - ithx, - ithy, - iseenit, - probecx, - probecy, - proben, - isarmed, - nprobes; - double inresor, - intime, - inenrg, - inshld, - inlsr, - indate, - energy, - shield, - shldup, - warpfac, - wfacsq, - lsupres, - dist, - direc, - Time, - docfac, - resting, - damfac, - lastchart, - cryprob, - probex, - probey, - probeinx, - probeiny, - height; + iattak, // attack recursion elimination (was cracks[4]) + icrystl, // dilithium crystals aboard + tourn, // tournament number + ithere, // Tholian is here + iseenit, // seen base attack report +#ifdef EXPERIMENTAL + ndistr, //* count of distress calls */ +#endif /* EXPERIMENTAL */ + proben, // number of moves for probe + nprobes; // number of probes available + double inresor, // initial resources + intime, // initial time + inenrg, // initial/max energy + inshld, // initial/max shield + inlsr, // initial life support resources + indate, // initial date + energy, // energy level + shield, // shield level + shldup, // shields are up + warpfac, // warp speed + wfacsq, // squared warp factor + lsupres, // life support reserves + dist, // movement distance + direc, // movement direction + optime, // time taken by current operation + docfac, // repair factor when docking (constant?) + resting, // rest time + damfac, // damage factor + lastchart, // time star chart was last updated + cryprob, // probability that crystal will work + probex, // location of probe + probey, // + probeinx, // probe x,y increment + probeiny, // + height; // height of orbit around planet }; extern struct game game; -#define inkling game.inkling // Initial number of klingons -#define inbase game.inbase // Initial number of bases -#define incom game.incom // Initian number of commanders -#define inscom game.inscom // Initian number of commanders -#define inrom game.inrom // Initian number of commanders -#define instar game.instar // Initial stars -#define intorps game.intorps // Initial/Max torpedoes -#define condit game.condit // Condition (red/yellow/green/docked) -#define torps game.torps // number of torpedoes -#define ship game.ship // Ship type -- 'E' is Enterprise -#define quadx game.quadx // where we are -#define quady game.quady // -#define sectx game.sectx // where we are -#define secty game.secty // -#define length game.length // length of game -#define skill game.skill // skill level -#define basex game.basex // position of base in current quad -#define basey game.basey // -#define klhere game.klhere // klingons here -#define comhere game.comhere // commanders here -#define casual game.casual // causalties -#define nhelp game.nhelp // calls for help -#define nkinks game.nkinks // -#define ididit game.ididit // Action taken -- allows enemy to attack -#define gamewon game.gamewon // Finished! -#define alive game.alive // We are alive (not killed) -#define justin game.justin // just entered quadrant -#define alldone game.alldone // game is now finished -#define shldchg game.shldchg // shield is changing (affects efficiency) -#define plnetx game.plnetx // location of planet in quadrant -#define plnety game.plnety // -#define inorbit game.inorbit // orbiting -#define landed game.landed // party on planet (1), on ship (-1) -#define iplnet game.iplnet // planet # in quadrant -#define imine game.imine // mining -#define inplan game.inplan // initial planets -#define nenhere game.nenhere // Number of enemies in quadrant -#define ishere game.ishere // Super-commander in quandrant -#define neutz game.neutz // Romulan Neutral Zone -#define irhere game.irhere // Romulans in quadrant -#define icraft game.icraft // Kirk in Galileo -#define ientesc game.ientesc // Attempted escape from supercommander -#define iscraft game.iscraft // =1 if craft on ship, -1 if removed from game -#define isatb game.isatb // =1 if SuperCommander is attacking base -#define iscate game.iscate // Super Commander is here -#ifdef DEBUG -#define idebug game.idebug // Debug mode -#endif -#define iattak game.iattak // attack recursion elimination (was cracks[4]) -#define icrystl game.icrystl // dilithium crystals aboard -#define tourn game.tourn // Tournament number -#define thawed game.thawed // Thawed game -#define batx game.batx // Base coordinates being attacked -#define baty game.baty // -#define ithere game.ithere // Tholean is here -#define ithx game.ithx // coordinates of tholean -#define ithy game.ithy -#define iseenit game.iseenit // Seen base attack report -#define inresor game.inresor // initial resources -#define intime game.intime // initial time -#define inenrg game.inenrg // Initial/Max Energy -#define inshld game.inshld // Initial/Max Shield -#define inlsr game.inlsr // initial life support resources -#define indate game.indate // Initial date -#define energy game.energy // Energy level -#define shield game.shield // Shield level -#define shldup game.shldup // Shields are up -#define warpfac game.warpfac // Warp speed -#define wfacsq game.wfacsq // squared warp factor -#define lsupres game.lsupres // life support reserves -#define dist game.dist // movement distance -#define direc game.direc // movement direction -#define Time game.Time // time taken by current operation -#define docfac game.docfac // repair factor when docking (constant?) -#define resting game.resting // rest time -#define damfac game.damfac // damage factor -#define lastchart game.lastchart // time star chart was last updated -#define cryprob game.cryprob // probability that crystal will work -#define probex game.probex // location of probe -#define probey game.probey -#define probecx game.probecx // current probe quadrant -#define probecy game.probecy -#define probeinx game.probeinx // Probe x,y increment -#define probeiny game.probeiny -#define proben game.proben // number of moves for probe -#define isarmed game.isarmed // Probe is armed -#define nprobes game.nprobes // number of probes available - /* the following global state doesn't need to be saved */ extern char *device[NDEVICES]; extern int iscore, iskill; // Common PLAQ @@ -355,7 +290,8 @@ extern double aaitem; extern char citem[10]; /* 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, @@ -364,17 +300,13 @@ 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' #define IHS 'S' #define IHSTAR '*' #define IHP 'P' +#define IHW '@' #define IHB 'B' #define IHBLANK ' ' #define IHDOT '.' @@ -396,7 +328,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); @@ -416,12 +348,12 @@ void setwrp(void); void events(void); void report(void); void eta(void); -void help(void); +void mayday(void); 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); @@ -435,21 +367,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); @@ -482,9 +414,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 @@ -492,12 +426,13 @@ void enqueue(char *); #define SCAN_STATUS 3 #define SCAN_NO_LEFTSIDE 4 -WINDOW *fullscreen_window; -WINDOW *srscan_window; -WINDOW *report_window; -WINDOW *lrscan_window; -WINDOW *message_window; -WINDOW *prompt_window; +extern WINDOW *curwnd; +extern WINDOW *fullscreen_window; +extern WINDOW *srscan_window; +extern WINDOW *report_window; +extern WINDOW *lrscan_window; +extern WINDOW *message_window; +extern WINDOW *prompt_window; extern void clreol(void); extern void clrscr(void); @@ -510,6 +445,4 @@ enum COLORS { DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE }; -#define DAMAGED 128 /* marker for damaged ship in starmap */ - #endif