Get rid of DESTROY macro.
[super-star-trek.git] / src / sst.h
index 8616c416f1ad2777e1e28a788970bddd05e93912..7389c5de3aecd4a0c3636b88c172849e9a4d9ea1 100644 (file)
--- a/src/sst.h
+++ b/src/sst.h
 #define min(x, y)      ((x)<(y)?(x):(y))
 #define max(x, y)      ((x)>(y)?(x):(y))
 
-#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.
  */
 #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 same(c1, c2)   (c1.x == c2.x && c1.y == c2.y)
+#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;
+    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
-       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
@@ -69,9 +88,9 @@ typedef struct {
        nromrem,                // Romulans remaining
        nplankl,                // destroyed uninhabited planets
        nworldkl;               // destroyed inhabited planets
-    planet plnets[PLNETMAX];  // Planet information
+    planet planets[PLNETMAX];  // Planet information
     double date,               // stardate
-       remres,         // remaining resources
+       remres,                 // remaining resources
        remtime;                // remaining time
     coord baseq[BASEMAX+1];    // Base quadrant coordinates
     coord kcmdr[QUADSIZE+1];   // Commander quadrant coordinates
@@ -89,14 +108,11 @@ 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
 
-#define MAXKLGAME      127
-#define MAXKLQUAD      9
-
 #define NKILLK (game.inkling - game.state.remkl)
 #define NKILLC (game.incom - game.state.remcom)
 #define NKILLSC (game.inscom - game.state.nscrem)
@@ -105,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 */
@@ -142,13 +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 damaged(dev)   (game.damage[dev] != 0.0)
 
 #define FOREVER        1e30
 
@@ -186,12 +196,14 @@ 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;
     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
@@ -210,48 +222,64 @@ 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
        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
-       condit,         // condition (red/yellow/green/docked)
+       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
-       comhere,        // commanders 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
-       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
        isatb,          // =1 if super commander is attacking base
-       iscate,         // super commander is here
-       iattak,         // attack recursion elimination (was cracks[4])
-       icrystl,        // dilithium crystals aboard
        tourn,          // tournament number
-       ithere,         // Tholian is here 
-       iseenit,        // seen base attack report
        proben,         // number of moves for probe
        nprobes;        // number of probes available
     double inresor,    // initial resources
@@ -282,6 +310,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;
@@ -292,140 +321,117 @@ extern FILE *logfp, *replayfp;
 
 /* the Space Thingy's global state should *not* be saved! */
 extern coord thing;
-extern int 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, FCREW} FINTYPE ;
-enum loctype {neither, quadrant, sector};
+extern bool iqhere, iqengry;
 
-#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 '.'
-#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(bool);
-bool choose(bool);
-void setup(bool);
-void score(void);
-void atover(bool);
-int srscan(int);
-void lrscan(void);
-void phasers(void);
-void photon(void);
-void warp(bool);
-void doshield(int);
-void dock(bool);
-void dreprt(void);
-void chart(bool);
-void rechart(void);
-void impuls(void);
-void wait(void);
-void setwrp(void);
-void events(void);
-void report(void);
-void eta(void);
-void mayday(void);
-void abandn(void);
-void finish(FINTYPE);
-void dstrct(void);
-void kaboom(void);
-void freeze(bool);
-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(bool);
-bool ja(void);
-void cramen(int);
-void crmshp(void);
-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, coord*);
-void newcnd(void);
-void sortkl(void);
-void imove(void);
-void ram(bool, int, coord);
-void crmena(bool, int, enum loctype, coord w);
-void deadkl(coord, 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(bool *);
-void hittem(double *);
-void prouts(char *, ...);
-int isit(char *);
-void preport(void);
-void orbit(void);
-void sensor(void);
-void drawmaps(int);
-void beam(void);
-void mine(void);
-void usecrystals(void);
-void shuttle(void);
-void deathray(void);
-void debugme(void);
-void attakreport(bool);
-void movetho(void);
-void probe(void);
-void iostart(void);
-void setwnd(WINDOW *);
-void warble(void);
-void boom(int, int);
-void tracktorpedo(int, int, int, int, int, int);
-void cgetline(char *, int);
-void waitfor(void);
-void setpassword(void);
-void commandhook(char *, bool);
-void makechart(void);
-void enqueue(char *);
-char *systemname(int);
-void newkling(int, coord *);
-
-/* 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;
@@ -437,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 {