Improved behavior when magic words are said before they're seen.
authorEric S. Raymond <esr@thyrsus.com>
Wed, 5 Apr 2023 23:49:38 +0000 (19:49 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Wed, 5 Apr 2023 23:49:38 +0000 (19:49 -0400)
Note: there is a tiny risk that this could break savefile
compatibility, as I swiped an unused int member in the game structure
and turned it into a bool. int and bool *should* be the same sixe...

actions.c
advent.h
adventure.yaml
main.c
notes.adoc
tests/magicwords.chk
tests/newfilter

index 05377ffed9bd8ccfe018adfe735e13b66cdb17be..658d95d1789fe6df51ab990128d0cf807d790c63 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -231,7 +231,10 @@ static phase_codes_t bigwords(vocab_t id)
         }
     } else {
        /* Magic-word sequebce was started but is incorrect */
-       rspeak(START_OVER);
+       if (settings.oldstyle || game.seenbigwords)
+           rspeak(START_OVER);
+       else
+           rspeak(WELL_POINTLESS);
         game.foobar = WORD_EMPTY;
         return GO_CLEAROBJ;
     }
index 3afeb8ea407b20a4d52c5912dec02578979ec498..5ff114648e1a3f85be0af9f142dc29d1eb90350b 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -178,7 +178,7 @@ struct game_t {
     int saved;                   // point penalty for saves
     int tally;                   // count of treasures gained
     int thresh;                  // current threshold for endgame scoring tier
-    turn_t trndex;               // FIXME: not used, remove on next format bump
+    bool seenbigwords;           // have we red the grafitti in the Giant's Room? 
     turn_t trnluz;               // # points lost so far due to turns used
     turn_t turns;                // counts commands given (ignores yes/no)
     char zzword[TOKLEN + 1];     // randomly generated magic word from bird
index c9827dfb77abbc2f0000f6e01b29346e9e861ef4..a48ee7db0a38ba8a043e6d8fbcc6d7c454f9fbf3 100644 (file)
@@ -3016,6 +3016,7 @@ arbitrary_messages:  !!omap
       black smoke.
 - SHELL_IMPERVIOUS: 'The shell is very strong and is impervious to attack.'
 - START_OVER: 'What''s the matter, can''t you read?  Now you''d best start over.'
+- WELL_POINTLESS: 'Well, that was remarkably pointless!'
 - DRAGON_SCALES: 'The axe bounces harmlessly off the dragon''s thick scales.'
 - NASTY_DRAGON: 'The dragon looks rather nasty.  You''d best not try to get by.'
 - BIRD_BURNT: |-
diff --git a/main.c b/main.c
index ef7d392c882fe416f5cd5fff683bd9456642e615..124ba44105ead1eff413e4cef8ddd29e71972d84 100644 (file)
--- a/main.c
+++ b/main.c
@@ -935,6 +935,8 @@ static void listobjects(void)
                     game.prop[RUG] = RUG_DRAGON;
                 if (obj == CHAIN)
                     game.prop[CHAIN] = CHAINING_BEAR;
+               if (obj == EGGS)
+                   game.seenbigwords = true;
                 --game.tally;
                 /*  Note: There used to be a test here to see whether the
                  *  player had blown it so badly that he could never ever see
index 83585654039a0dd17cb8f9945c32d1ac9f65fa66..d8d8292d586a44b031093db4d648572040fba2ad 100644 (file)
@@ -53,6 +53,11 @@ Bug fixes:
 
 * Response to an attempt to unlock the oyster while carrying it was incorrect. 
 
+* Behavior when saying the giant's magic words before having seen them wasn't
+  quite correct - the game responded as though the player had already
+  read them ("...can't you read?"). The new message is "Nothing happens."
+  The -o option reverts this change.
+
 * Attempting to extinguish an unlit urn caused it to lose its oil.
 
 * "A crystal bridge now spans the fissure." (progressive present) was
index 24df443515b5d3c3644cb2a947e28f452e5064ff..4db287afc5955be66caf87f80572fd229901e0ef 100644 (file)
@@ -67,7 +67,7 @@ OK
 
 > say fum
 
-What's the matter, can't you read?  Now you'd best start over.
+Well, that was remarkably pointless!
 
 > z
 
index 9ae3da71a8e00cb12cd9ab68f2d6a2e904529259..c5bad71a03703b17c9fc7d6b488fff72db0a5866 100755 (executable)
@@ -6,5 +6,6 @@ sed \
     -e '/bridge now spans the fissure/s//bridge spans the fissure/' \
     -e '/ground/s//surface/' \
     -e '/floor/s//surface/' \
+    -e "/Well, that was remarkably pointless!/s//What's the matter, can't you read?  Now you'd best start over./" \
 
 # end