X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.h;h=7389c5de3aecd4a0c3636b88c172849e9a4d9ea1;hp=7e7d1d30dd0e9067e334a7df1f9f255c9a4de56b;hb=2c5438d3c22fe863ad8054d214f2afdd061ad43a;hpb=52265793501a00845a0d6108d1af6e50e3ece379 diff --git a/src/sst.h b/src/sst.h index 7e7d1d3..7389c5d 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,18 +15,20 @@ #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 GALSIZE (8) -#define NINHAB (GALSIZE * GALSIZE / 2) -#define MAXUNINHAB (10) -#define PLNETMAX (NINHAB + MAXUNINHAB) -#define QUADSIZE (10) -#define BASEMAX (5) +#define PHASEFAC 2.0 +#define GALSIZE 8 +#define NINHAB (GALSIZE * GALSIZE / 2) +#define MAXUNINHAB 10 +#define PLNETMAX (NINHAB + MAXUNINHAB) +#define QUADSIZE 10 +#define BASEMAX (GALSIZE * GALSIZE / 12) +#define MAXKLGAME 127 +#define MAXKLQUAD 9 /* * These macros hide the difference between 0-origin and 1-origin addressing. @@ -31,55 +36,79 @@ */ #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 <= game.nenhere; i++) -#define for_starbases(i) for (i = 1; i <= game.state.rembase; i++) + +typedef struct {int x; int y;} coord; + +#define square(i) ((i)*(i)) +#define same(c1, c2) ((c1.x == c2.x) && (c1.y == c2.y)) +#define distance(c1, c2) sqrt(square(c1.x - c2.x) + square(c1.y - c2.y)) +#define invalidate(w) w.x = w.y = 0 +#define is_valid(w) (w.x != 0 && w.y != 0) typedef struct { - int x; /* Quadrant location of planet */ - int y; - enum {M=0, N=1, O=2} pclass; + coord w; + enum {destroyed= -1, 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 {mined=-1, present=0, absent=1} crystals; /* has crystals */ enum {unknown, known, shuttle_down} known; } planet; -#define DESTROY(pl) memset(pl, '\0', sizeof(planet)) +typedef enum { + IHR = 'R', + IHK = 'K', + IHC = 'C', + IHS = 'S', + IHSTAR = '*', + IHP = 'P', + IHW = '@', + IHB = 'B', + IHBLANK = ' ', + IHDOT = '.', + IHQUEST = '?', + IHE = 'E', + IHF = 'F', + IHT = 'T', + IHWEB = '#', + IHMATER0 = '-', + IHMATER1 = 'o', + IHMATER2 = '0', +} feature; typedef struct { - int snap, // snapshot taken + bool snap; // snapshot taken + int crew, // crew complement +#define FULLCREW 428 /* BSD Trek was 387, that's wrong */ remkl, // remaining klingons remcom, // remaining commanders nscrem, // remaining super commanders 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 { + nplankl, // destroyed uninhabited planets + nworldkl; // destroyed inhabited planets + planet planets[PLNETMAX]; // Planet information + double date, // stardate + remres, // remaining resources + remtime; // remaining time + 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; + int planet; +#define NOPLANET -1 + bool starbase; int klingons; int romulans; - int supernova; - int charted; + bool supernova; + bool charted; + enum {secure, distressed, enslaved} status; } galaxy[GALSIZE+1][GALSIZE+1]; // The Galaxy (subscript 0 not used) - struct { + struct page { int stars; - int starbase; + bool starbase; int klingons; } chart[GALSIZE+1][GALSIZE+1]; // the starchart (subscript 0 not used) } snapshot; // Data that is snapshot @@ -92,13 +121,6 @@ typedef struct { #define INKLINGTOT (game.inkling + game.incom + game.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 */ @@ -129,11 +151,14 @@ typedef struct { #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 DNAVSYS 11 +#define DTRANSP 12 +#define DSHCTRL 13 +#define DDRAY 14 +#define DDSP 15 +#define NDEVICES (16) // Number of devices + +#define damaged(dev) (game.damage[dev] != 0.0) #define FOREVER 1e30 @@ -148,86 +173,114 @@ typedef struct { #define FSCMOVE 6 // Supercommander moves (might attack base) #define FSCDBAS 7 // Supercommander destroys base #define FDSPROB 8 // Move deep space probe -#define NEVENTS (9) +#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) + +typedef struct { + double date; + coord quadrant; +} event; + +/* + * abstract out the event handling -- underlying data structures will change + * when we implement stateful events + */ +extern event *unschedule(int); +extern int is_scheduled(int); +extern event *schedule(int, double); +extern void postpone(int, double); +extern double scheduled(int); +#define findevent(evtype) &game.future[evtype] #define SSTMAGIC "SST2.0\n" +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) + struct game { char magic[sizeof(SSTMAGIC)]; unsigned long options; snapshot state; snapshot snapsht; - char quad[QUADSIZE+1][QUADSIZE+1]; // contents of our quadrant + feature 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 + event 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)]; - 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) + 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 + shldup, // shields are up + shldchg, // shield is changing (affects efficiency) + comhere, // commander here + ishere, // super-commander in quadrant + iscate, // super commander is here + ientesc, // attempted escape from supercommander + ithere, // Tholian is here + resting, // rest time + icraft, // Kirk in Galileo + landed, // party on planet (true), on ship (false) + alldone, // game is now finished + neutz, // Romulan Neutral Zone + isarmed, // probe is armed + inorbit, // orbiting a planet + imine, // mining + icrystl, // dilithium crystals aboard + iseenit, // seen base attack report + thawed; // thawed game + enum { + green, + yellow, + red, + docked, + dead, + } condition; // condition (red/yellow/green/docked) + enum { + onship, + offship, + removed, + } iscraft; // 'onship' if craft on ship, 'removed' if out of game + enum { + SKILL_NONE, + SKILL_NOVICE, + SKILL_FAIR, + SKILL_GOOD, + SKILL_EXPERT, + SKILL_EMERITUS, + } skill; // skill level + 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 torps, // number of torpedoes - ship, // Ship type -- 'E' is Enterprise - quadx, // where we are - quady, // - sectx, // where we are - secty, // + ship, // ship type -- 'E' is Enterprise + abandoned, // count of crew abandoned in space 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 - imine, // mining 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, // proben, // number of moves for probe - isarmed, // probe is armed nprobes; // number of probes available double inresor, // initial resources intime, // initial time @@ -237,7 +290,6 @@ struct game { indate, // initial date energy, // energy level shield, // shield level - shldup, // shields are up warpfac, // warp speed wfacsq, // squared warp factor lsupres, // life support reserves @@ -245,7 +297,6 @@ struct game { 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 @@ -259,149 +310,128 @@ extern struct game game; /* the following global state doesn't need to be saved */ extern char *device[NDEVICES]; +extern char *systnames[NINHAB + 1]; extern int iscore, iskill; // Common PLAQ extern double perdate; extern double aaitem; extern char citem[10]; +extern int seed; +extern bool idebug; +extern FILE *logfp, *replayfp; /* 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, - FPNOVA, FSSC, FSTRACTOR, FDRAY, FTRIBBLE, - FHOLE} FINTYPE ; -enum loctype {neither, quadrant, sector}; - -#ifndef TRUE -#define TRUE (1) -#define FALSE (0) -#endif +extern coord thing; +extern bool iqhere, iqengry; -#define IHR 'R' -#define IHK 'K' -#define IHC 'C' -#define IHS 'S' -#define IHSTAR '*' -#define IHP 'P' -#define IHB 'B' -#define IHBLANK ' ' -#define IHDOT '.' -#define IHQUEST '?' -#define IHE 'E' -#define IHF 'F' -#define IHT 'T' -#define IHWEB '#' -#define IHGREEN 'G' -#define IHYELLOW 'Y' -#define IHRED 'R' -#define IHDOCKED 'D' -#define IHDEAD 'Z' -#define IHMATER0 '-' -#define IHMATER1 'o' -#define IHMATER2 '0' +typedef enum { + FWON, FDEPLETE, FLIFESUP, FNRG, FBATTLE, + FNEG3, FNOVA, FSNOVAED, FABANDN, FDILITHIUM, + FMATERIALIZE, FPHASER, FLOST, FMINING, FDPLANET, + FPNOVA, FSSC, FSTRACTOR, FDRAY, FTRIBBLE, + FHOLE, FCREW +} FINTYPE ; +enum loctype {neither, quadrant, sector}; /* Function prototypes */ -void prelim(void); -void attack(int); -int choose(int); -void setup(int); -void score(void); -void atover(int); -int srscan(int); -void lrscan(void); -void phasers(void); -void photon(void); -void warp(int); -void doshield(int); -void dock(int); -void dreprt(void); -void chart(int); -void rechart(void); -void impuls(void); -void wait(void); -void setwrp(void); -void events(void); -void report(void); -void eta(void); -void help(void); -void abandn(void); -void finish(FINTYPE); -void dstrct(void); -void kaboom(void); -void freeze(int); -int thaw(void); -void plaque(void); -int scan(void); +extern void prelim(void); +extern void attack(bool); +extern bool choose(bool); +extern void setup(bool); +extern void score(void); +extern void atover(bool); +extern void srscan(void); +extern void lrscan(void); +extern void phasers(void); +extern void photon(void); +extern void warp(bool); +extern void doshield(bool); +extern void dock(bool); +extern void damagereport(void); +extern void chart(void); +extern void rechart(void); +extern void impulse(void); +extern void wait(void); +extern void setwarp(void); +extern void events(void); +extern void report(void); +extern void eta(void); +extern void mayday(void); +extern void abandon(void); +extern void finish(FINTYPE); +extern void selfdestruct(void); +extern void kaboom(void); +extern void freeze(bool); +extern bool thaw(void); +extern void plaque(void); +extern int scan(void); +extern void status(int req); +extern void request(void); #define IHEOL (0) #define IHALPHA (1) #define IHREAL (2) -void chew(void); -void chew2(void); -void skip(int); -void prout(char *, ...); -void proutn(char *, ...); -void stars(void); -void newqad(int); -int ja(void); -void cramen(int); -void crmshp(void); -char *cramlc(enum loctype, int, int); -double expran(double); -double Rand(void); -void iran(int, int *, int *); -#define square(i) ((i)*(i)) -void dropin(int, int*, int*); -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 timwrp(void); -void movcom(void); -void torpedo(double, double, int, int, double *, int, int); -void huh(void); -void pause_game(int); -void nova(int, int); -void snova(int, int); -void scom(int *); -void hittem(double *); -void prouts(char *, ...); -int isit(char *); -void preport(void); -void orbit(void); -void sensor(void); -void drawmaps(short); -void beam(void); -void mine(void); -void usecrystals(void); -void shuttle(void); -void deathray(void); -void debugme(void); -void attakreport(int); -void movetho(void); -void probe(void); -void iostart(void); -void setwnd(WINDOW *); -void warble(void); -void boom(int ii, int jj); -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 *); -char *systemname(planet *); - -/* mode arguments for srscan() */ -#define SCAN_FULL 1 -#define SCAN_REQUEST 2 -#define SCAN_STATUS 3 -#define SCAN_NO_LEFTSIDE 4 +extern void chew(void); +extern void chew2(void); +extern void skip(int); +extern void prout(const char *, ...) __attribute__((format(printf, 1, 2))); +extern void proutn(const char *, ...) __attribute__((format(printf, 1, 2))); +extern void prouts(const char *, ...) __attribute__((format(printf, 1, 2))); +extern void prstat(const char *txt, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); +extern void stars(void); +extern void newqad(bool); +extern bool ja(void); +extern void cramen(feature); +extern void crmshp(void); +extern char *cramlc(enum loctype, coord w); +extern double expran(double); +extern double Rand(void); +extern coord randplace(int); +extern coord dropin(feature); +extern void newcnd(void); +extern void sortklings(void); +extern void imove(bool); +extern void ram(bool, feature, coord); +extern void crmena(bool, feature, enum loctype, coord w); +extern void deadkl(coord, feature, coord); +extern void timwrp(void); +extern void moveklings(void); +extern void torpedo(double, double, coord, double *, int, int); +extern void huh(void); +extern void pause_reset(void); +extern void pause_game(bool); +extern void nova(coord); +extern void supernova(bool, coord *); +extern void supercommander(void); +extern void hittem(double *); +extern bool isit(char *); +extern void survey(void); +extern void orbit(void); +extern void sensor(void); +extern void drawmaps(int); +extern void beam(void); +extern void mine(void); +extern void usecrystals(void); +extern void shuttle(void); +extern void deathray(void); +extern void debugme(void); +extern void attackreport(bool); +extern void movetholian(void); +extern void probe(void); +extern void iostart(void); +extern void setwnd(WINDOW *); +extern void warble(void); +extern void boom(coord); +extern void tracktorpedo(coord, int, int, int, int); +extern void cgetline(char *, int); +extern void waitfor(void); +extern void setpassword(void); +extern void commandhook(char *, bool); +extern void makechart(void); +extern coord newkling(int); +#if BSD_BUG_FOR_BUG +extern void visual(void); +#endif extern WINDOW *curwnd; extern WINDOW *fullscreen_window; @@ -413,7 +443,7 @@ extern WINDOW *prompt_window; extern void clreol(void); extern void clrscr(void); -extern void textcolor(int color); +extern void textcolor(int); extern void highvideo(void); enum COLORS {