Travel tables are all done from YAML now.
authorEric S. Raymond <esr@thyrsus.com>
Tue, 27 Jun 2017 20:11:13 +0000 (16:11 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Tue, 27 Jun 2017 20:11:13 +0000 (16:11 -0400)
Leaves only Section 4 from asventure.text still relevant.

dungeon.c
init.c
linenoise
main.c

index a5531473116752dc260e90804c3b1a3067e57ef7..725152d44c096166a6f6765a16eb35fa000ce6a0 100644 (file)
--- a/dungeon.c
+++ b/dungeon.c
@@ -5,7 +5,6 @@
 
 /*  Current limits:
  *     12600 words of message text (LINES, LINSIZ).
- *     885 travel options (TRAVEL, TRVSIZ).
  *     330 vocabulary words (KTAB, ATAB, TABSIZ).
  *  There are also limits which cannot be exceeded due to the structure of
  *  the database.  (E.G., The vocabulary uses n/1000 to determine word type,
  *  The data file contains several sections.  Each begins with a line containing
  *  a number identifying the section, and ends with a line containing "-1".
  *
- *  Section 3: Travel table.  Each line contains a location number (X), a second
- *     location number (Y), and a list of motion numbers (see section 4).
- *     each motion represents a verb which will go to Y if currently at X.
- *     Y, in turn, is interpreted as follows.  Let M=Y/1000, N=Y mod 1000.
- *             If N<=300       it is the location to go to.
- *             If 300<N<=500   N-300 is used in a computed goto to
- *                                     a section of special code.
- *             If N>500        message N-500 from section 6 is printed,
- *                                     and he stays wherever he is.
- *     Meanwhile, M specifies the conditions on the motion.
- *             If M=0          it's unconditional.
- *             If 0<M<100      it is done with M% probability.
- *             If M=100        unconditional, but forbidden to dwarves.
- *             If 100<M<=200   he must be carrying object M-100.
- *             If 200<M<=300   must be carrying or in same room as M-200.
- *             If 300<M<=400   game.prop(M % 100) must *not* be 0.
- *             If 400<M<=500   game.prop(M % 100) must *not* be 1.
- *             If 500<M<=600   game.prop(M % 100) must *not* be 2, etc.
- *     If the condition (if any) is not met, then the next *different*
- *     "destination" value is used (unless it fails to meet *its* conditions,
- *     in which case the next is found, etc.).  Typically, the next dest will
- *     be for one of the same verbs, so that its only use is as the alternate
- *     destination for those verbs.  For instance:
- *             15      110022  29      31      34      35      23      43
- *             15      14      29
- *     This says that, from loc 15, any of the verbs 29, 31, etc., will take
- *     him to 22 if he's carrying object 10, and otherwise will go to 14.
- *             11      303008  49
- *             11      9       50
- *     This says that, from 11, 49 takes him to 8 unless game.prop(3)=0, in which
- *     case he goes to 9.  Verb 50 takes him to 9 regardless of game.prop(3).
  *  Section 4: Vocabulary.  Each line contains a number (n), a tab, and a
  *     five-letter word.  Call M=N/1000.  If M=0, then the word is a motion
  *     verb for use in travelling (see section 3).  Else, if M=1, the word is
  * Other sections are obsolete and ignored */
 
 #define LINESIZE 100
-#define CLSMAX 12
 #define LINSIZ 12600
-#define TRNSIZ 5
 #define TABSIZ 330
 #define VRBSIZ 35
-#define TRVSIZ 885
 #define TOKLEN 5
 
 #include <stdio.h>
@@ -88,12 +53,8 @@ static long OLDLOC;
 static long LINUSE;
 
 // Storage for what comes out of the database
-long TRVS;
-long TRNVLS;
 long TABNDX;
-long TKEY[NLOCATIONS + 1];
 long LINES[LINSIZ + 1];
-long TRAVEL[TRVSIZ + 1];
 long KTAB[TABSIZ + 1];
 long ATAB[TABSIZ + 1];
 
@@ -244,7 +205,7 @@ static void read_messages(FILE* database)
 }
 
 /*  The stuff for section 3 is encoded here.  Each "from-location" gets a
- *  contiguous section of the "TRAVEL" array.  Each entry in travel is
+ *  contiguous section of the "travel" array.  Each entry in travel is
  *  newloc*1000 + KEYWORD (from section 4, motion verbs), and is negated if
  *  this is the last entry for this location.  KEY(N) is the index in travel
  *  of the first option at location N. */
@@ -252,20 +213,7 @@ static void read_section3_stuff(FILE* database)
 {
     long loc;
     while ((loc = GETNUM(database)) != -1) {
-        long newloc = GETNUM(NULL);
-        long L;
-        if (TKEY[loc] == 0) {
-            TKEY[loc] = TRVS;
-        } else {
-            TRAVEL[TRVS - 1] = -TRAVEL[TRVS - 1];
-        }
-        while ((L = GETNUM(NULL)) != 0) {
-            TRAVEL[TRVS] = newloc * 1000 + L;
-            TRVS = TRVS + 1;
-            if (TRVS == TRVSIZ)
-                BUG(TOO_MANY_TRAVEL_OPTIONS);
-        }
-        TRAVEL[TRVS - 1] = -TRAVEL[TRVS - 1];
+       /* Now done from YAML */
     }
 }
 
@@ -347,13 +295,8 @@ static int read_database(FILE* database)
      *  pointer-words in lines. PTEXT(N) points to
      *  message for game.prop(N)=0.  Successive prop messages are
      *  found by chasing pointers. */
-    for (int I = 1; I <= NLOCATIONS; I++) {
-        TKEY[I] = 0;
-    }
 
     LINUSE = 1;
-    TRVS = 1;
-    TRNVLS = 0;
 
     /*  Start new data section.  Sect is the section number. */
 
@@ -457,8 +400,6 @@ static void write_file(FILE* header_file)
     fprintf(header_file, "\n");
 
     // content variables
-    write_1d(header_file, TKEY, NLOCATIONS + 1, "TKEY");
-    write_1d(header_file, TRAVEL, TRVSIZ + 1, "TRAVEL");
     write_1d(header_file, KTAB, TABSIZ + 1, "KTAB");
     write_1d(header_file, ATAB, TABSIZ + 1, "ATAB");
 
