Abstract away the operations involving a sentinel value for coordinates.
[super-star-trek.git] / src / sst.h
index 75e9be9d72859fc459f6fd190d2d6af765d34abc..a9bf781e546a588bcd558fdde1a99ff2441fb253 100644 (file)
--- a/src/sst.h
+++ b/src/sst.h
@@ -45,14 +45,15 @@ 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 {
     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 {mined=-1, present=0, absent=1} crystals; /* has crystals */
     enum {unknown, known, shuttle_down} known;
 } planet;
 
@@ -80,8 +81,8 @@ typedef enum {
 } feature;
 
 typedef struct {
-    int snap,          // snapshot taken
-       crew,           // crew complement
+    bool snap;         // snapshot taken
+    int crew,          // crew complement
 #define FULLCREW       428     /* BSD Trek was 387, that's wrong */
        remkl,                  // remaining klingons
        remcom,                 // remaining commanders
@@ -112,7 +113,7 @@ typedef struct {
     } galaxy[GALSIZE+1][GALSIZE+1];    // The Galaxy (subscript 0 not used)
     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
@@ -128,13 +129,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 */
@@ -165,13 +159,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 damaged(dev)   (game.damage[dev] != 0.0)
 
 #define FOREVER        1e30
 
@@ -209,6 +204,8 @@ extern double scheduled(int);
 
 #define SSTMAGIC       "SST2.0\n"
 
+#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
+
 struct game {
     char magic[sizeof(SSTMAGIC)];
     unsigned long options;
@@ -233,12 +230,15 @@ struct game {
        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
@@ -254,32 +254,39 @@ struct game {
        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
+       intorps,        // initial/max torpedoes
        torps,          // number of torpedoes
        ship,           // ship type -- 'E' is Enterprise
        abandoned,      // count of crew abandoned in space
        length,         // length of game
-       skill,          // skill level
        klhere,         // klingons here
        casual,         // causalties
        nhelp,          // calls for help
        nkinks,         // count of energy-barrier crossings
-       shldchg,        // shield is changing (affects efficiency)
-       landed,         // party on planet (1), on ship (-1)
        iplnet,         // planet # in quadrant
        inplan,         // initial planets
        nenhere,        // number of enemies in quadrant
        irhere,         // Romulans in quadrant
-       iscraft,        // =1 if craft on ship, -1 if removed from game
        isatb,          // =1 if super commander is attacking base
-       iscate,         // super commander is here
-       iattak,         // attack recursion elimination (was cracks[4])
        tourn,          // tournament number
        proben,         // number of moves for probe
        nprobes;        // number of probes available
@@ -311,6 +318,7 @@ 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;
@@ -392,7 +400,7 @@ coord randplace(int);
 coord dropin(feature);
 void newcnd(void);
 void sortkl(void);
-void imove(void);
+void imove(bool);
 void ram(bool, feature, coord);
 void crmena(bool, feature, enum loctype, coord w);
 void deadkl(coord, feature, coord);
@@ -431,8 +439,10 @@ void setpassword(void);
 void commandhook(char *, bool);
 void makechart(void);
 void enqueue(char *);
-char *systemname(int);
 coord newkling(int);
+#if BSD_BUG_FOR_BUG
+void visual(void);
+#endif
 
 extern WINDOW *curwnd;
 extern WINDOW *fullscreen_window;