Fix game type parsing.
[super-star-trek.git] / sst.h
diff --git a/sst.h b/sst.h
index 95ef5518cd386b8b7136d5030427c4a08cae93fe..f8d65fffed828e21de8c2386b07c04e24f283375 100644 (file)
--- a/sst.h
+++ b/sst.h
 
 // #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,11 +489,11 @@ 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);