X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=misc.c;h=a2626b4d3f02ae66ea69ed4dbf99c4c1939debe0;hp=36deef454c2c332f075c30558f313c8c42fb4aa1;hb=c35cf999660d640bcf839792fa280855cf45c31b;hpb=f37a4135246fef3f10112bf16fda181c31178588 diff --git a/misc.c b/misc.c index 36deef4..a2626b4 100644 --- a/misc.c +++ b/misc.c @@ -102,6 +102,28 @@ void tokenize(char* raw, struct command_t *cmd) // pack the substrings cmd->wd1 = token_to_packed(cmd->raw1); cmd->wd2 = token_to_packed(cmd->raw2); + + /* (ESR) In oldstyle mode, simulate the uppercasing and truncating + * effect on raw tokens of packing them into sixbit characters, 5 + * to a 32-bit word. This is something the FORTRAN version did + * becuse archaic FORTRAN had no string types. Don Wood's + * mechanical translation of 2.5 to C retained the packing and + * thus this misfeature. + * + * It's philosophically questionable whether this is the right + * thing to do even in oldstyle mode. On one hand, the text + * mangling was not authorial intent, but a result of limitations + * in their tools. On the other, not simulating this misbehavior + * goes against the goal of making oldstyle as accurate as + * possible an emulation of the original UI. + */ + if (settings.oldstyle) { + cmd->raw1[TOKLEN + TOKLEN] = cmd->raw2[TOKLEN + TOKLEN] = '\0'; + for (size_t i = 0; i < strlen(cmd->raw1); i++) + cmd->raw1[i] = toupper(cmd->raw1[i]); + for (size_t i = 0; i < strlen(cmd->raw2); i++) + cmd->raw2[i] = toupper(cmd->raw2[i]); + } } /* Hide the fact that wods are corrently packed longs */ @@ -329,11 +351,10 @@ char* get_input() bool silent_yes() { - char* reply; bool outcome; for (;;) { - reply = get_input(); + char* reply = get_input(); if (reply == NULL) { // LCOV_EXCL_START // Should be unreachable. Reply should never be NULL @@ -376,13 +397,12 @@ bool yes(const char* question, const char* yes_response, const char* no_response /* Print message X, wait for yes/no answer. If yes, print Y and return true; * if no, print Z and return false. */ { - char* reply; bool outcome; for (;;) { speak(question); - reply = get_input(); + char* reply = get_input(); if (reply == NULL) { // LCOV_EXCL_START // Should be unreachable. Reply should never be NULL @@ -494,23 +514,23 @@ long get_vocab_id(const char* word) /* FIXME: Magic numbers related to vocabulary */ ref_num = get_motion_vocab_id(word); if (ref_num != WORD_NOT_FOUND) - return (ref_num + 0); // FIXME: replace with a proper hash + return MOTION_WORD(ref_num); ref_num = get_object_vocab_id(word); if (ref_num != WORD_NOT_FOUND) - return (ref_num + 1000); // FIXME: replace with a proper hash + return OBJECT_WORD(ref_num); ref_num = get_action_vocab_id(word); if (ref_num != WORD_NOT_FOUND) - return (ref_num + 2000); // FIXME: replace with a proper hash + return ACTION_WORD(ref_num); ref_num = get_special_vocab_id(word); if (ref_num != WORD_NOT_FOUND) - return (ref_num + 3000); // FIXME: replace with a proper hash + return SPECIAL_WORD(ref_num); // Check for the reservoir magic word. if (strcasecmp(word, game.zzword) == 0) - return (PART + 2000); // FIXME: replace with a proper hash + return ACTION_WORD(PART); return (WORD_NOT_FOUND); }