#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) ((!tstbit(conditions[game.loc],COND_LIT)) && (game.prop[LAMP] == LAMP_DARK || !HERE(LAMP)))
+#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 INSIDE(LOC) (!OUTSID(LOC) || LOC == LOC_BUILDING)
#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,
enum speechpart {unknown, intransitive, transitive};
+enum wordtype {NO_WORD_TYPE, MOTION, OBJECT, ACTION, SPECIAL};
+
+typedef enum scorebonus {none, splatter, defeat, victory} score_t;
+
/* 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.
GO_TOP,
GO_CLEAROBJ,
GO_CHECKHINT,
- GO_CHECKFOO,
GO_DIRECTION,
- GO_LOOKUP,
GO_WORD2,
GO_SPECIALS,
GO_UNKNOWN,
struct game_t {
unsigned long lcg_a, lcg_c, lcg_m, lcg_x;
- long abbnum; // How often to print non-abbreviated descriptions
- long bonus;
+ long abbnum; // How often to print long descriptions
+ score_t bonus; // What kind of finishing bonus we are getting
long chloc;
long chloc2;
long clock1; // # turns from finding last treasure till closing
bool clshnt; // has player read the clue in the endgame?
bool closed; // whether we're all the way closed
bool closng; // whether it's closing time yet
- long conds; // min value for cond(loc) if loc has any hints
+ long conds; // min value for cond[loc] if loc has any hints
long detail;
/* dflag controls the level of activation of dwarves:
long dtotal;
long foobar; // current progress in saying "FEE FIE FOE FOO".
long holdng; // number of objects being carried
+ long igo; // How many times he's said "go" instead of the direction
long iwest; // How many times he's said "west" instead of "w"
long knfloc; // 0 if no knife here, loc if knife , -1 after caveat
long limit; // lifetime of lamp (not set here)
long oldloc;
long oldlc2;
long oldobj;
- bool panic; // has player found out he's trapped in the cave?
+ bool panic; // has player found out he's trapped?
long saved; // point penalty for saves
long tally;
long thresh;
long trndex;
- long trnluz; // № points lost so far due to number of turns used
- long turns; // how many commands he's given (ignores yes/no)
+ long trnluz; // # points lost so far due to turns used
+ long turns; // counts commands given (ignores yes/no)
bool wzdark; // whether the loc he's leaving was dark
char zzword[TOKLEN + 1]; // randomly generated magic word from bird
bool blooded; // has player drunk of dragon's blood?
long abbrev[NLOCATIONS + 1];
long atloc[NLOCATIONS + 1];
long dseen[NDWARVES + 1]; // true if dwarf has seen him
- loc_t dloc[NDWARVES + 1]; // location of dwarves, initially hard-wired in
- loc_t odloc[NDWARVES + 1]; // prior loc of each dwarf, initially garbage
+ loc_t dloc[NDWARVES + 1]; // location of dwarves, initially hard-wired in
+ loc_t odloc[NDWARVES + 1]; // prior loc of each dwarf, initially garbage
loc_t fixed[NOBJECTS + 1];
long link[NOBJECTS * 2 + 1];
loc_t place[NOBJECTS + 1];
- long hinted[NHINTS]; // hintlc[i] is how long he's been at LOC with cond bit i
- long hintlc[NHINTS]; // hinted[i] is true iff hint i has been used.
+ long hinted[NHINTS]; // hinted[i] = true iff hint i has been used.
+ long hintlc[NHINTS]; // hintlc[i] = how long at LOC with cond bit i
+
long prop[NOBJECTS + 1];
};
enum speechpart part;
verb_t verb;
obj_t obj;
- token_t wd1;
- token_t wd2;
- long id1;
- long id2;
+ token_t id1;
+ token_t id2;
char raw1[LINESIZE], raw2[LINESIZE];
+ enum wordtype type1;
+ enum wordtype type2;
};
extern struct game_t game;
extern struct settings_t settings;
-extern void packed_to_token(long, char token[]);
-extern long token_to_packed(const char token[]);
-extern void tokenize(char*, struct command_t *);
-extern void vspeak(const char*, bool, va_list);
-extern bool wordeq(token_t, token_t);
-extern bool wordempty(token_t);
+extern bool get_command_input(struct command_t *);
extern void wordclear(token_t *);
extern void speak(const char*, ...);
extern void sspeak(long msg, ...);
extern void pspeak(vocab_t, enum speaktype, int, bool, ...);
extern void rspeak(vocab_t, ...);
extern void echo_input(FILE*, const char*, const char*);
-extern int word_count(char*);
-extern char* get_input(void);
extern bool silent_yes(void);
extern bool yes(const char*, const char*, const char*);
-extern int get_motion_vocab_id(const char*);
-extern int get_object_vocab_id(const char*);
-extern int get_action_vocab_id(const char*);
-extern int get_special_vocab_id(const char*);
-extern long get_vocab_id(const char*);
extern void juggle(obj_t);
extern void move(obj_t, loc_t);
extern long put(obj_t, long, long);