+#include "dungeon.h"
+
+#define LINESIZE 1024
+#define TOKLEN 5 // № sigificant characters in a token */
+#define NDWARVES 6 // number of dwarves
+#define PIRATE NDWARVES // must be NDWARVES-1 when zero-origin
+#define DALTLC LOC_NUGGET // alternate dwarf location
+#define INVLIMIT 7 // inverntory limit (№ of objects)
+#define INTRANSITIVE -1 // illegal object number
+#define GAMELIMIT 330 // base limit of turns
+#define NOVICELIMIT 1000 // limit of turns for novice
+#define WARNTIME 30 // late game starts at game.limit-this
+#define FLASHTIME 50 // turns from first warning till blinding flash
+#define PANICTIME 15 // time left after closing
+#define BATTERYLIFE 2500 // turn limit increment from batteries
+#define WORD_NOT_FOUND -1 // "Word not found" flag value for the vocab hash functions.
+#define WORD_EMPTY 0 // "Word empty" flag value for the vocab hash functions
+#define CARRIED -1 // Player is toting it
+#define READ_MODE "rb" // b is not needed for POSIX but harmless
+#define WRITE_MODE "wb" // b is not needed for POSIX but harmless
+
+/* Special object-state values - integers > 0 are object-specific */
+#define STATE_NOTFOUND -1 // 'Not found" state of treasures */
+#define STATE_FOUND 0 // After discovered, before messed with
+#define STATE_IN_CAVITY 1 // State value common to all gemstones
+
+/* Special fixed object-state values - integers > 0 are location */
+#define IS_FIXED -1
+#define IS_FREE 0
+
+/* Map a state property value to a negative range, where the object cannot be
+ * picked up but the value can be recovered later. Avoid colliding with -1,
+ * which has its own meaning. */
+#define STASHED(obj) (-1 - game.prop[obj])
+
+/*
+ * MOD(N,M) = Arithmetic modulus
+ * 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(LOC) = 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)
+ * LIQUID() = 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 DESTROY(N) move(N, LOC_NOWHERE)
+#define MOD(N,M) ((N) % (M))
+#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 CNDBIT(L,N) (tstbit(conditions[L],N))
+#define LIQUID() (game.prop[BOTTLE] == WATER_BOTTLE? WATER : game.prop[BOTTLE] == OIL_BOTTLE ? OIL : NO_OBJECT )
+#define LIQLOC(LOC) (CNDBIT((LOC),COND_FLUID)? CNDBIT((LOC),COND_OILY) ? OIL : WATER : NO_OBJECT)
+#define FORCED(LOC) CNDBIT(LOC, COND_FORCED)
+#define DARK(DUMMY) (!CNDBIT(game.loc,COND_LIT) && (game.prop[LAMP] == LAMP_DARK || !HERE(LAMP)))
+#define PCT(N) (randrange(100) < (N))
+#define GSTONE(OBJ) ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
+#define FOREST(LOC) CNDBIT(LOC, COND_FOREST)
+#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC))
+#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC))
+#define BUG(x) bug(x, #x)
+#define MOTION_WORD(n) ((n) + 0)
+#define OBJECT_WORD(n) ((n) + 1000)
+#define ACTION_WORD(n) ((n) + 2000)
+#define SPECIAL_WORD(n) ((n) + 3000)
+#define PROMOTE_WORD(n) ((n) + 1000)
+#define DEMOTE_WORD(n) ((n) - 1000)
+
+enum bugtype {
+ SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST,
+ VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3,
+ INTRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,
+ TRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST,
+ CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION,
+ LOCATION_HAS_NO_TRAVEL_ENTRIES,
+ HINT_NUMBER_EXCEEDS_GOTO_LIST,
+ SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN,
+ ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH,
+};
+
+enum speaktype {touch, look, hear, study, change};
+
+enum termination {endgame, quitgame, scoregame};
+
+enum speechpart {unknown, intransitive, transitive};
+
+/* 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.
+ */
+enum phase_codes {
+ GO_TERMINATE,
+ GO_MOVE,
+ GO_TOP,
+ GO_CLEAROBJ,
+ GO_CHECKHINT,
+ GO_CHECKFOO,
+ GO_DIRECTION,
+ GO_LOOKUP,
+ GO_WORD2,
+ GO_SPECIALS,
+ GO_UNKNOWN,
+ GO_ACTION,
+ GO_DWARFWAKE,
+};
+
+typedef long token_t; // word token - someday this will be char[TOKLEN+1] */
+typedef long vocab_t; // index into a vocabulary array */
+typedef long verb_t; // index into an actions array */
+typedef long obj_t; // index into the object array */
+typedef long loc_t; // index into the locations array */