Now YAML coverage test generates a nice HTML template
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index f7929a36a55e1253275e48e7fd711db3539600d9..200c77ebc3d0bf4a541e3c206e6571a2a8d74f80 100644 (file)
--- a/main.c
+++ b/main.c
@@ -116,6 +116,10 @@ int main(int argc, char *argv[])
     } else {
         restore(rfp);
     }
+#else
+    game.novice = yes(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
+    if (game.novice)
+        game.limit = NOVICELIMIT;
 #endif
 
     if (settings.logfp)
@@ -380,9 +384,10 @@ static bool dwarfmove(void)
         kk = tkey[game.dloc[i]];
         if (kk != 0)
             do {
-                game.newloc = travel[kk].dest;
+               enum desttype_t desttype = travel[kk].desttype;
+                game.newloc = travel[kk].destval;
                 /* Have we avoided a dwarf encounter? */
-                if (SPECIAL(game.newloc))
+                if (desttype != dest_goto)
                     continue;
                 else if (!INDEEP(game.newloc))
                     continue;
@@ -504,8 +509,11 @@ 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);
+    return (travel[a].condtype == travel[b].condtype)
+          && (travel[a].condarg1 == travel[b].condarg1)
+          && (travel[a].condarg2 == travel[b].condarg2)
+           && (travel[a].desttype == travel[b].desttype)
+           && (travel[a].destval == travel[b].destval);
 }
 
 /*  Given the current location in "game.loc", and a motion verb number in
@@ -541,10 +549,11 @@ static void playermove( int motion)
         if (spk == 0) {
             int te_tmp = 0;
             for (;;) {
-                scratchloc = travel[travel_entry].dest;
-                if (scratchloc != motion) {
-                    if (!SPECIAL(scratchloc)) {
-                        if (FORCED(scratchloc) && travel[tkey[scratchloc]].dest == motion)
+               enum desttype_t desttype = travel[travel_entry].desttype;
+                scratchloc = travel[travel_entry].destval;
+                if (desttype != dest_goto || scratchloc != motion) {
+                    if (desttype == dest_goto) {
+                        if (FORCED(scratchloc) && travel[tkey[scratchloc]].destval == motion)
                             te_tmp = travel_entry;
                     }
                     if (!travel[travel_entry].stop) {
@@ -627,22 +636,23 @@ static void playermove( int motion)
     do {
         for (;;) { /* L12 loop */
             for (;;) {
-                long cond = travel[travel_entry].cond;
-                long arg = MOD(cond, 100);
-                if (!SPECIAL(cond)) {
+               enum condtype_t condtype = travel[travel_entry].condtype;
+                long condarg1 = travel[travel_entry].condarg1;
+                long condarg2 = travel[travel_entry].condarg2;
+                if (condtype < cond_not) {
                     /* YAML N and [pct N] conditionals */
-                    if (cond <= 100) {
-                        if (cond == 0 ||
-                            PCT(cond))
+                    if (condtype == cond_goto || condtype == cond_pct) {
+                        if (condarg1 == 0 ||
+                            PCT(condarg1))
                             break;
                         /* else fall through */
                     }
                     /* YAML [with OBJ] clause */
-                    if (TOTING(arg) ||
-                        (cond > 200 && AT(arg)))
+                    else if (TOTING(condarg1) ||
+                             (condtype == cond_with && AT(condarg1)))
                         break;
                     /* else fall through to check [not OBJ STATE] */
-                } else if (game.prop[arg] != cond / 100 - 3)
+                } else if (game.prop[condarg1] != condarg2)
                     break;
 
                 /* We arrive here on conditional failure.
@@ -658,17 +668,17 @@ static void playermove( int motion)
             }
 
             /* Found an eligible rule, now execute it */
-            game.newloc = travel[travel_entry].dest;
-            if (!SPECIAL(game.newloc))
+           enum desttype_t desttype = travel[travel_entry].desttype;
+            game.newloc = travel[travel_entry].destval;
+            if (desttype == dest_goto)
                 return;
 
-            if (game.newloc > 500) {
+            if (desttype == dest_speak) {
                 /* Execute a speak rule */
-                rspeak(L_SPEAK(game.newloc));
+                rspeak(game.newloc);
                 game.newloc = game.loc;
                 return;
             } else {
-                game.newloc -= SPECIALBASE;
                 switch (game.newloc) {
                 case 1:
                     /* Special travel 1.  Plover-alcove passage.  Can carry only