diff --git a/init.c b/init.c
index d3823db5c33e63e03fb80b61fe53509e70f38065..66ef59e2a0d0e846d19d4fff12e11ba275c4b312 100644 (file)
--- a/init.c
+++ b/init.c
@@ -23,9 +23,9 @@ void initialise(void)
 
     for (int i = 1; i <= NLOCATIONS; i++) {
         game.abbrev[i] = 0;
-        if (!(locations[i].description.big == 0 || TKEY[i] == 0)) {
-            int k = TKEY[i];
-            if (MOD(labs(TRAVEL[k]), 1000) == 1)
+        if (!(locations[i].description.big == 0 || tkey[i] == 0)) {
+            int k = tkey[i];
+            if (MOD(labs(travel[k]), 1000) == 1)
                conditions[i] |= (1 << COND_FORCED);
         }
         game.atloc[i] = 0;
index 2105ce445821381cf1bca87b6d386d4ea88ee20d..c894b9e59f02203dbe4e2be657572cf88c4230c3 160000 (submodule)
--- a/linenoise
+++ b/linenoise
@@ -1 +1 @@
-Subproject commit 2105ce445821381cf1bca87b6d386d4ea88ee20d
+Subproject commit c894b9e59f02203dbe4e2be657572cf88c4230c3
diff --git a/main.c b/main.c
index f6209d47ae2478f42d785a8bb4432b4fb63cca0a..b7219d1d3b63f934c755c1375a62b0411a176ec9 100644 (file)
--- a/main.c
+++ b/main.c
@@ -30,7 +30,7 @@
 /* Abstract out the encoding of words in the travel array.  Gives us
  * some hope of getting to a less cryptic representation than we
  * inherited from FORTRAN, someday. To understand these, read the
- * encoding description for TRAVEL.
+ * encoding description for travel.
  */
 #define T_DESTINATION(entry)   MOD(labs(entry) / 1000, 1000)
 #define T_NODWARVES(entry)     labs(entry) / 1000000 == 100
@@ -406,10 +406,10 @@ static bool dwarfmove(void)
             continue;
         /*  Fill tk array with all the places this dwarf might go. */
         unsigned int j = 1;
-        kk = TKEY[game.dloc[i]];
+        kk = tkey[game.dloc[i]];
         if (kk != 0)
             do {
-               game.newloc = T_DESTINATION(TRAVEL[kk]);
+               game.newloc = T_DESTINATION(travel[kk]);
                 /* Have we avoided a dwarf encounter? */
                 bool avoided = (SPECIAL(game.newloc) ||
                                 !INDEEP(game.newloc) ||
@@ -419,13 +419,13 @@ static bool dwarfmove(void)
                                 game.newloc == game.dloc[i] ||
                                 FORCED(game.newloc) ||
                                 (i == PIRATE && CNDBIT(game.newloc, COND_NOARRR)) ||
-                                T_NODWARVES(TRAVEL[kk]));
+                                T_NODWARVES(travel[kk]));
                 if (!avoided) {
                     tk[j++] = game.newloc;
                 }
                 ++kk;
             } while
-            (TRAVEL[kk - 1] >= 0);
+            (travel[kk - 1] >= 0);
         tk[j] = game.odloc[i];
         if (j >= 2)
             --j;
@@ -529,7 +529,7 @@ static void croak(void)
 
 static bool playermove(token_t verb, int motion)
 {
-    int scratchloc, k2, kk = TKEY[game.loc];
+    int scratchloc, k2, kk = tkey[game.loc];
     game.newloc = game.loc;
     if (kk == 0)
         BUG(LOCATION_HAS_NO_TRAVEL_ENTRIES);
@@ -549,13 +549,13 @@ static bool playermove(token_t verb, int motion)
         if (CNDBIT(game.loc, COND_NOBACK))k2 = TWIST_TURN;
         if (k2 == 0) {
             for (;;) {
-                scratchloc = T_DESTINATION(TRAVEL[kk]);
+                scratchloc = T_DESTINATION(travel[kk]);
                 if (scratchloc != motion) {
                     if (!SPECIAL(scratchloc)) {
-                        if (FORCED(scratchloc) && T_DESTINATION(TRAVEL[TKEY[scratchloc]]) == motion)
+                        if (FORCED(scratchloc) && T_DESTINATION(travel[tkey[scratchloc]]) == motion)
                             k2 = kk;
                     }
-                    if (TRAVEL[kk] >= 0) {
+                    if (travel[kk] >= 0) {
                         ++kk;  /* go to next travel entry for this location */
                         continue;
                     }
@@ -567,8 +567,8 @@ static bool playermove(token_t verb, int motion)
                     }
                 }
 
-                motion = T_MOTION(TRAVEL[kk]);
-                kk = TKEY[game.loc];
+                motion = T_MOTION(travel[kk]);
+                kk = tkey[game.loc];
                 break; /* fall through to ordinary travel */
             }
         } else {
@@ -598,9 +598,9 @@ static bool playermove(token_t verb, int motion)
     /* Look for a way to fulfil the motion - kk indexes the beginning
      * of the motion entries for here (game.loc). */
     for (;;) {
-        if (T_TERMINATE(TRAVEL[kk]) || T_MOTION(TRAVEL[kk]) == motion)
+        if (T_TERMINATE(travel[kk]) || T_MOTION(travel[kk]) == motion)
             break;
-        if (TRAVEL[kk] < 0) {
+        if (travel[kk] < 0) {
             /* FIXME: Magic numbers! */
             /*  Couldn't find an entry matching the motion word passed
              *  in.  Various messages depending on word given. */
@@ -617,7 +617,7 @@ static bool playermove(token_t verb, int motion)
         }
         ++kk;
     }
-    scratchloc = labs(TRAVEL[kk]) / 1000;
+    scratchloc = labs(travel[kk]) / 1000;
 
     do {
         /*
@@ -642,10 +642,10 @@ static bool playermove(token_t verb, int motion)
                 } else if (game.prop[motion] != game.newloc / 100 - 3)
                     break;
                 do {
-                    if (TRAVEL[kk] < 0)
+                    if (travel[kk] < 0)
                         BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION);
                     ++kk;
-                    game.newloc = labs(TRAVEL[kk]) / 1000;
+                    game.newloc = labs(travel[kk]) / 1000;
                 } while
                 (game.newloc == scratchloc);
                 scratchloc = game.newloc;
@@ -676,10 +676,10 @@ static bool playermove(token_t verb, int motion)
                      *  pretend he wasn't carrying it after all. */
                     drop(EMERALD, game.loc);
                     do {
-                        if (TRAVEL[kk] < 0)
+                        if (travel[kk] < 0)
                             BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION);
                         ++kk;
-                        game.newloc = labs(TRAVEL[kk]) / 1000;
+                        game.newloc = labs(travel[kk]) / 1000;
                     } while
                     (game.newloc == scratchloc);
                     scratchloc = game.newloc;