#include <getopt.h>
#include <signal.h>
#include <string.h>
+#include <ctype.h>
#include "advent.h"
#include "dungeon.h"
* him, so we need game.oldlc2, which is the last place he was
* safe.) */
-static bool playermove( int motion)
+static void playermove( int motion)
{
int scratchloc, travel_entry = tkey[game.loc];
game.newloc = game.loc;
if (travel_entry == 0)
BUG(LOCATION_HAS_NO_TRAVEL_ENTRIES); // LCOV_EXCL_LINE
if (motion == NUL)
- return true;
+ return;
else if (motion == BACK) {
/* Handle "go back". Look for verb which goes from game.loc to
* game.oldloc, or to game.oldlc2 If game.oldloc has forced-motion.
travel_entry = te_tmp;
if (travel_entry == 0) {
rspeak(NOT_CONNECTED);
- return true;
+ return;
}
}
}
} else {
rspeak(spk);
- return true;
+ return;
}
} else if (motion == LOOK) {
/* Look. Can't give more detail. Pretend it wasn't dark
++game.detail;
game.wzdark = false;
game.abbrev[game.loc] = 0;
- return true;
+ return;
} else if (motion == CAVE) {
/* Cave. Different messages depending on whether above ground. */
rspeak((OUTSID(game.loc) && game.loc != LOC_GRATE) ? FOLLOW_STREAM : NEED_DETAIL);
- return true;
+ return;
} else {
/* none of the specials */
game.oldlc2 = game.oldloc;
if (motion == CRAWL)
spk = WHICH_WAY;
rspeak(spk);
- return true;
+ return;
}
++travel_entry;
}
/* Found an eligible rule, now execute it */
game.newloc = travel[travel_entry].dest;
if (!SPECIAL(game.newloc))
- return true;
+ return;
if (game.newloc > 500) {
/* Execute a speak rule */
rspeak(L_SPEAK(game.newloc));
game.newloc = game.loc;
- return true;
+ return;
} else {
game.newloc -= SPECIALBASE;
switch (game.newloc) {
game.newloc = game.loc;
rspeak(MUST_DROP);
}
- return true;
+ return;
case 2:
/* Travel 302. Plover transport. Drop the
* emerald (only use special travel if toting
move(TROLL + NOBJECTS, objects[TROLL].fixd);
juggle(CHASM);
game.newloc = game.loc;
- return true;
+ return;
} else {
game.newloc = objects[TROLL].plac + objects[TROLL].fixd - game.loc;
if (game.prop[TROLL] == TROLL_UNPAID)
game.prop[TROLL] = TROLL_PAIDONCE;
if (!TOTING(BEAR))
- return true;
+ return;
rspeak(BRIDGE_COLLAPSE);
game.prop[CHASM] = BRIDGE_WRECKED;
game.prop[TROLL] = TROLL_GONE;
game.prop[BEAR] = BEAR_DEAD;
game.oldlc2 = game.newloc;
croak();
- return true;
+ return;
}
default:
BUG(SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE
static bool do_command()
/* Get and execute a command */
{
- long V1, V2;
long kmod, defn;
static long igo = 0;
static struct command_t command;
rspeak(TAME_BEAR);
speak(msg);
if (FORCED(game.loc)) {
- if (playermove(HERE))
- return true;
- else
- continue; /* back to top of main interpreter loop */
+ playermove(HERE);
+ return true;
}
if (game.loc == LOC_Y2 && PCT(25) && !game.closng)
rspeak(SAYS_PLUGH);
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,
}
}
- 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;
} 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 {
}
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:
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 */
kmod = MOD(defn, 1000);
switch (defn / 1000) {
case 0:
- if (playermove(kmod))
- return true;
- else
- continue; /* back to top of main interpreter loop */
+ playermove(kmod);
+ return true;
case 1:
command.part = unknown;
command.obj = kmod;
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: