X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=sst.h;h=f8d65fffed828e21de8c2386b07c04e24f283375;hp=cf44c7374f8b11a662be414528cb2ec60c0e1cde;hb=33260392e158234e108910e2cc2ab18cd7416c31;hpb=89e52d61fcf689e15a8f831dea084a33ceaa8217 diff --git a/sst.h b/sst.h index cf44c73..f8d65ff 100644 --- a/sst.h +++ b/sst.h @@ -14,10 +14,23 @@ // #define DEBUG -#define NDEVICES (15) // Number of devices #define PHASEFAC (2.0) #define PLNETMAX (10) -#define NEVENTS (8) +#define GALSIZE (8) +#define QUADSIZE (10) +#define BASEMAX (5) + +/* + * These macros hide the difference between 0-origin and 1-origin addressing. + * They're a step towards de-FORTRANizing the code. + */ +#define VALID_QUADRANT(x, y) ((x)>=1 && (x)<=GALSIZE && (y)>=1 && (y)<=GALSIZE) +#define VALID_SECTOR(x, y) ((x)>=1 && (x)<=QUADSIZE && (y)>=1 && (y)<=QUADSIZE) +#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_starbases(i) for (i = 1; i <= game.state.rembase; i++) typedef struct { int x; /* Quadrant location of planet */ @@ -33,28 +46,101 @@ typedef struct { int snap, // snapshot taken remkl, // remaining klingons remcom, // remaining commanders + nscrem, // remaining super commanders rembase, // remaining bases starkl, // destroyed stars basekl, // destroyed bases - killk, // Klingons killed - killc, // commanders killed - galaxy[9][9], // The Galaxy (subscript 0 not used) - cx[11],cy[11], // Commander quadrant coordinates - baseqx[6], // Base quadrant X - baseqy[6], // Base quadrant Y - newstuf[9][9], // Extended galaxy goodies + 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 - nscrem, // remaining super commanders - nromkl, // Romulans killed nromrem, // Romulans remaining - nsckill, // super commanders killed nplankl; // destroyed planets planet plnets[PLNETMAX]; // Planet information double date, // stardate remres, // remaining resources remtime; // remaining time + struct { + int stars; + int planets; + int starbase; + int klingons; + int romulans; + int supernova; + int charted; + } galaxy[GALSIZE+1][GALSIZE+1]; // The Galaxy (subscript 0 not used) + struct { + 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 KLINGREM (game.state.remkl + game.state.remcom + game.state.nscrem) +#define INKLINGTOT (inkling + incom + inscom) +#define KLINGKILLED (INKLINGTOT - KLINGREM) + +#define SKILL_NONE 0 +#define SKILL_NOVICE 1 +#define SKILL_FAIR 2 +#define SKILL_GOOD 3 +#define SKILL_EXPERT 4 +#define SKILL_EMERITUS 5 + +/* game options */ +#define OPTION_ALL 0xffffffff +#define OPTION_TTY 0x00000001 /* old interface */ +#define OPTION_CURSES 0x00000002 /* new interface */ +#define OPTION_IOMODES 0x00000003 /* cover both interfaces */ +#define OPTION_PLANETS 0x00000004 /* planets and mining */ +#define OPTION_THOLIAN 0x00000008 /* Tholians and their webs */ +#define OPTION_THINGY 0x00000010 /* Space Thingy can shoot back */ +#define OPTION_PROBE 0x00000020 /* deep-space probes */ +#define OPTION_SHOWME 0x00000040 /* bracket Enterprise in chart */ +#define OPTION_RAMMING 0x00000080 /* enemies may ram Enterprise */ +#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_PLAIN 0x01000000 /* user chose plain game */ +#define OPTION_ALMY 0x02000000 /* user chose Almy variant */ + +/* Define devices */ +#define DSRSENS 0 +#define DLRSENS 1 +#define DPHASER 2 +#define DPHOTON 3 +#define DLIFSUP 4 +#define DWARPEN 5 +#define DIMPULS 6 +#define DSHIELD 7 +#define DRADIO 8 +#define DSHUTTL 9 +#define DCOMPTR 10 +#define DTRANSP 11 +#define DSHCTRL 12 +#define DDRAY 13 // Added deathray +#define DDSP 14 // Added deep space probe +#define NDEVICES (15) // Number of devices + +#define FOREVER 1e30 + +/* Define future events */ +#define FSPY 0 // Spy event happens always (no future[] entry) + // can cause SC to tractor beam Enterprise +#define FSNOVA 1 // Supernova +#define FTBEAM 2 // Commander tractor beams Enterprise +#define FSNAP 3 // Snapshot for time warp +#define FBATTAK 4 // Commander attacks base +#define FCDBAS 5 // Commander destroys base +#define FSCMOVE 6 // Supercommander moves (might attack base) +#define FSCDBAS 7 // Supercommander destroys base +#define FDSPROB 8 // Move deep space probe +#define NEVENTS (9) + // 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, @@ -66,22 +152,24 @@ EXTERN WINDOW *curwnd; EXTERN struct { char magic[sizeof(SSTMAGIC)]; + unsigned long options; snapshot state; snapshot snapsht; - char quad[11][11]; // contents of our quadrant - double kpower[21]; // enemy energy levels - double kdist[21]; // enemy distances - double kavgd[21]; // average distances - double damage[NDEVICES+1]; // damage encountered - double future[NEVENTS+1]; // future events + char quad[QUADSIZE+1][QUADSIZE+1]; // contents of our quadrant + double kpower[(QUADSIZE+1)*(QUADSIZE+1)]; // enemy energy levels + double kdist[(QUADSIZE+1)*(QUADSIZE+1)]; // enemy distances + double kavgd[(QUADSIZE+1)*(QUADSIZE+1)]; // average distances + double damage[NDEVICES]; // damage encountered + double future[NEVENTS]; // future events char passwd[10]; // Self Destruct password - int kx[21]; // enemy sector locations - int ky[21]; - int starch[9][9]; // star chart + 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, @@ -106,8 +194,6 @@ EXTERN struct { justin, alldone, shldchg, - thingx, - thingy, plnetx, plnety, inorbit, @@ -134,8 +220,6 @@ EXTERN struct { batx, baty, ithere, - iqhere, - iqengry, ithx, ithy, iseenit, @@ -162,111 +246,113 @@ EXTERN struct { docfac, resting, damfac, - stdamtim, + lastchart, cryprob, probex, probey, probeinx, - probeiny; + probeiny, + height; } 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 instar game.instar // Initial stars +#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 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 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 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 thingx game.thingx // location of strange object in galaxy -#define thingy game.thingy // -#define plnetx game.plnetx // location of planet in quadrant -#define plnety game.plnety // +#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 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 iqhere game.iqhere // Thing in quadrant -#define iqengry game.iqengry // Thing attacking -#define icraft game.icraft // Kirk in Galileo +#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 +#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 +#define idebug game.idebug // Debug mode #endif -#define iattak game.iattak // attack recursion elimination (was cracks[4]) +#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 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 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 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 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 stdamtim game.stdamtim // time that star chart was damaged +#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 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 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+1]; +EXTERN char *device[NDEVICES]; EXTERN int iscore, iskill; // Common PLAQ EXTERN double perdate; EXTERN double aaitem; EXTERN char citem[10]; +/* the Space Thingy's global state should *not* be saved! */ +EXTERN int thingx, thingy, iqhere, iqengry; + typedef enum {FWON, FDEPLETE, FLIFESUP, FNRG, FBATTLE, FNEG3, FNOVA, FSNOVAED, FABANDN, FDILITHIUM, FMATERIALIZE, FPHASER, FLOST, FMINING, FDPLANET, @@ -274,38 +360,8 @@ typedef enum {FWON, FDEPLETE, FLIFESUP, FNRG, FBATTLE, FHOLE} FINTYPE ; enum loctype {neither, quadrant, sector}; -/* Define devices */ -#define DSRSENS 1 -#define DLRSENS 2 -#define DPHASER 3 -#define DPHOTON 4 -#define DLIFSUP 5 -#define DWARPEN 6 -#define DIMPULS 7 -#define DSHIELD 8 -#define DRADIO 9 -#define DSHUTTL 10 -#define DCOMPTR 11 -#define DTRANSP 12 -#define DSHCTRL 13 -#define DDRAY 14 // Added deathray -#define DDSP 15 // Added deep space probe - -/* Define future events */ -#define FSPY 0 // Spy event happens always (no future[] entry) - // can cause SC to tractor beam Enterprise -#define FSNOVA 1 // Supernova -#define FTBEAM 2 // Commander tractor beams Enterprise -#define FSNAP 3 // Snapshot for time warp -#define FBATTAK 4 // Commander attacks base -#define FCDBAS 5 // Commander destroys base -#define FSCMOVE 6 // Supercommander moves (might attack base) -#define FSCDBAS 7 // Supercommander destroys base -#define FDSPROB 8 // Move deep space probe - #ifdef INCLUDED -char *device[NDEVICES+1] = { - "", +char *device[NDEVICES] = { "S. R. Sensors", "L. R. Sensors", "Phasers", @@ -319,8 +375,8 @@ char *device[NDEVICES+1] = { "Computer", "Transporter", "Shield Control", - "Death Ray", - "D. S. Probe"}; + "Death Ray", + "D. S. Probe"}; #endif #ifndef TRUE @@ -368,6 +424,7 @@ void doshield(int); void dock(int); void dreprt(void); void chart(int); +void rechart(void); void impuls(void); void wait(void); void setwrp(void); @@ -399,8 +456,7 @@ void crmshp(void); char *cramlc(enum loctype, int, int); double expran(double); double Rand(void); -void iran8(int *, int *); -void iran10(int *, int *); +void iran(int, int *, int *); #define square(i) ((i)*(i)) void dropin(int, int*, int*); void newcnd(void); @@ -411,7 +467,7 @@ void crmena(int, int, int, int, int); void deadkl(int, int, int, int, int); void timwrp(void); void movcom(void); -void torpedo(double, double, int, int, double *, int, int, int); +void torpedo(double, double, int, int, double *, int, int); void huh(void); void pause_game(int); void nova(int, int); @@ -433,17 +489,17 @@ void debugme(void); void attakreport(int); void movetho(void); void probe(void); -void iostart(int); +void iostart(void); void setwnd(WINDOW *); void warble(void); void boom(int ii, int jj); -void tracktorpedo(int x, int y, int ix, int iy, int wait, int l, int i, int n, int iquad); +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 makechart(void); -void enqueue(char *s); +void enqueue(char *); /* mode arguments for srscan() */ #define SCAN_FULL 1 @@ -451,12 +507,12 @@ void enqueue(char *s); #define SCAN_STATUS 3 #define SCAN_NO_LEFTSIDE 4 -WINDOW *FULLSCREEN_WINDOW; -WINDOW *SRSCAN_WINDOW; -WINDOW *REPORT_WINDOW; -WINDOW *LRSCAN_WINDOW; -WINDOW *LOWER_WINDOW; -WINDOW *BOTTOM_WINDOW; +WINDOW *fullscreen_window; +WINDOW *srscan_window; +WINDOW *report_window; +WINDOW *lrscan_window; +WINDOW *message_window; +WINDOW *prompt_window; extern void clreol(void); extern void clrscr(void); @@ -464,6 +520,7 @@ extern void textcolor(int color); extern void highvideo(void); enum COLORS { + DEFAULT, BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE };