X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=main.c;h=a558f7eb21100751c726778d0ae2acd1bcfc5659;hp=61f75850d6a1ef36f7d9a36d2ddbbcf34a9f85ba;hb=fb86d64b20f05e5a2920ba76fb908486c8a67ba0;hpb=e696fed6dbd36555548aba77fb754d87f282a564 diff --git a/main.c b/main.c index 61f7585..a558f7e 100644 --- a/main.c +++ b/main.c @@ -898,7 +898,7 @@ static void lampcheck(void) * lamp give out. When it gets close, we come here to warn him. * First following arm checks if the lamp and fresh batteries are * here, in which case we replace the batteries and continue. - * Second is for other cases of lamp dying. Eve after it goes + * Second is for other cases of lamp dying. Even after it goes * out, he can explore outside for a while if desired. */ if (game.limit <= WARNTIME) { if (HERE(BATTERY) && game.prop[BATTERY] == FRESH_BATTERIES && HERE(LAMP)) { @@ -1123,29 +1123,43 @@ Lclosecheck: } if (command.id1 == ENTER && command.id2 != WORD_NOT_FOUND && command.id2 != WORD_EMPTY) { command.id1 = command.id2; + command.type1 = command.type2; + strncpy(command.raw1, command.raw2, LINESIZE - 1); command.id2 = WORD_EMPTY; + command.type2 = NO_WORD_TYPE; + strncpy(command.raw2, "", LINESIZE - 1); } else { if (!((command.id1 != WATER && command.id1 != OIL) || (command.id2 != PLANT && command.id2 != DOOR))) { if (AT(command.id2)) + { + command.id2 = POUR; + command.type2 = ACTION; + strncpy(command.raw2, "POUR", LINESIZE - 1); command.wd2 = token_to_packed("POUR"); + } } if (command.id1 == CAGE && command.id2 == BIRD && HERE(CAGE) && HERE(BIRD)) + { + command.id1 = CARRY; + command.type1 = ACTION; + strncpy(command.raw2, "CATCH", LINESIZE - 1); command.wd1 = token_to_packed("CATCH"); + } } Lookup: if (strncasecmp(command.raw1, "west", sizeof("west")) == 0) { if (++game.iwest == 10) rspeak(W_IS_WEST); } - if (strncasecmp(command.raw1, "go", sizeof("go")) == 0 && !wordempty(command.wd2)) { + if (strncasecmp(command.raw1, "go", sizeof("go")) == 0 && command.id2 != WORD_EMPTY) { if (++game.igo == 10) rspeak(GO_UNNEEDED); } packed_to_token(command.wd1, word1); - long defn; - enum wordtype type; - get_vocab_metadata(word1, &defn, &type); - if (defn == WORD_NOT_FOUND) { + long defn; + enum wordtype type; + get_vocab_metadata(word1, &defn, &type); + if (command.id1 == WORD_NOT_FOUND) { if (fallback_handler(command)) continue; /* Gee, I don't understand. */ @@ -1155,18 +1169,18 @@ Lookup: switch (type) { case NO_WORD_TYPE: // FIXME: treating NO_WORD_TYPE as a motion word is confusing case MOTION: - playermove(defn); + playermove(command.id1); return true; case OBJECT: command.part = unknown; - command.obj = defn; + command.obj = command.id1; break; case ACTION: command.part = intransitive; command.verb = defn; break; case SPECIAL: - speak(specials[defn].message); + speak(specials[command.id1].message); goto Lclearobj; default: BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3); // LCOV_EXCL_LINE @@ -1186,10 +1200,14 @@ Lookup: goto Lookup; case GO_WORD2: /* Get second word for analysis. */ - command.wd1 = command.wd2; - strncpy(command.raw1, command.raw2, LINESIZE - 1); + command.id1 = command.id2; + command.type1 = command.type2; + strncpy(command.raw1, command.raw2, LINESIZE - 1); + command.wd1 = command.wd2; + command.id2 = WORD_EMPTY; + command.type2 = NO_WORD_TYPE; + command.raw2[0] = '\0'; wordclear(&command.wd2); - command.raw2[0] = '\0'; goto Lookup; case GO_UNKNOWN: /* Random intransitive verbs come here. Clear obj just in case