Resolve a particularly gnarly foto in dwarfmove.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 7292e8e6c092c16c37900374a7f73aaad21149aa..6469cb7b011e5939aa692521c3defbb7753123cd 100644 (file)
--- a/main.c
+++ b/main.c
@@ -220,18 +220,25 @@ static bool dwarfmove(void)
        if(kk != 0)
            do {
                game.newloc=MOD(labs(TRAVEL[kk])/1000,1000);
-               if(game.newloc > 300 || !INDEEP(game.newloc) || game.newloc == game.odloc[I] || (J > 1 && game.newloc == TK[J-1]) || J >= 20 || game.newloc == game.dloc[I] ||
-                  FORCED(game.newloc) || (I == 6 && CNDBIT(game.newloc,3)) ||
-                  labs(TRAVEL[kk])/1000000 == 100)
-                   goto L6014;
-               TK[J]=game.newloc;
-               J=J+1;
-           L6014:
-               kk=kk+1;
+               /* Have we avoided a dwarf enciounter? */
+               bool avoided = (game.newloc > 300 ||
+                               !INDEEP(game.newloc) ||
+                               game.newloc == game.odloc[I] ||
+                               (J > 1 && game.newloc == TK[J-1]) ||
+                               J >= 20 ||
+                               game.newloc == game.dloc[I] ||
+                               FORCED(game.newloc) ||
+                               (I == PIRATE && CNDBIT(game.newloc,3)) ||
+                               labs(TRAVEL[kk])/1000000 == 100);
+               if (!avoided) {
+                   TK[J++] = game.newloc;
+               }
+               ++kk;
            } while
                (TRAVEL[kk-1] >= 0);
        TK[J]=game.odloc[I];
-       if(J >= 2)J=J-1;
+       if(J >= 2)
+           --J;
        J=1+randrange(J);
        game.odloc[I]=game.dloc[I];
        game.dloc[I]=TK[J];
@@ -245,9 +252,10 @@ static bool dwarfmove(void)
             *  Note that game.place(CHEST)=0 might mean that he's thrown
             *  it to the troll, but in that case he's seen the chest
             *  (game.prop=0). */
-           if(game.loc == game.chloc || game.prop[CHEST] >= 0) continue;
+           if(game.loc == game.chloc || game.prop[CHEST] >= 0)
+               continue;
            K=0;
-           for (J=50; J<=MAXTRS; J++) {
+           for (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]))
@@ -256,24 +264,28 @@ static bool dwarfmove(void)
                    goto L6021;
            L6020:
                if(HERE(J))K=1;
-           } /* end loop */
+           }
            if(game.tally == 1 && K == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1)
                goto L6025;
            if(game.odloc[PIRATE] != game.dloc[PIRATE] && PCT(20))
                RSPEAK(127);
            continue;
 
-       L6021:  if(game.place[CHEST] != 0) goto L6022;
-           /*  Install chest only once, to insure it is the last treasure in
-            *  the list. */
-           MOVE(CHEST,game.chloc);
-           MOVE(MESSAG,game.chloc2);
-       L6022:  RSPEAK(128);
-           /* 6023 */ for (J=50; J<=MAXTRS; J++) {
-               if(J == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD])) goto L6023;
-               if(AT(J) && game.fixed[J] == 0)CARRY(J,game.loc);
-               if(TOTING(J))DROP(J,game.chloc);
-           L6023:      /*etc*/ ;
+       L6021:
+           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 (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);
+               }
            }
        L6024:
            game.dloc[PIRATE]=game.chloc;