Break travel opcodes into a two-element structure.
authorEric S. Raymond <esr@thyrsus.com>
Wed, 28 Jun 2017 02:11:58 +0000 (22:11 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Wed, 28 Jun 2017 02:11:58 +0000 (22:11 -0400)
init.c
main.c
newdungeon.py

diff --git a/init.c b/init.c
index 66ef59e2a0d0e846d19d4fff12e11ba275c4b312..fc8d5fdce8db6cfeb6c814d3b4c5552cb72f5eeb 100644 (file)
--- a/init.c
+++ b/init.c
@@ -25,7 +25,7 @@ void initialise(void)
         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 (MOD(labs(travel[k].opcode), 1000) == 1)
                conditions[i] |= (1 << COND_FORCED);
         }
         game.atloc[i] = 0;
diff --git a/main.c b/main.c
index 5ad7d90ffe203396e7844b8a0a599b5d0c4ee491..c58281d157bcd32fb2ab1a97f3d72a617ac39d60 100644 (file)
--- a/main.c
+++ b/main.c
  * inherited from FORTRAN, someday. To understand these, read the
  * encoding description for travel.
  */
-#define T_DESTINATION(entry)   MOD(labs(entry) / 1000, 1000)
-#define T_NODWARVES(entry)     labs(entry) / 1000000 == 100
-#define T_MOTION(entry)                MOD(labs(entry), 1000)
-#define L_SPEAK(loc)           ((loc) - 500)
+#define T_DESTINATION(entry)   MOD(labs((entry).opcode) / 1000, 1000)
+#define T_NODWARVES(entry)     labs((entry).opcode) / 1000000 == 100
+#define T_MOTION(entry)                MOD(labs((entry).opcode), 1000)
 #define T_TERMINATE(entry)     (T_MOTION(entry) == 1)
-#define T_STOP(entry)          ((entry) < 0)
-#define T_OPCODE(entry)                (entry)
+#define T_STOP(entry)          ((entry).stop)
+#define T_OPCODE(entry)                ((entry).opcode)
+#define L_SPEAK(loc)           ((loc) - 500)
 
 struct game_t game;
 
index 68dbc39b1130c13d697758aa1dab9a03a2167015..b4c85b28d4f59561fbd4d9935bbb63f189fc06fa 100755 (executable)
@@ -137,6 +137,11 @@ typedef struct {{
   const long message;
 }} action_t;
 
+typedef struct {{
+  const long opcode;
+  const bool stop;
+}} travelop_t;
+
 extern const location_t locations[];
 extern const object_t objects[];
 extern const char* arbitrary_messages[];
@@ -147,7 +152,7 @@ extern const hint_t hints[];
 extern long conditions[];
 extern const motion_t motions[];
 extern const action_t actions[];
-extern const long travel[];
+extern const travelop_t travel[];
 extern const long tkey[];
 
 #define NLOCATIONS     {}
@@ -233,7 +238,9 @@ const action_t actions[] = {{
 
 {}
 
+const travelop_t travel[] = {{
 {}
+}};
 
 /* end */
 """
@@ -558,7 +565,7 @@ def buildtravel(locs, objs, voc):
                                 state = i
                                 break
                     else:
-                        sys.stderr.write("dungeon: unmatched state symbol %s in not caluase of %s\n" % (cond[2], name))
+                        sys.stderr.write("dungeon: unmatched state symbol %s in not clause of %s\n" % (cond[2], name))
                         sys.exit(0);
                 return 300 + obj + 100 * state
             except ValueError:
@@ -600,7 +607,9 @@ def buildtravel(locs, objs, voc):
     #     }
     #     TRAVEL[TRVS - 1] = -TRAVEL[TRVS - 1];
     # }
-    travel = [0]
+    #
+    # We're going to break the magic numbers up into a struct.
+    travel = [[0, False]]
     tkey = [0]
     oldloc = 0
     while ltravel:
@@ -611,12 +620,24 @@ def buildtravel(locs, objs, voc):
             tkey.append(len(travel))
             oldloc = loc 
         elif travel:
-            travel[-1] *= -1
+            travel[-1][1] = not travel[-1][1]
         while rule:
-            travel.append(rule.pop(0) + newloc * 1000)
-        travel[-1] *= -1
+            travel.append([rule.pop(0) + newloc * 1000, False])
+        travel[-1][1] = True
     return (travel, tkey)
 
+def get_travel(travel):
+    template = """    {{
+        .opcode = {},
+        .stop = {},
+    }},
+"""
+    out = ""
+    for entry in travel:
+        out += template.format(entry[0], entry[1]).lower()
+    out = out[:-1] # trim trailing newline
+    return out
+
 if __name__ == "__main__":
     with open(yaml_name, "r") as f:
         db = yaml.load(f)
@@ -642,7 +663,7 @@ if __name__ == "__main__":
         get_motions(db["motions"]),
         get_actions(db["actions"]),
         "const long tkey[] = {%s};" % bigdump(tkey),
-        "const long travel[] = {%s};" % bigdump(travel), 
+        get_travel(travel), 
     )
 
     h = h_template.format(