Fix interrupted-magic-words cosmetic bug.
authorEric S. Raymond <esr@thyrsus.com>
Fri, 10 Mar 2023 21:43:27 +0000 (16:43 -0500)
committerEric S. Raymond <esr@thyrsus.com>
Fri, 10 Mar 2023 21:43:27 +0000 (16:43 -0500)
C patch by Torbjörn Andersson.

NEWS
actions.c
main.c
tests/foobug.chk
tests/foobug.log

diff --git a/NEWS b/NEWS
index 96daed01f0fdf64479ef00f3e5595f203ec9fd5c..6e432f6b79def5b78fd2f4e14b4a74917fa1ba4a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 = Open Adventure project news =
 
+Repository head::
+  Commands in magic-word sequence now interrupt it, as in original.
+
 1.14: 2023-03-09::
   Added -a option for BBS door systems.
   -o reverts to the old message on some failed magic words. 
index a831d97a453b33f7c5566822169cfe63fb1d621d..4c2fcdbad111c600cfe745544de3898eb95c09f4 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -192,11 +192,13 @@ static phase_codes_t bigwords(vocab_t id)
  * 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);
+
+    if ((foobar == WORD_EMPTY && id == FEE) ||
+        (foobar == FEE && id == FIE) ||
+        (foobar == FIE && id == FOE) ||
+        (foobar == FOE && id == FOO) ||
+        (foobar == FOE && id == FUM)) {
         game.foobar = id;
         if ((id != FOO) && (id != FUM)) {
             rspeak(OK_MAN);
diff --git a/main.c b/main.c
index 94f2b45b9fe30d5c2251e9d9b431cee7af9c028e..371b3b67d7a1af9ae14e018f1d372f00927e7d2f 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1125,6 +1125,12 @@ static bool do_command()
                 if (!get_command_input(&command))
                     return false;
 
+                /* Every input, check "foobar" flag. If zero, nothing's going
+                 * on. If pos, make neg. If neg, he skipped a word, so make it
+                 * zero.
+                 */
+                game.foobar = (game.foobar > WORD_EMPTY) ? -game.foobar : WORD_EMPTY;
+
                 ++game.turns;
                 preprocess_command(&command);
             }
index ead29b1a813b66dab5b7ea992199e5b4d68c41dc..046b8206d76da30c39070b8a0ed92341036a0926 100644 (file)
@@ -1688,11 +1688,11 @@ passage leads south, and a low crawl goes east.
 
 > foe
 
-OK
+Nothing happens.
 
 > foo
 
-Done!
+Nothing happens.
 
 
 You scored 311 out of a possible 430, using 291 turns.
index 49c25df5072a84a50fe614759c36e321e1b677b1..8ff35b8ab17da5690ab83a002a33fffa6b3e8a17 100644 (file)
@@ -1,5 +1,5 @@
 ## Test interpersing commands amidst magic words
-# Check for "Done" or "Nothing happens." in game output.
+# Check for "Nothing happens." in game output indicatung sequence interrupt.
 no
 seed 1318612053
 e