#define LCG_M 1048576L
#define LINESIZE 1024
-#define TOKLEN 5 // № sigificant characters in a token */
+#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 INVLIMIT 7 // inventory 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 STASHED(obj) (-1 - game.prop[obj])
/*
+ * DESTROY(N) = Get rid of an item by putting it in LOC_NOWHERE
* MOD(N,M) = Arithmetic modulus
+ * TOTING(OBJ) = true if the OBJ is being carried
* 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)
+ * CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit)
* LIQUID() = object number of liquid in bottle
* LIQLOC(LOC) = object number of liquid (if any) at LOC
+ * FORCED(LOC) = true if LOC moves without asking for input (COND=2)
+ * DARK(LOC) = true if location "LOC" is dark
* PCT(N) = true N% of the time (N integer from 0 to 100)
- * TOTING(OBJ) = true if the OBJ is being carried */
+ * GSTONE(OBJ) = true if OBJ is a gemstone
+ * FOREST(LOC) = true if LOC is part of the forest
+ * OUTSID(LOC) = true if location not in the cave
+ * INSIDE(LOC) = true if location is in the cave or the building at the beginning of the game
+ * INDEEP(LOC) = true if location is in the Hall of Mists or deeper
+ * BUG(X) = report bug and exit
+ */
#define DESTROY(N) move(N, LOC_NOWHERE)
#define MOD(N,M) ((N) % (M))
#define TOTING(OBJ) (game.place[OBJ] == CARRIED)
* These were at one time FORTRAN line numbers.
* The values don't matter, but perturb their order at your peril.
*/
-enum phase_codes {
+typedef enum {
GO_TERMINATE,
GO_MOVE,
GO_TOP,
GO_CLEAROBJ,
GO_CHECKHINT,
- GO_CHECKFOO,
- GO_LOOKUP,
GO_WORD2,
GO_UNKNOWN,
GO_DWARFWAKE,
-};
+} phase_codes_t;
typedef long vocab_t; // index into a vocabulary array */
typedef long verb_t; // index into an actions array */
word_type_t type;
} command_word_t;
+typedef enum {EMPTY, RAW, TOKENIZED, GIVEN, PREPROCESSED, PROCESSING, EXECUTED} command_state_t;
+
typedef struct {
enum speechpart part;
command_word_t word[2];
verb_t verb;
- obj_t obj;
+ obj_t obj;
+ command_state_t state;
} command_t;
extern struct game_t game;
extern struct settings_t settings;
extern bool get_command_input(command_t *);
+extern void clear_command(command_t *);
extern void speak(const char*, ...);
extern void sspeak(int msg, ...);
-extern void pspeak(vocab_t, enum speaktype, int, bool, ...);
+extern void pspeak(vocab_t, enum speaktype, bool, int, ...);
extern void rspeak(vocab_t, ...);
extern void echo_input(FILE*, const char*, const char*);
extern bool silent_yes(void);
extern int resume(void);
extern int restore(FILE *);
extern long initialise(void);
-extern int action(command_t command);
+extern phase_codes_t action(command_t);
extern void state_change(obj_t, int);
extern bool is_valid(struct game_t);