Purge magic numbers from C side of destination handling.
authorEric S. Raymond <esr@thyrsus.com>
Fri, 7 Jul 2017 11:50:39 +0000 (07:50 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Fri, 7 Jul 2017 15:04:18 +0000 (11:04 -0400)
main.c
make_dungeon.py

diff --git a/main.c b/main.c
index 8c8b47c558033adbc913cc4bf64c78927ec6f471..997bfe26bf050d9453b9c7932a506f2604fec4df 100644 (file)
--- a/main.c
+++ b/main.c
@@ -384,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;
@@ -509,7 +510,8 @@ 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);
+           && (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
@@ -545,10 +547,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) {
@@ -662,17 +665,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
index 7a16970df83ea3b369c920f880d1661172fa03ef..383f55a4c049387e535914393cdc2b6401d20296 100755 (executable)
@@ -149,10 +149,13 @@ typedef struct {{
   const char* message;
 }} special_t;
 
+enum desttype_t {{dest_goto, dest_special, dest_speak}};
+
 typedef struct {{
   const long motion;
   const long cond;
-  const long dest;
+  const enum desttype_t desttype;
+  const long destval;
   const bool nodwarves;
   const bool stop;
 }} travelop_t;
@@ -163,7 +166,6 @@ typedef struct {{
  * encoding description for travel.
  */
 #define T_TERMINATE(entry)     ((entry).motion == 1)
-#define L_SPEAK(loc)           ((loc) - 500)
 
 extern const location_t locations[];
 extern const object_t objects[];
@@ -702,7 +704,7 @@ def buildtravel(locs, objs):
     #
     # In order to de-crypticize the runtime code, we're going to break these
     # magic numbers up into a struct.
-    travel = [[0, "LOC_NOWHERE", 0, 0, 0, "false", "false"]]
+    travel = [[0, "LOC_NOWHERE", 0, 0, 0, 0, "false", "false"]]
     tkey = [0]
     oldloc = 0
     while ltravel:
@@ -717,11 +719,21 @@ def buildtravel(locs, objs):
         while rule:
             cond = newloc // 1000
             dest = newloc % 1000
+            if dest <= 300:
+                desttype = "dest_goto";
+                destval = locnames[dest]
+            elif dest > 500:
+                desttype = "dest_speak";
+                destval = msgnames[dest - 500]
+            else:
+                desttype = "dest_special";
+                destval = locnames[dest - 300]
             travel.append([len(tkey)-1,
                            locnames[len(tkey)-1],
                            rule.pop(0),
                            cond,
-                           locnames[dest] if dest <= 300 else dest,
+                           desttype,
+                           destval,
                            "true" if cond==100 else "false",
                            "false"])
         travel[-1][-1] = "true"
@@ -731,7 +743,8 @@ def get_travel(travel):
     template = """    {{ // from {}: {}
         .motion = {},
         .cond = {},
-        .dest = {},
+        .desttype = {},
+        .destval = {},
         .nodwarves = {},
         .stop = {},
     }},