/* 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;
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)
bool silent_yes()
{
- bool outcome;
+ bool outcome = false;
for (;;) {
char* reply = get_input();
exit(EXIT_SUCCESS);
// LCOV_EXCL_STOP
}
+ if (strlen(reply) == 0) {
+ free(reply);
+ rspeak(PLEASE_ANSWER);
+ continue;
+ }
char* firstword = (char*) xmalloc(strlen(reply) + 1);
sscanf(reply, "%s", firstword);
/* Print message X, wait for yes/no answer. If yes, print Y and return true;
* if no, print Z and return false. */
{
- bool outcome;
+ bool outcome = false;
for (;;) {
speak(question);
// LCOV_EXCL_STOP
}
+ if (strlen(reply) == 0) {
+ free(reply);
+ rspeak(PLEASE_ANSWER);
+ continue;
+ }
+
char* firstword = (char*) xmalloc(strlen(reply) + 1);
sscanf(reply, "%s", firstword);
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)
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);
}