Repair and simplify complicated pirare-robbery logic.
authorEric S. Raymond <esr@thyrsus.com>
Wed, 14 Jun 2017 12:26:49 +0000 (08:26 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Wed, 14 Jun 2017 12:26:49 +0000 (08:26 -0400)
I think we previously mistranslated this in a way that didn't show up
because it would only manifest if you found the penultimare treasure
without encountering the pirate.

This version is much easier to understand.

main.c

diff --git a/main.c b/main.c
index d0e690c1d363751e4dee60ebafec728c48d93c62..90f60033d883790734dc94c6bebe51107540eb63 100644 (file)
--- a/main.c
+++ b/main.c
@@ -269,49 +269,52 @@ bool spotted_by_pirate(int i)
      *  (game.prop=0). */
     if (game.loc == game.chloc || game.prop[CHEST] >= 0)
        return true;
-    int k=0;
+    int snarfed=0;
+    bool movechest = false, robplayer = false;
     for (int j=MINTRS; j<=MAXTRS; j++) {
        /*  Pirate won't take pyramid from plover room or dark
         *  room (too easy!). */
        if (j==PYRAM && (game.loc==PLAC[PYRAM] || game.loc==PLAC[EMRALD])) {
-           return true;
+           continue;
        }
+       if (TOTING(j) || HERE(j))
+           ++snarfed;
        if (TOTING(j)) {
-           if (game.place[CHEST] == 0) {
-               /*  Install chest only once, to insure it is
-                *  the last treasure in the list. */
-               MOVE(CHEST,game.chloc);
-               MOVE(MESSAG,game.chloc2);
-           }
-           RSPEAK(128);
-           for (int j=MINTRS; j<=MAXTRS; j++) {
-               if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
-                   if (AT(j) && game.fixed[j] == 0)
-                       CARRY(j,game.loc);
-                   if (TOTING(j))
-                       DROP(j,game.chloc);
-               }
-           }
-           game.dloc[PIRATE]=game.chloc;
-           game.odloc[PIRATE]=game.chloc;
-           game.dseen[PIRATE]=false;
-           return true;
+           movechest = true;
+           robplayer = true;
        }
-       if (HERE(j))
-           k=1;
     }
     /* Force chest placement before player finds last treasure */
-    if (game.tally == 1 && k == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
+    if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
        RSPEAK(186);
+       movechest = true;
+    }
+    /* Do things in this order (chest move before robbery) so chest is listed
+     * last at the maze location. */
+    if (movechest) {
        MOVE(CHEST,game.chloc);
        MOVE(MESSAG,game.chloc2);
        game.dloc[PIRATE]=game.chloc;
        game.odloc[PIRATE]=game.chloc;
        game.dseen[PIRATE]=false;
-       return true;
+    } else {
+       /* You might get a hint of the pirate's presence even if the 
+        * chest doesn't move... */
+       if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
+           RSPEAK(127);
+    }
+    if (robplayer) {
+       RSPEAK(128);
+       for (int j=MINTRS; j<=MAXTRS; j++) {
+           if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
+               if (AT(j) && game.fixed[j] == 0)
+                   CARRY(j,game.loc);
+               if (TOTING(j))
+                   DROP(j,game.chloc);
+           }
+       }
     }
-    if (game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
-       RSPEAK(127);
+
     return true;
 }