-extern void score(long);
-
-/* vocabulary items */
-extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
- 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,
- RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY, SECT, SIGN, SNAKE,
- STEPS, STICK, STREAM, THROW, TRIDNT, TROLL, TROLL2,
- URN, VASE, VEND, VOLCAN, WATER;
-/* evrything else */
-extern long I, J, K, L, SPK, V1, V2, VRSION, WD1, WD1X, WD2, WD2X;
+extern long score(enum termination);
+extern void terminate(enum termination) __attribute__((noreturn));
+extern int savefile(FILE *, long);
+extern int suspend(void);
+extern int resume(void);
+extern int restore(FILE *);
+
+/*
+ * 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 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(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] == 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 SPECIAL(LOC) ((LOC) > SPECIALBASE)
+#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC))
+
+#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC))
+
+enum speechpart {unknown, intransitive, transitive};
+
+struct command_t {
+ enum speechpart part;
+ vocab_t verb;
+ vocab_t obj;
+ token_t wd1, wd1x;
+ token_t wd2, wd2x;
+};