* fixed), move rug there (not fixed), and move him there,
* too. Then do a null motion to get new description. */
rspeak(BARE_HANDS_QUERY);
- if (!silent_yes()) {
+ if (!silent_yes_or_no()) {
speak(arbitrary_messages[NASTY_DRAGON]);
return GO_MOVE;
}
}
static phase_codes_t bigwords(vocab_t id)
-/* FEE FIE FOE FOO (AND FUM). Advance to next state if given in proper order.
- * Look up foo in special section of vocab to determine which word we've got.
- * Last word zips the eggs back to the giant room (unless already there). */
+/* Only called on FEE FIE FOE FOO (AND FUM). Advance to next state if given
+ * in proper order. Look up foo in special section of vocab to determine which
+ * word we've got. Last word zips the eggs back to the giant room (unless
+ * already there). */
{
if ((game.foobar == WORD_EMPTY && id == FEE) ||
(game.foobar == FEE && id == FIE) ||
(TOTING(EGGS) && game.loc == objects[EGGS].plac)) {
rspeak(NOTHING_HAPPENS);
return GO_CLEAROBJ;
+ } else if (id == FUM) {
+ goto fum;
} else {
/* Bring back troll if we steal the eggs back from him before
* crossing. */
return GO_CLEAROBJ;
}
} else {
+fum:
if (game.loc == LOC_GIANTROOM) {
rspeak(START_OVER);
} else {
- /* This is new begavior in Open Adventure - sounds better when
+ /* This is new behavior in Open Adventure - sounds better when
* player isn't in the Giant Room. */
- rspeak(WELL_POINTLESS);
+ rspeak(NOTHING_HAPPENS);
}
game.foobar = WORD_EMPTY;
return GO_CLEAROBJ;
rspeak(RUG_NOTHING1);
return GO_CLEAROBJ;
}
- game.oldlc2 = game.oldloc;
- game.oldloc = game.loc;
- if (game.prop[SAPPH] == STATE_NOTFOUND) {
- game.newloc = game.place[SAPPH];
+ if (game.loc == LOC_CLIFF) {
+ game.oldlc2 = game.oldloc;
+ game.oldloc = game.loc;
+ game.newloc = LOC_LEDGE;
rspeak(RUG_GOES);
- } else {
+ } else if (game.loc == LOC_LEDGE) {
+ game.oldlc2 = game.oldloc;
+ game.oldloc = game.loc;
game.newloc = LOC_CLIFF;
rspeak(RUG_RETURNS);
+ } else {
+// LCOV_EXCL_START
+ /* should never happen */
+ rspeak(NOTHING_HAPPENS);
+// LCOV_EXCL_STOP
}
return GO_TERMINATE;
}
static phase_codes_t listen(void)
/* Listen. Intransitive only. Print stuff based on object sound proprties. */
{
+ bool soundlatch = false;
vocab_t sound = locations[game.loc].sound;
if (sound != SILENT) {
rspeak(sound);
if (!locations[game.loc].loud)
rspeak(NO_MESSAGE);
- return GO_CLEAROBJ;
+ soundlatch = true;
}
for (obj_t i = 1; i <= NOBJECTS; i++) {
if (!HERE(i) ||
rspeak(NO_MESSAGE);
if (i == BIRD && mi == BIRD_ENDSTATE)
DESTROY(BIRD);
- return GO_CLEAROBJ;
+ soundlatch = true;
}
- rspeak(ALL_SILENT);
+ if (!soundlatch)
+ rspeak(ALL_SILENT);
return GO_CLEAROBJ;
}
case CLAM:
if (verb == LOCK)
rspeak(HUH_MAN);
+ else if (TOTING(CLAM))
+ rspeak(DROP_CLAM);
else if (!TOTING(TRIDENT))
rspeak(CLAM_OPENER);
else {
static phase_codes_t quit(void)
/* Quit. Intransitive only. Verify intent and exit if that's what he wants. */
{
- if (yes(arbitrary_messages[REALLY_QUIT], arbitrary_messages[OK_MAN], arbitrary_messages[OK_MAN]))
+ if (yes_or_no(arbitrary_messages[REALLY_QUIT], arbitrary_messages[OK_MAN], arbitrary_messages[OK_MAN]))
terminate(quitgame);
return GO_CLEAROBJ;
}
if (DARK(game.loc)) {
sspeak(NO_SEE, command.word[0].raw);
- } else if (command.obj == OYSTER && !game.clshnt && game.closed) {
- game.clshnt = yes(arbitrary_messages[CLUE_QUERY], arbitrary_messages[WAYOUT_CLUE], arbitrary_messages[OK_MAN]);
+ } else if (command.obj == OYSTER) {
+ if (!TOTING(OYSTER) || !game.closed) {
+ rspeak(DONT_UNDERSTAND);
+ } else if (!game.clshnt) {
+ game.clshnt = yes_or_no(arbitrary_messages[CLUE_QUERY], arbitrary_messages[WAYOUT_CLUE], arbitrary_messages[OK_MAN]);
+ } else {
+ pspeak(OYSTER, hear, true, 1); // Not really a sound, but oh well.
+ }
} else if (objects[command.obj].texts[0] == NULL ||
game.prop[command.obj] == STATE_NOTFOUND) {
speak(actions[command.verb].message);
return GO_MOVE;
}
-static phase_codes_t throw (command_t command)
+static phase_codes_t throwit(command_t command)
/* Throw. Same as discard unless axe. Then same as attack except
* ignore bird, and if dwarf is present then one might be killed.
* (Only way to do so!) Axe also special for dragon, bear, and
/* FALL THROUGH */;
else if (command.obj == DWARF && atdwrf(game.loc) > 0)
/* FALL THROUGH */;
- else if ((LIQUID() == command.obj && HERE(BOTTLE)) ||
- command.obj == LIQLOC(game.loc))
+ else if (!game.closed && ((LIQUID() == command.obj && HERE(BOTTLE)) ||
+ command.obj == LIQLOC(game.loc)))
/* FALL THROUGH */;
else if (command.obj == OIL && HERE(URN) && game.prop[URN] != URN_EMPTY) {
command.obj = URN;
case RUB:
return rub(command.verb, command.obj);
case THROW:
- return throw (command);
+ return throwit(command);
case QUIT: {
speak(actions[command.verb].message);
return GO_CLEAROBJ;