/*
- * Actions for the duneon-running code.
+ * Actions for the dungeon-running code.
*
- * Copyright (c) 1977, 2005 by Will Crowther and Don Woods
- * Copyright (c) 2017 by Eric S. Raymond
- * SPDX-License-Identifier: BSD-2-clause
+ * SPDX-FileCopyrightText: 1977, 2005 by Will Crowther and Don Woods
+ * SPDX-FileCopyrightText 2017 by Eric S. Raymond
+ * SPDX-License-Identifier: BSD-2-Clause
*/
#include <stdlib.h>
static phase_codes_t bigwords(vocab_t id)
/* 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
+ * 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) ||
- (game.foobar == FIE && id == FOE) ||
- (game.foobar == FOE && id == FOO) ||
- (game.foobar == FOE && id == FUM)) {
+ int foobar = abs(game.foobar);
+
+ /* Only FEE can start a magic-word sequence. */
+ if ((foobar == WORD_EMPTY) && (id == FIE || id == FOE || id == FOO || id == FUM)) {
+ rspeak(NOTHING_HAPPENS);
+ return GO_CLEAROBJ;
+ }
+
+ if ((foobar == WORD_EMPTY && id == FEE) ||
+ (foobar == FEE && id == FIE) ||
+ (foobar == FIE && id == FOE) ||
+ (foobar == FOE && id == FOO)) {
game.foobar = id;
- if ((id != FOO) && (id != FUM)) {
+ if (id != FOO) {
rspeak(OK_MAN);
return GO_CLEAROBJ;
}
(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 behavior in Open Adventure - sounds better when
- * player isn't in the Giant Room. */
- rspeak(NOTHING_HAPPENS);
- }
+ /* Magic-word sequebce was started but is incorrect */
+ if (settings.oldstyle || game.seenbigwords)
+ rspeak(START_OVER);
+ else
+ rspeak(WELL_POINTLESS);
game.foobar = WORD_EMPTY;
return GO_CLEAROBJ;
}
}
if (game.loc == LOC_CLIFF) {
- game.oldlc2 = game.oldloc;
- game.oldloc = game.loc;
+ game.oldlc2 = game.oldloc;
+ game.oldloc = game.loc;
game.newloc = LOC_LEDGE;
rspeak(RUG_GOES);
} else if (game.loc == LOC_LEDGE) {
- game.oldlc2 = game.oldloc;
- game.oldloc = game.loc;
+ 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);
+ /* 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. */
+/* Listen. Intransitive only. Print stuff based on object sound properties. */
{
bool soundlatch = false;
vocab_t sound = locations[game.loc].sound;
soundlatch = true;
}
if (!soundlatch)
- rspeak(ALL_SILENT);
+ rspeak(ALL_SILENT);
return GO_CLEAROBJ;
}
if (verb == LOCK)
rspeak(HUH_MAN);
else if (TOTING(CLAM))
- rspeak(DROP_CLAM);
+ rspeak(DROP_CLAM);
else if (!TOTING(TRIDENT))
rspeak(CLAM_OPENER);
else {
if (DARK(game.loc)) {
sspeak(NO_SEE, command.word[0].raw);
} 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.
- }
+ 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);
else if (command.obj == DWARF && atdwrf(game.loc) > 0)
/* FALL THROUGH */;
else if (!game.closed && ((LIQUID() == command.obj && HERE(BOTTLE)) ||
- command.obj == LIQLOC(game.loc)))
+ command.obj == LIQLOC(game.loc)))
/* FALL THROUGH */;
else if (command.obj == OIL && HERE(URN) && game.prop[URN] != URN_EMPTY) {
command.obj = URN;