X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=advent.h;h=4808dafeb9fac22e72db5156ca4d4e8ac66cd0c6;hp=232032eeea012d766320957ca429d3e03152652b;hb=a727aebdfa8b067de642f9bfc17cf581d1682487;hpb=87452af44895728466a9a62de95a0e81863b6cfd diff --git a/advent.h b/advent.h index 232032e..4808daf 100644 --- a/advent.h +++ b/advent.h @@ -13,11 +13,11 @@ #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 @@ -46,18 +46,24 @@ #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) @@ -102,15 +108,16 @@ typedef enum scorebonus {none, splatter, defeat, victory} score_t; * 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_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 */ @@ -195,20 +202,24 @@ typedef struct { 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); @@ -230,9 +241,9 @@ extern int suspend(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 *valgame); +extern bool is_valid(struct game_t); void bug(enum bugtype, const char *) __attribute__((__noreturn__));