X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=main.c;h=00b8e4617b8e22e47eb61a6d974c809a451dad8e;hp=4f46c0ac8a81dc3c9f6ffda2269b1f5a963efde9;hb=f37a4135246fef3f10112bf16fda181c31178588;hpb=7740b163c86d1e16339c1f7952f9511f951dd5d3 diff --git a/main.c b/main.c index 4f46c0a..00b8e46 100644 --- a/main.c +++ b/main.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "advent.h" #include "dungeon.h" @@ -764,6 +765,7 @@ static bool closecheck(void) * problems arise from the use of negative prop numbers to suppress * the object descriptions until he's actually moved the objects. */ { + /* Don't tick game.clock1 unless well into cave (and not at Y2). */ if (game.tally == 0 && INDEEP(game.loc) && game.loc != LOC_Y2) --game.clock1; @@ -935,8 +937,10 @@ static void listobjects(void) * (so goes the rationalisation). */ } int kk = game.prop[obj]; - if (obj == STEPS && game.loc == game.fixed[STEPS]) - kk = 1; + if (obj == STEPS) + kk = (game.loc == game.fixed[STEPS]) + ? STEPS_UP + : STEPS_DOWN; pspeak(obj, look, kk, true); } } @@ -945,7 +949,6 @@ static void listobjects(void) static bool do_command() /* Get and execute a command */ { - long V1, V2; long kmod, defn; static long igo = 0; static struct command_t command; @@ -1019,16 +1022,15 @@ L2600: checkhints(); /* If closing time, check for any objects being toted with - * game.prop < 0 and set the prop to -1-game.prop. This way - * objects won't be described until they've been picked up - * and put down separate from their respective piles. Don't - * tick game.clock1 unless well into cave (and not at Y2). */ + * game.prop < 0 and stash them. This way objects won't be + * described until they've been picked up and put down + * separate from their respective piles. */ if (game.closed) { if (game.prop[OYSTER] < 0 && TOTING(OYSTER)) pspeak(OYSTER, look, 1, true); for (size_t i = 1; i <= NOBJECTS; i++) { if (TOTING(i) && game.prop[i] < 0) - game.prop[i] = -1 - game.prop[i]; + game.prop[i] = STASHED(i); } } game.wzdark = DARK(game.loc); @@ -1054,12 +1056,14 @@ L2600: strncpy(inputbuf, input, LINESIZE - 1); free(input); - long tokens[4]; - tokenize(inputbuf, tokens); - command.wd1 = tokens[0]; - command.wd1x = tokens[1]; - command.wd2 = tokens[2]; - command.wd2x = tokens[3]; + tokenize(inputbuf, &command); + + char word1[TOKLEN+1]; + char word2[TOKLEN+1]; + packed_to_token(command.wd1, word1); + packed_to_token(command.wd2, word2); + command.id1 = get_vocab_id(word1); + command.id2 = get_vocab_id(word2); /* Every input, check "game.foobar" flag. If zero, nothing's * going on. If pos, make neg. If neg, he skipped a word, @@ -1077,7 +1081,7 @@ L2607: } } - if (command.verb == SAY && command.wd2 > 0) + if (command.verb == SAY && command.id2 != WORD_NOT_FOUND && command.id2 != WORD_EMPTY) command.verb = 0; if (command.verb == SAY) { command.part = transitive; @@ -1089,14 +1093,8 @@ L2607: } else lampcheck(); - char word1[6]; - char word2[6]; - packed_to_token(command.wd1, word1); - packed_to_token(command.wd2, word2); - V1 = get_vocab_id(word1); - V2 = get_vocab_id(word2); - if (V1 == ENTER && (V2 == STREAM || - V2 == PROMOTE_WORD(WATER))) { + if (command.id1 == ENTER && (command.id2 == STREAM || + command.id2 == PROMOTE_WORD(WATER))) { if (LIQLOC(game.loc) == WATER) { rspeak(FEET_WET); } else { @@ -1104,18 +1102,19 @@ L2607: } goto L2012; } - if (V1 == ENTER && command.wd2 > 0) { - command.wd1 = command.wd2; - command.wd1x = command.wd2x; - wordclear(&command.wd2); + if (command.id1 == ENTER && command.id2 != WORD_NOT_FOUND && command.id2 != WORD_EMPTY) { + /* command.wd1 = command.wd2; */ + /* wordclear(&command.wd2); */ + command.id1 = command.id2; + command.id2 = WORD_EMPTY; } else { /* FIXME: Magic numbers related to vocabulary */ - if (!((V1 != PROMOTE_WORD(WATER) && V1 != PROMOTE_WORD(OIL)) || - (V2 != PROMOTE_WORD(PLANT) && V2 != PROMOTE_WORD(DOOR)))) { - if (AT(DEMOTE_WORD(V2))) + if (!((command.id1 != PROMOTE_WORD(WATER) && command.id1 != PROMOTE_WORD(OIL)) || + (command.id2 != PROMOTE_WORD(PLANT) && command.id2 != PROMOTE_WORD(DOOR)))) { + if (AT(DEMOTE_WORD(command.id2))) command.wd2 = token_to_packed("POUR"); } - if (V1 == PROMOTE_WORD(CAGE) && V2 == PROMOTE_WORD(BIRD) && HERE(CAGE) && HERE(BIRD)) + if (command.id1 == PROMOTE_WORD(CAGE) && command.id2 == PROMOTE_WORD(BIRD) && HERE(CAGE) && HERE(BIRD)) command.wd1 = token_to_packed("CATCH"); } L2620: @@ -1131,11 +1130,11 @@ L2620: Lookup: packed_to_token(command.wd1, word1); defn = get_vocab_id(word1); - if (defn == -1) { + if (defn == WORD_NOT_FOUND) { /* Gee, I don't understand. */ if (fallback_handler(inputbuf)) continue; - rspeak(DONT_KNOW, command.wd1, command.wd1x); + sspeak(DONT_KNOW, command.raw1); goto L2600; } /* FIXME: magic numbers related to vocabulary */ @@ -1179,13 +1178,15 @@ Laction: case GO_WORD2: /* Get second word for analysis. */ command.wd1 = command.wd2; - command.wd1x = command.wd2x; + strcpy(command.raw1, command.raw2); wordclear(&command.wd2); + command.raw2[0] = '\0'; goto L2620; case GO_UNKNOWN: /* Random intransitive verbs come here. Clear obj just in case * (see attack()). */ - rspeak(DO_WHAT, command.wd1, command.wd1x); + command.raw1[0] = toupper(command.raw1[0]); + sspeak(DO_WHAT, command.raw1); command.obj = 0; goto L2600; case GO_DWARFWAKE: