#include <stdbool.h>
#include <stdarg.h>
-#include "common.h"
#include "newdb.h"
#define LINESIZE 100
#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. */
typedef long token_t; /* word token - someday this will be char[TOKLEN+1] */
typedef long vocab_t; /* index into a vocabulary array */
+extern const char advent_to_ascii[128];
+extern const char ascii_to_advent[128];
+extern const char new_advent_to_ascii[64];
+extern const char new_ascii_to_advent[128];
+
+enum bugtype {
+ TOO_MANY_VOCABULARY_WORDS, // 4
+ REQUIRED_VOCABULARY_WORD_NOT_FOUND, // 5
+ INVALID_SECTION_NUMBER_IN_DATABASE, // 9
+ SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST = 20, // 20
+ RAN_OFF_END_OF_VOCABULARY_TABLE, // 21
+ VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3, // 22
+ INTRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST, // 23
+ TRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST, // 24
+ CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION, // 25
+ LOCATION_HAS_NO_TRAVEL_ENTRIES, // 26
+ HINT_NUMBER_EXCEEDS_GOTO_LIST, // 27
+ TOO_MANY_PARAMETERS_GIVEN_TO_SETPRM, // 28
+ SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN=99, // 99
+ ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH, // 100
+};
+
+/* Alas, declaring this static confuses the coverage analyzer */
+void bug(enum bugtype, const char *) __attribute__((__noreturn__));
+#define BUG(x) bug(x, #x)
+
struct game_t {
unsigned long lcg_a, lcg_c, lcg_m, lcg_x;
long abbnum; /* How often to print non-abbreviated descriptions */
long trnluz; /* # points lost so far due to number of turns used */
long turns; /* how many commands he's given (ignores yes/no) */
bool wzdark; /* whether the loc he's leaving was dark */
- long zzword;
+ char zzword[6];
bool blooded; /* has player drunk of dragon's blood? */
long abbrev[NLOCATIONS + 1];
long atloc[NLOCATIONS + 1];
extern FILE *logfp;
extern bool oldstyle, editline, prompt;
-enum speaktype {touch, look, hear, study};
+enum speaktype {touch, look, hear, study, change};
/* b is not needed for POSIX but harmless */
#define READ_MODE "rb"
#define WRITE_MODE "wb"
+extern char* xstrdup(const char* s);
extern void* xmalloc(size_t size);
extern void packed_to_token(long, char token[]);
-extern void token_to_packed(char token[], long*);
+extern long token_to_packed(const char token[6]);
+extern void tokenize(char*, long tokens[4]);
extern void vspeak(const char*, va_list);
extern bool wordeq(token_t, token_t);
extern bool wordempty(token_t);
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 int word_count(char*);
extern char* get_input(void);
+extern bool silent_yes(void);
extern bool yes(const char*, const char*, const char*);
extern long GETTXT(bool, bool, bool);
extern token_t MAKEWD(long);
extern long vocab(long, long);
+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(long);
extern void move(long, long);
extern long put(long, long, long);
extern long setbit(long);
extern bool tstbit(long, int);
extern long rndvoc(long, long);
+extern void make_zzword(char*);
extern bool MAPLIN(FILE *);
extern void datime(long*, long*);
extern long randrange(long);
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 *);
#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 VOCWRD(LETTRS,SECT) (vocab(MAKEWD(LETTRS),SECT))
#define SPECIAL(LOC) ((LOC) > SPECIALBASE)
#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC))
#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC))
-/* vocabulary items */
-extern long AMBER, ATTACK, AXE, BACK, BATTERY, BEAR,
- BIRD, BLOOD, BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
- CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
- EMERALD, ENTER, ENTRNC, FIND, FISSURE, FOOD, GRATE, HINT, INVENT,
- JADE, KEYS, KNIFE, LAMP, LOCK, LOOK, MAGAZINE, MESSAG, MIRROR, NUGGET, NUL,
- OGRE, OIL, OYSTER, PANIC, PEARL, PILLOW, PLANT, PLANT2, PYRAMID,
- RESER, ROD, ROD2, RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
- STEPS, STICK, STREAM, THROW, TRIDENT, TROLL, TROLL2,
- URN, VASE, VEND, VOLCANO, WATER;
-
enum speechpart {unknown, intransitive, transitive};
struct command_t {
};
void initialise(void);
-int action(FILE *input, struct command_t *command);
+int action(struct command_t *command);
/* Phase codes for action returns.
* These were at one time FORTRAN line numbers.
* left in misc.c, is the only place left in the runtime that knows about
* word packing.
*/
-#define WORD_AXE 12405
-#define WORD_BATTERY 201202005
-#define WORD_BEAR 2050118
-#define WORD_BIRD 2091804
-#define WORD_BLOOD 212151504
-#define WORD_BOTTLE 215202012
-#define WORD_CAGE 3010705
#define WORD_CATCH 301200308
-#define WORD_CAVITY 301220920
-#define WORD_CHASM 308011913
-#define WORD_CLAM 3120113
-#define WORD_DOOR 4151518
-#define WORD_DRAGON 418010715
-#define WORD_DWARF 423011806
-#define WORD_FISSURE 609191921
-#define WORD_FOOD 6151504
#define WORD_GO 715
-#define WORD_GRATE 718012005
-#define WORD_KEYS 11052519
-#define WORD_KNIFE 1114090605
-#define WORD_LAMP 12011316
-#define WORD_MAGAZINE 1301070126
-#define WORD_MESSAG 1305191901
-#define WORD_MIRROR 1309181815
-#define WORD_OGRE 15071805
-#define WORD_OIL 150912
-#define WORD_OYSTER 1525192005
-#define WORD_PILLOW 1609121215
-#define WORD_PLANT 1612011420
#define WORD_POUR 16152118
-#define WORD_RESER 1805190518
-#define WORD_ROD 181504
-#define WORD_SIGN 19090714
-#define WORD_SNAKE 1914011105
-#define WORD_STEPS 1920051619
-#define WORD_TROLL 2018151212
-#define WORD_URN 211814
-#define WORD_VEND 1755140409
-#define WORD_VOLCANO 1765120301
-#define WORD_WATER 1851200518
-#define WORD_AMBER 113020518
-#define WORD_CHAIN 308010914
-#define WORD_CHEST 308051920
-#define WORD_COINS 315091419
-#define WORD_EGGS 5070719
-#define WORD_EMERALD 513051801
-#define WORD_JADE 10010405
-#define WORD_NUGGET 7151204
-#define WORD_PEARL 1605011812
-#define WORD_PYRAMID 1625180113
-#define WORD_RUBY 18210225
-#define WORD_RUG 182107
-#define WORD_SAPPH 1901161608
-#define WORD_TRIDENT 2018090405
-#define WORD_VASE 22011905
#define WORD_BACK 2010311
#define WORD_CAVE 3012205
#define WORD_DPRSSN 405161805