More macro abstraction of the travel opcodes.
authorEric S. Raymond <esr@thyrsus.com>
Wed, 28 Jun 2017 12:26:36 +0000 (08:26 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Wed, 28 Jun 2017 12:26:36 +0000 (08:26 -0400)
init.c
main.c
newdungeon.py

diff --git a/init.c b/init.c
index dc70279426f396fe987689a01d7e7e6a33c0ef20..ac1671696e1f9f82ebec27e997c9f19e4ff4c8e5 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(travel[k].opcode, 1000) == 1)
+            if (T_LOW(travel[k]) == 1)
                conditions[i] |= (1 << COND_FORCED);
         }
         game.atloc[i] = 0;
diff --git a/main.c b/main.c
index 579ecfcecc294160c7dcfcb99a517eba1a886782..dd202357ba7004073ce1c51290c74110dbb1ac76 100644 (file)
--- a/main.c
+++ b/main.c
 
 #define DIM(a) (sizeof(a)/sizeof(a[0]))
 
-/* 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.
- */
-#define T_DESTINATION(entry)   MOD((entry).opcode / 1000, 1000)
-#define T_NODWARVES(entry)     ((entry).opcode / 1000000 == 100)
-#define T_MOTION(entry)                MOD((entry).opcode, 1000)
-#define T_TERMINATE(entry)     (T_MOTION(entry) == 1)
-#define T_STOP(entry)          ((entry).stop)
-#define T_OPCODE(entry)                ((entry).opcode)
-#define L_SPEAK(loc)           ((loc) - 500)
-
 struct game_t game;
 
 long LNLENG, LNPOSN;
@@ -619,7 +606,7 @@ static bool playermove(token_t verb, int motion)
         }
         ++kk;
     }
-    scratchloc = T_OPCODE(travel[kk]) / 1000;
+    scratchloc = T_HIGH(travel[kk]);
 
     do {
         /*
@@ -648,7 +635,7 @@ static bool playermove(token_t verb, int motion)
                     if (T_STOP(travel[kk]))
                         BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION);
                     ++kk;
-                    game.newloc = T_OPCODE(travel[kk]) / 1000;
+                    game.newloc = T_HIGH(travel[kk]);
                 } while
                 (game.newloc == scratchloc);
                 scratchloc = game.newloc;
@@ -689,7 +676,7 @@ static bool playermove(token_t verb, int motion)
                         if (T_STOP(travel[kk]))
                             BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION);
                         ++kk;
-                        game.newloc = T_OPCODE(travel[kk]) / 1000;
+                        game.newloc = T_HIGH(travel[kk]);
                     } while
                     (game.newloc == scratchloc);
                     scratchloc = game.newloc;
@@ -749,15 +736,14 @@ static bool closecheck(void)
  *  to get out.  If he doesn't within clock2 turns, we close the cave;
  *  if he does try, we assume he panics, and give him a few additional
  *  turns to get frantic before we close.  When clock2 hits zero, we
- *  branch to 11000 to transport him into the final puzzle.  Note that
- *  the puzzle depends upon all sorts of random things.  For instance,
- *  there must be no water or oil, since there are beanstalks which we
- *  don't want to be able to water, since the code can't handle it.
- *  Also, we can have no keys, since there is a grate (having moved
- *  the fixed object!) there separating him from all the treasures.
- *  Most of these problems arise from the use of negative prop numbers
- *  to suppress the object descriptions until he's actually moved the
- *  objects. */
+ *  transport him into the final puzzle.  Note that the puzzle depends
+ *  upon all sorts of random things.  For instance, there must be no
+ *  water or oil, since there are beanstalks which we don't want to be
+ *  able to water, since the code can't handle it.  Also, we can have
+ *  no keys, since there is a grate (having moved the fixed object!)
+ *  there separating him from all the treasures.  Most of these
+ *  problems arise from the use of negative prop numbers to suppress
+ *  the object descriptions until he's actually moved the objects. */
 {
     if (game.tally == 0 && INDEEP(game.loc) && game.loc != LOC_Y2)
         --game.clock1;
index b4c85b28d4f59561fbd4d9935bbb63f189fc06fa..27dd9f181afa1cbe74fdca5afb3ea427fab03287 100755 (executable)
@@ -142,6 +142,20 @@ typedef struct {{
   const bool stop;
 }} travelop_t;
 
+/* 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.
+ */
+#define T_DESTINATION(entry)   MOD((entry).opcode / 1000, 1000)
+#define T_NODWARVES(entry)     ((entry).opcode / 1000000 == 100)
+#define T_MOTION(entry)                MOD((entry).opcode, 1000)
+#define T_TERMINATE(entry)     (T_MOTION(entry) == 1)
+#define T_STOP(entry)          ((entry).stop)
+#define T_HIGH(entry)          ((entry).opcode / 1000)
+#define T_LOW(entry)           ((entry).opcode % 1000)
+#define L_SPEAK(loc)           ((loc) - 500)
+
 extern const location_t locations[];
 extern const object_t objects[];
 extern const char* arbitrary_messages[];