centralize calls to make_zzword()
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 0a5ce3d3bdd7e655ca70ece55792366924d60def..1cff0d1648db7fb827b29fb6f3859ada02bcf16e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -45,7 +45,6 @@ static void sig_handler(int signo)
  * MAIN PROGRAM
  *
  *  Adventure (rev 2: 20 treasures)
-Here's what we think. *
  *  History: Original idea & 5-treasure version (adventures) by Willie Crowther
  *           15-treasure version (adventure) by Don Woods, April-June 1977
  *           20-treasure version (rev 2) by Don Woods, August 1978
@@ -62,7 +61,7 @@ int main(int argc, char *argv[])
     /*  Options. */
 
 #ifndef ADVENT_NOSAVE
-    const char* opts = "l:or";
+    const char* opts = "l:or:";
     const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename]\n";
 #else
     const char* opts = "l:o";
@@ -111,9 +110,6 @@ int main(int argc, char *argv[])
     /*  Initialize game variables */
     long seedval = initialise();
 
-    /*  Start-up, dwarf stuff */
-    make_zzword(game.zzword);
-
 #ifndef ADVENT_NOSAVE
     if (!rfp) {
         game.novice = yes(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
@@ -145,8 +141,6 @@ static bool fallback_handler(char *buf)
         printf("Seed set to %ld\n", sv);
         // autogenerated, so don't charge user time for it.
         --game.turns;
-        // here we reconfigure any global game state that uses random numbers
-        make_zzword(game.zzword);
         return true;
     }
     return false;
@@ -380,23 +374,29 @@ static bool dwarfmove(void)
         kk = tkey[game.dloc[i]];
         if (kk != 0)
             do {
-                game.newloc = T_DESTINATION(travel[kk]);
+                game.newloc = travel[kk].dest;
                 /* Have we avoided a dwarf encounter? */
-                bool avoided = (SPECIAL(game.newloc) ||
-                                !INDEEP(game.newloc) ||
-                                game.newloc == game.odloc[i] ||
-                                (j > 1 && game.newloc == tk[j - 1]) ||
-                                j >= DIM(tk) - 1 ||
-                                game.newloc == game.dloc[i] ||
-                                FORCED(game.newloc) ||
-                                (i == PIRATE && CNDBIT(game.newloc, COND_NOARRR)) ||
-                                T_NODWARVES(travel[kk]));
-                if (!avoided) {
-                    tk[j++] = game.newloc;
-                }
-                ++kk;
+                if (SPECIAL(game.newloc))
+                   continue;
+                else if (!INDEEP(game.newloc))
+                   continue;
+               else if (game.newloc == game.odloc[i])
+                   continue;
+                else if (j > 1 && game.newloc == tk[j - 1])
+                   continue;
+               else if (j >= DIM(tk) - 1)
+                   continue;
+               else if (game.newloc == game.dloc[i])
+                   continue;
+               else if (FORCED(game.newloc))
+                   continue;
+               else if (i == PIRATE && CNDBIT(game.newloc, COND_NOARRR))
+                   continue;
+               else if (travel[kk].nodwarves)
+                   continue;
+               tk[j++] = game.newloc;
             } while
-            (!travel[kk - 1].stop);
+               (!travel[kk++].stop);
         tk[j] = game.odloc[i];
         if (j >= 2)
             --j;
@@ -492,6 +492,13 @@ static void croak(void)
     }
 }
 
+static bool traveleq(long a, long b)
+/* Are two travel entries equal for purposes of skip after failed condition? */
+{
+    return (travel[a].cond == travel[b].cond)
+       && (travel[a].dest == travel[b].dest);
+}
+
 /*  Given the current location in "game.loc", and a motion verb number in
  *  "motion", put the new location in "game.newloc".  The current loc is saved
  *  in "game.oldloc" in case he wants to retreat.  The current
@@ -525,10 +532,10 @@ static bool playermove( int motion)
         if (spk == 0) {
             int te_tmp = 0;
             for (;;) {
-                scratchloc = T_DESTINATION(travel[travel_entry]);
+                scratchloc = travel[travel_entry].dest;
                 if (scratchloc != motion) {
                     if (!SPECIAL(scratchloc)) {
-                        if (FORCED(scratchloc) && T_DESTINATION(travel[tkey[scratchloc]]) == motion)
+                        if (FORCED(scratchloc) && travel[tkey[scratchloc]].dest == motion)
                             te_tmp = travel_entry;
                     }
                     if (!travel[travel_entry].stop) {
@@ -605,7 +612,7 @@ static bool playermove( int motion)
     do {
         for (;;) { /* L12 loop */
             for (;;) {
-                long cond = T_CONDITION(travel[travel_entry]);
+                long cond = travel[travel_entry].cond;
                 long arg = MOD(cond, 100);
                 if (!SPECIAL(cond)) {
                     /* YAML N and [pct N] conditionals */
@@ -629,12 +636,12 @@ static bool playermove( int motion)
                         BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE
                     ++te_tmp;
                 } while
-                (T_HIGH(travel[travel_entry]) == T_HIGH(travel[te_tmp]));
+                   (traveleq(travel_entry, te_tmp));
                 travel_entry = te_tmp;
             }
 
             /* Found an eligible rule, now execute it */
-            game.newloc = T_DESTINATION(travel[travel_entry]);
+            game.newloc = travel[travel_entry].dest;
             if (!SPECIAL(game.newloc))
                 return true;
 
@@ -671,7 +678,7 @@ static bool playermove( int motion)
                             BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE
                         ++te_tmp;
                     } while
-                    (T_HIGH(travel[travel_entry]) == T_HIGH(travel[te_tmp]));
+                       (traveleq(travel_entry, te_tmp));
                     travel_entry = te_tmp;
                     continue; /* goto L12 */
                 case 3:
@@ -686,7 +693,7 @@ static bool playermove( int motion)
                      * stuff for bear. */
                     if (game.prop[TROLL] == TROLL_PAIDONCE) {
                         pspeak(TROLL, look, TROLL_PAIDONCE);
-                        game.prop[TROLL] = 0;
+                        game.prop[TROLL] = TROLL_UNPAID;
                         move(TROLL2, 0);
                         move(TROLL2 + NOBJECTS, 0);
                         move(TROLL, objects[TROLL].plac);
@@ -1131,7 +1138,7 @@ Lookup:
             command.verb = kmod;
             break;
         case 3:
-            rspeak(specials[kmod].message);
+            speak(specials[kmod].message);
             goto L2012;
         default:
             BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3); // LCOV_EXCL_LINE