Enable input editing with the linenoise library.
[open-adventure.git] / advent.h
index 328847db83da71112db0b14363919ea3f0c652db..9e50d9ce45254a4dc729bea06a263b0078b7682f 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -9,6 +9,9 @@
 #define DALTLC         18              /* alternate dwarf location; low room */
 #define MINTRS         50
 #define MAXTRS         79
+#define MAXPARMS       25
+#define INVLIMIT       7
+#define INTRANSITIVE   -1      /* illegal object number */
 
 typedef struct lcg_state
 {
@@ -73,7 +76,9 @@ struct game_t {
 extern struct game_t game;
 
 extern long LNLENG, LNPOSN, PARMS[];
-extern char rawbuf[LINESIZE], INLINE[LINESIZE+1], MAP1[], MAP2[];
+extern char rawbuf[LINESIZE], INLINE[LINESIZE+1];
+extern const char ascii_to_advent[];
+extern const char advent_to_ascii[];
 extern FILE *logfp;
 extern bool oldstyle;
 extern lcg_state lcgstate;
@@ -86,17 +91,11 @@ extern void SPEAK(vocab_t);
 extern void PSPEAK(vocab_t,int);
 extern void RSPEAK(vocab_t);
 extern void SETPRM(long,long,long);
-
-extern bool fGETIN(FILE *,token_t*,token_t*,token_t*,token_t*);
-#define GETIN(input,WORD1,WORD1X,WORD2,WORD2X) fGETIN(input,&WORD1,&WORD1X,&WORD2,&WORD2X)
-
+extern bool GETIN(FILE *,token_t*,token_t*,token_t*,token_t*);
 extern long YES(FILE *,vocab_t,vocab_t,vocab_t);
 extern long GETTXT(bool,bool,bool);
 extern token_t MAKEWD(long);
-
-extern void fPUTTXT(token_t,long*,long);
-#define PUTTXT(WORD,STATE,CASE) fPUTTXT(WORD,&STATE,CASE)
-
+extern void PUTTXT(token_t,long*,long);
 extern void SHFTXT(long,long);
 extern void TYPE0(void);
 
@@ -118,10 +117,9 @@ extern long ATDWRF(long);
 extern long SETBIT(long);
 extern bool TSTBIT(long,int);
 extern long RNDVOC(long,long);
-extern void BUG(long);
-extern void MAPLIN(FILE *);
+extern void BUG(long) __attribute__((noreturn));
+extern bool MAPLIN(FILE *);
 extern void TYPE(void);
-extern void MPINIT(void);
 
 extern void fSAVEIO(long,long,long*);
 #define SAVEIO(OP,IN,ARR) fSAVEIO(OP,IN,ARR)
@@ -134,6 +132,43 @@ extern unsigned long get_next_lcg_value(void);
 extern long randrange(long);
 extern void score(long);
 
+/*  Statement functions
+ *
+ *  AT(OBJ)    = true if on either side of two-placed object
+ *  CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit)
+ *  DARK(DUMMY) = true if location "LOC" is dark
+ *  FORCED(LOC) = true if LOC moves without asking for input (COND=2)
+ *  FOREST(LOC)  = true if LOC is part of the forest
+ *  GSTONE(OBJ)  = true if OBJ is a gemstone
+ *  HERE(OBJ)  = true if the OBJ is at "LOC" (or is being carried)
+ *  LIQ(DUMMY) = object number of liquid in bottle
+ *  LIQLOC(LOC) = object number of liquid (if any) at LOC
+ *  PCT(N)       = true N% of the time (N integer from 0 to 100)
+ *  TOTING(OBJ) = true if the OBJ is being carried */
+
+#define TOTING(OBJ)    (game.place[OBJ] == -1)
+#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 LIQ(DUMMY)     (LIQ2(game.prop[BOTTLE]<0 ? -1-game.prop[BOTTLE] : game.prop[BOTTLE]))
+#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 VOCWRD(LETTRS,SECT)    (VOCAB(MAKEWD(LETTRS),SECT))
+
+/*  The following two functions were added to fix a bug (game.clock1 decremented
+ *  while in forest).  They should probably be replaced by using another
+ *  "cond" bit.  For now, however, a quick fix...  OUTSID(LOC) is true if
+ *  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)
+
 /* vocabulary items */ 
 extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
    BIRD, BLOOD, BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
@@ -141,9 +176,10 @@ extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
    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,
-   RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY, SECT, SIGN, SNAKE,
+   RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
    STEPS, STICK, STREAM, THROW, TRIDNT, TROLL, TROLL2,
    URN, VASE, VEND, VOLCAN, WATER;
-/* evrything else */
-extern long I, J, K, L, MAXDIE, SPK, V1, V2, VRSION, WD1, WD1X, WD2, WD2X;
+/* everything else */
+extern long K, SPK, WD1, WD1X, WD2, WD2X;
 
+enum speechpart {unknown, intransitive, transitive};