#include <stdbool.h>
#include "common.h"
+#include "newdb.h"
#define LINESIZE 100
#define NDWARVES 6 /* number of dwarves */
long fixed[NOBJECTS + 1];
long link[NOBJECTS * 2 + 1];
long place[NOBJECTS + 1];
- long hinted[HNTSIZ + 1];
- long hintlc[HNTSIZ + 1];
+ long hinted[HINT_COUNT];
+ long hintlc[HINT_COUNT];
long prop[NOBJECTS + 1];
};
extern struct game_t game;
-extern long LNLENG, LNPOSN, PARMS[];
+extern long LNLENG, LNPOSN;
extern char rawbuf[LINESIZE], INLINE[LINESIZE + 1];
extern const char ascii_to_advent[];
extern const char advent_to_ascii[];
#define READ_MODE "rb"
#define WRITE_MODE "wb"
extern void* xmalloc(size_t size);
-extern char* xstrdup(const char*);
extern void packed_to_token(long, char token[]);
extern void token_to_packed(char token[], long*);
-extern void speak(const char*);
+extern void vspeak(const char*, va_list);
extern bool wordeq(token_t, token_t);
extern bool wordempty(token_t);
extern void wordclear(token_t *);
-extern void PSPEAK(vocab_t, int);
-extern void RSPEAK(vocab_t);
-extern void SETPRM(long, long, long);
+extern void speak(const char*, ...);
+extern void pspeak(vocab_t, int, ...);
+extern void rspeak(vocab_t, ...);
extern bool GETIN(FILE *, token_t*, token_t*, token_t*, token_t*);
extern void echo_input(FILE*, char*, char*);
extern char* get_input(void);
#define HERE(OBJ) (AT(OBJ) || TOTING(OBJ))
#define LIQ2(PBOTL) ((1-(PBOTL))*WATER+((PBOTL)/2)*(WATER+OIL))
#define LIQUID() (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,LIGHT)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
+#define LIQLOC(LOC) (LIQ2((MOD(conditions[LOC]/2*2,8)-5)*MOD(conditions[LOC]/4,2)+1))
+#define CNDBIT(L,N) (TSTBIT(conditions[L],N))
+#define FORCED(LOC) CNDBIT(LOC, COND_FORCED)
+#define DARK(DUMMY) ((!TSTBIT(conditions[game.loc],COND_LIT)) && (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 FOREST(LOC) CNDBIT(LOC, COND_FOREST)
#define VOCWRD(LETTRS,SECT) (VOCAB(MAKEWD(LETTRS),SECT))
#define SPECIAL(LOC) ((LOC) > SPECIALBASE)
+#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC))
-/* 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) <= LOC_GRATE || FOREST(LOC) || (LOC) == PLAC[SAPPH] || (LOC) == LOC_FOOF2 || (LOC) == LOC_FOOF4)
-#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC) && (LOC) != LOC_FOOF1)
+#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC))
/* vocabulary items */
extern long AMBER, ATTACK, AXE, BACK, BATTERY, BEAR,
#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 bits */
-#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 */