Abolish MAXDIE in favor of maximum_deaths.
[open-adventure.git] / advent.h
index f831a7b487d8a472bf00ca6748790e05374961e4..3e89be0a87e5e04060c1cdb896e54d658d623a5a 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -1,4 +1,5 @@
 #include <stdio.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <stdbool.h>
 
 #include "common.h"
 #include <stdbool.h>
 
 #include "common.h"
@@ -6,22 +7,21 @@
 #define LINESIZE       100
 #define NDWARVES       6
 #define PIRATE         NDWARVES        /* must be NDWARVES-1 when zero-origin */
 #define LINESIZE       100
 #define NDWARVES       6
 #define PIRATE         NDWARVES        /* must be NDWARVES-1 when zero-origin */
-#define DALTLC         18              /* alternate dwarf location; low room */
+#define DALTLC         LOC_NUGGET      /* alternate dwarf location */
 #define MINTRS         50
 #define MAXTRS         79
 #define MAXPARMS       25
 #define INVLIMIT       7
 #define MINTRS         50
 #define MAXTRS         79
 #define MAXPARMS       25
 #define INVLIMIT       7
-#define INTRANSITIVE   -1      /* illegal object number */
-
-typedef struct lcg_state
-{
-  unsigned long a, c, m, x;
-} lcg_state;
+#define INTRANSITIVE   -1              /* illegal object number */
+#define SPECIALBASE    300             /* base number of special rooms */
+#define WARNTIME       30              /* late game starts at game.limit-this */
+#define PANICTIME      15              /* time left after closing */
 
 typedef long token_t;  /* word token - someday this will be char[TOKLEN+1] */
 typedef long vocab_t;  /* index into a vocabulary array */
 
 struct game_t {
 
 typedef long token_t;  /* word token - someday this will be char[TOKLEN+1] */
 typedef long vocab_t;  /* index into a vocabulary array */
 
 struct game_t {
+    unsigned long lcg_a, lcg_c, lcg_m, lcg_x;
     long abbnum;
     long blklin;
     long bonus;
     long abbnum;
     long blklin;
     long bonus;
@@ -52,7 +52,6 @@ struct game_t {
     long oldobj;
     long panic;
     long saved;
     long oldobj;
     long panic;
     long saved;
-    long setup;
     long tally;
     long thresh;
     long trndex;
     long tally;
     long thresh;
     long trndex;
@@ -81,26 +80,24 @@ extern const char ascii_to_advent[];
 extern const char advent_to_ascii[];
 extern FILE *logfp;
 extern bool oldstyle, editline, prompt;
 extern const char advent_to_ascii[];
 extern FILE *logfp;
 extern bool oldstyle, editline, prompt;
-extern lcg_state lcgstate;
 
 /* b is not needed for POSIX but harmless */
 #define READ_MODE "rb"
 #define WRITE_MODE "wb"
 
 /* b is not needed for POSIX but harmless */
 #define READ_MODE "rb"
 #define WRITE_MODE "wb"
-extern void* xmalloc(size_t);
-extern void packed_to_token(long, char token[6]);
-extern void newspeak(char*);
+extern void* xmalloc(size_t size);
+extern char* xstrdup(const char*);
+extern void packed_to_token(long, char token[]);
+extern void speak(const char*);
 extern void PSPEAK(vocab_t,int);
 extern void RSPEAK(vocab_t);
 extern void SETPRM(long,long,long);
 extern bool GETIN(FILE *,token_t*,token_t*,token_t*,token_t*);
 extern void PSPEAK(vocab_t,int);
 extern void RSPEAK(vocab_t);
 extern void SETPRM(long,long,long);
 extern bool GETIN(FILE *,token_t*,token_t*,token_t*,token_t*);
-extern long YES(FILE *,vocab_t,vocab_t,vocab_t);
+extern void echo_input(FILE*, char*, char*);
+extern char* get_input(void);
+extern bool YES(const char*, const char*, const char*);
 extern long GETTXT(bool,bool,bool);
 extern token_t MAKEWD(long);
 extern long GETTXT(bool,bool,bool);
 extern token_t MAKEWD(long);
-extern void PUTTXT(token_t,long*,long);
-extern void SHFTXT(long,long);
-extern void TYPE0(void);
 extern long VOCAB(long,long);
 extern long VOCAB(long,long);
-extern void DSTROY(long);
 extern void JUGGLE(long);
 extern void MOVE(long,long);
 extern long PUT(long,long,long);
 extern void JUGGLE(long);
 extern void MOVE(long,long);
 extern long PUT(long,long,long);
@@ -110,16 +107,19 @@ extern long ATDWRF(long);
 extern long SETBIT(long);
 extern bool TSTBIT(long,int);
 extern long RNDVOC(long,long);
 extern long SETBIT(long);
 extern bool TSTBIT(long,int);
 extern long RNDVOC(long,long);
-extern void BUG(long) __attribute__((noreturn));
 extern bool MAPLIN(FILE *);
 extern bool MAPLIN(FILE *);
-extern void TYPE(void);
 extern void DATIME(long*, long*);
 
 extern void DATIME(long*, long*);
 
+enum termination {endgame, quitgame, scoregame};
+
 extern void set_seed(long);
 extern unsigned long get_next_lcg_value(void);
 extern long randrange(long);
 extern void set_seed(long);
 extern unsigned long get_next_lcg_value(void);
 extern long randrange(long);
-extern void score(long);
-extern int saveresume(FILE *, bool);
+extern long score(enum termination);
+extern void terminate(enum termination) __attribute__((noreturn));
+extern int suspend(void);
+extern int resume(void);
+extern int restore(FILE *);
 
 /*
  *  MOD(N,M)   = Arithmetic modulus
 
 /*
  *  MOD(N,M)   = Arithmetic modulus
@@ -135,8 +135,9 @@ extern int saveresume(FILE *, bool);
  *  PCT(N)      = true N% of the time (N integer from 0 to 100)
  *  TOTING(OBJ) = true if the OBJ is being carried */
 
  *  PCT(N)      = true N% of the time (N integer from 0 to 100)
  *  TOTING(OBJ) = true if the OBJ is being carried */
 
+#define DESTROY(N)     MOVE(N, NOWHERE)
 #define MOD(N,M)       ((N) % (M))
 #define MOD(N,M)       ((N) % (M))
-#define TOTING(OBJ)    (game.place[OBJ] == -1)
+#define TOTING(OBJ)    (game.place[OBJ] == CARRIED)
 #define AT(OBJ) (game.place[OBJ] == game.loc || game.fixed[OBJ] == game.loc)
 #define HERE(OBJ)      (AT(OBJ) || TOTING(OBJ))
 #define LIQ2(PBOTL)    ((1-(PBOTL))*WATER+((PBOTL)/2)*(WATER+OIL))
 #define AT(OBJ) (game.place[OBJ] == game.loc || game.fixed[OBJ] == game.loc)
 #define HERE(OBJ)      (AT(OBJ) || TOTING(OBJ))
 #define LIQ2(PBOTL)    ((1-(PBOTL))*WATER+((PBOTL)/2)*(WATER+OIL))
@@ -144,11 +145,12 @@ extern int saveresume(FILE *, bool);
 #define LIQLOC(LOC)    (LIQ2((MOD(COND[LOC]/2*2,8)-5)*MOD(COND[LOC]/4,2)+1))
 #define CNDBIT(L,N)    (TSTBIT(COND[L],N))
 #define FORCED(LOC)    (COND[LOC] == 2)
 #define LIQLOC(LOC)    (LIQ2((MOD(COND[LOC]/2*2,8)-5)*MOD(COND[LOC]/4,2)+1))
 #define CNDBIT(L,N)    (TSTBIT(COND[L],N))
 #define FORCED(LOC)    (COND[LOC] == 2)
-#define DARK(DUMMY)    ((!CNDBIT(game.loc,0)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
-#define PCT(N) (randrange(100) < (N))
-#define GSTONE(OBJ)    ((OBJ) == EMRALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
-#define FOREST(LOC)    ((LOC) >= 145 && (LOC) <= 166)
+#define DARK(DUMMY)    ((!CNDBIT(game.loc,LIGHT)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
+#define PCT(N)         (randrange(100) < (N))
+#define GSTONE(OBJ)    ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
+#define FOREST(LOC)    ((LOC) >= LOC_FOREST1 && (LOC) <= LOC_FOREST22)
 #define VOCWRD(LETTRS,SECT)    (VOCAB(MAKEWD(LETTRS),SECT))
 #define VOCWRD(LETTRS,SECT)    (VOCAB(MAKEWD(LETTRS),SECT))
+#define SPECIAL(LOC)   ((LOC) > SPECIALBASE)
 
 /*  The following two functions were added to fix a bug (game.clock1 decremented
  *  while in forest).  They should probably be replaced by using another
 
 /*  The following two functions were added to fix a bug (game.clock1 decremented
  *  while in forest).  They should probably be replaced by using another
@@ -156,22 +158,25 @@ extern int saveresume(FILE *, bool);
  *  LOC is outside, INDEEP(LOC) is true if LOC is "deep" in the cave (hall
  *  of mists or deeper).  Note special kludges for "Foof!" locs. */
 
  *  LOC is outside, INDEEP(LOC) is true if LOC is "deep" in the cave (hall
  *  of mists or deeper).  Note special kludges for "Foof!" locs. */
 
-#define OUTSID(LOC)    ((LOC) <= 8 || FOREST(LOC) || (LOC) == PLAC[SAPPH] || (LOC) == 180 || (LOC) == 182)
-#define INDEEP(LOC)    ((LOC) >= 15 && !OUTSID(LOC) && (LOC) != 179)
+#define OUTSID(LOC)    ((LOC) <= LOC_GRATE || FOREST(LOC) || (LOC) == PLAC[SAPPH] || (LOC) == LOC_FOOF2 || (LOC) == LOC_FOOF4)
+#define INDEEP(LOC)    ((LOC) >= LOC_MISTHALL && !OUTSID(LOC) && (LOC) != LOC_FOOF1)
 
 /* vocabulary items */ 
 
 /* vocabulary items */ 
-extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
+extern long AMBER, ATTACK, AXE, BACK, BATTERY, BEAR,
    BIRD, BLOOD, BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
    CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
    BIRD, BLOOD, BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
    CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
-   EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD, GRATE, HINT, INVENT,
-   JADE, KEYS, KNIFE, LAMP, LOCK, LOOK, MAGZIN, MESSAG, MIRROR, NUGGET, NUL,
-   OGRE, OIL, OYSTER, PANIC, PEARL, PILLOW, PLANT, PLANT2, PYRAM,
+   EMERALD, ENTER, ENTRNC, FIND, FISSURE, FOOD, GRATE, HINT, INVENT,
+   JADE, KEYS, KNIFE, LAMP, LOCK, LOOK, MAGAZINE, MESSAG, MIRROR, NUGGET, NUL,
+   OGRE, OIL, OYSTER, PANIC, PEARL, PILLOW, PLANT, PLANT2, PYRAMID,
    RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
    RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
-   STEPS, STICK, STREAM, THROW, TRIDNT, TROLL, TROLL2,
-   URN, VASE, VEND, VOLCAN, WATER;
+   STEPS, STICK, STREAM, THROW, TRIDENT, TROLL, TROLL2,
+   URN, VASE, VEND, VOLCANO, WATER;
 
 enum speechpart {unknown, intransitive, transitive};
 
 
 enum speechpart {unknown, intransitive, transitive};
 
+void initialise(void);
+int action(FILE *input, enum speechpart part, long verb, token_t obj);
+
 /* Phase codes for action returns. 
  * These were at one time FORTRAN line numbers.
  * The values don't matter, but perturb their order at your peril.
 /* Phase codes for action returns. 
  * These were at one time FORTRAN line numbers.
  * The values don't matter, but perturb their order at your peril.
@@ -191,6 +196,29 @@ enum speechpart {unknown, intransitive, transitive};
 #define GO_ACTION      40000
 #define GO_DWARFWAKE   19000
 
 #define GO_ACTION      40000
 #define GO_DWARFWAKE   19000
 
+/* Symbols for cond bits */
+#define LIGHT  0       /* Light */
+#define OILY   1       /* If bit 2 is on: on for oil, off for water */
+#define FLUID  2       /* Liquid asset, see bit 1 */
+#define NOARRR 3       /* Pirate doesn't go here unless following player */
+#define NOBACK 4       /* Cannot use "back" to move away */
+/* Bits past 10 indicate areas of interest to "hint" routines */
+#define HBASE  10      /* Base for location hint bitss */
+#define HCAVE  11      /* Trying to get into cave */
+#define HBIRD  12      /* Trying to catch bird */
+#define HSNAKE 13      /* Trying to deal with snake */
+#define HMAZE  14      /* Lost in maze */
+#define HDARK  15      /* Pondering dark room */
+#define HWITT  16      /* At Witt's End */
+#define HCLIFF 17      /* Cliff with urn */
+#define HWOODS 18      /* Lost in forest */
+#define HOGRE  19      /* Trying to deal with ogre */
+#define HJADE  20      /* Found all treasures except jade */
+
+/* Special object statuses in game.place - can also be a location number (> 0) */
+#define CARRIED                -1      /* Player is toting it */
+#define NOWHERE        0       /* It's destroyed */
+
 /* hack to ignore GCC Unused Result */
 #define IGNORE(r) do{if (r){}}while(0)
 
 /* hack to ignore GCC Unused Result */
 #define IGNORE(r) do{if (r){}}while(0)