X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=misc.c;h=ae5048d9a92825b948f770c4b218f9f83559abc8;hp=cef36519e82e5d9d250da92e4784373b234f8461;hb=08c40bc9993ce5684077b9ceac492e4fb642a722;hpb=551838cea217e3d9df11dcaea52c42b02449de91 diff --git a/misc.c b/misc.c index cef3651..ae5048d 100644 --- a/misc.c +++ b/misc.c @@ -128,16 +128,6 @@ void tokenize(char* raw, struct command_t *cmd) /* Hide the fact that wods are corrently packed longs */ -bool wordeq(token_t a, token_t b) -{ - return a == b; -} - -bool wordempty(token_t a) -{ - return a == 0; -} - void wordclear(token_t *v) { *v = 0; @@ -145,7 +135,7 @@ void wordclear(token_t *v) /* I/O routines (speak, pspeak, rspeak, sspeak, get_input, yes) */ -void vspeak(const char* msg, bool blank, va_list ap) +static void vspeak(const char* msg, bool blank, va_list ap) { // Do nothing if we got a null pointer. if (msg == NULL) @@ -171,8 +161,17 @@ void vspeak(const char* msg, bool blank, va_list ap) long previous_arg = 0; for (int i = 0; i < msglen; i++) { if (msg[i] != '%') { - *renderp++ = msg[i]; - size--; + /* Ugh. Least obtrusive way to deal with artifacts "on the floor" + * being dropped outside of both cave and building. */ + if (strncmp(msg + i, "floor", 5) == 0 && strchr(" .", msg[i + 5]) && !INSIDE(game.loc)) { + strcpy(renderp, "ground"); + renderp += 6; + i += 4; + size -= 5; + } else { + *renderp++ = msg[i]; + size--; + } } else { long arg = va_arg(ap, long); if (arg == -1) @@ -463,7 +462,7 @@ int get_motion_vocab_id(const char* word) { for (int i = 0; i < NMOTIONS; ++i) { for (int j = 0; j < motions[i].words.n; ++j) { - if (strcasecmp(word, motions[i].words.strs[j]) == 0 && (strlen(word) > 1 || + if (strncasecmp(word, motions[i].words.strs[j], TOKLEN) == 0 && (strlen(word) > 1 || strchr(ignore, word[0]) == NULL || !settings.oldstyle)) return (i); @@ -478,7 +477,7 @@ int get_object_vocab_id(const char* word) { for (int i = 0; i < NOBJECTS + 1; ++i) { // FIXME: the + 1 should go when 1-indexing for objects is removed for (int j = 0; j < objects[i].words.n; ++j) { - if (strcasecmp(word, objects[i].words.strs[j]) == 0) + if (strncasecmp(word, objects[i].words.strs[j], TOKLEN) == 0) return (i); } } @@ -491,7 +490,7 @@ int get_action_vocab_id(const char* word) { for (int i = 0; i < NACTIONS; ++i) { for (int j = 0; j < actions[i].words.n; ++j) { - if (strcasecmp(word, actions[i].words.strs[j]) == 0 && (strlen(word) > 1 || + if (strncasecmp(word, actions[i].words.strs[j], TOKLEN) == 0 && (strlen(word) > 1 || strchr(ignore, word[0]) == NULL || !settings.oldstyle)) return (i); @@ -506,7 +505,7 @@ int get_special_vocab_id(const char* word) { for (int i = 0; i < NSPECIALS; ++i) { for (int j = 0; j < specials[i].words.n; ++j) { - if (strcasecmp(word, specials[i].words.strs[j]) == 0) + if (strncasecmp(word, specials[i].words.strs[j], TOKLEN) == 0) return (i); } } @@ -514,37 +513,55 @@ int get_special_vocab_id(const char* word) return (WORD_NOT_FOUND); } -long get_vocab_id(const char* word) -// Search the vocab categories in order for the supplied word. +void get_vocab_metadata(const char* word, long* id, enum wordtype* type) { /* Check for an empty string */ - if (strncmp(word, "", sizeof("")) == 0) - return (WORD_EMPTY); + if (strncmp(word, "", sizeof("")) == 0) { + *id = WORD_EMPTY; + *type = NO_WORD_TYPE; + return; + } long ref_num; - /* FIXME: Magic numbers related to vocabulary */ ref_num = get_motion_vocab_id(word); - if (ref_num != WORD_NOT_FOUND) - return MOTION_WORD(ref_num); + if (ref_num != WORD_NOT_FOUND) { + *id = ref_num; + *type = MOTION; + return; + } ref_num = get_object_vocab_id(word); - if (ref_num != WORD_NOT_FOUND) - return OBJECT_WORD(ref_num); + if (ref_num != WORD_NOT_FOUND) { + *id = ref_num; + *type = OBJECT; + return; + } ref_num = get_action_vocab_id(word); - if (ref_num != WORD_NOT_FOUND) - return ACTION_WORD(ref_num); + if (ref_num != WORD_NOT_FOUND) { + *id = ref_num; + *type = ACTION; + return; + } ref_num = get_special_vocab_id(word); - if (ref_num != WORD_NOT_FOUND) - return SPECIAL_WORD(ref_num); + if (ref_num != WORD_NOT_FOUND) { + *id = ref_num; + *type = SPECIAL; + return; + } // Check for the reservoir magic word. - if (strcasecmp(word, game.zzword) == 0) - return ACTION_WORD(PART); + if (strcasecmp(word, game.zzword) == 0) { + *id = PART; + *type = ACTION; + return; + } - return (WORD_NOT_FOUND); + *id = WORD_NOT_FOUND; + *type = NO_WORD_TYPE; + return; } void juggle(obj_t object) @@ -571,7 +588,8 @@ void move(obj_t object, loc_t where) from = game.fixed[object - NOBJECTS]; else from = game.place[object]; - if (from != LOC_NOWHERE && from != CARRIED && !SPECIAL(from)) + /* (ESR) Used to check for !SPECIAL(from). I *think* that was wrong... */ + if (from != LOC_NOWHERE && from != CARRIED) carry(object, from); drop(object, where); }