Switch fully over to YAML generation of condition bits. COND is gone.
authorEric S. Raymond <esr@thyrsus.com>
Thu, 22 Jun 2017 21:28:39 +0000 (17:28 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Thu, 22 Jun 2017 21:28:39 +0000 (17:28 -0400)
actions.c
advent.h
dungeon.c
init.c
main.c
newdungeon.py

index 45dd8b66fe11ed0ac1bdec3a93690a9d727846d0..a17abdee82a7d5e6ce0899dd679c9c9191ba55d1 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -552,7 +552,7 @@ int fill(token_t verb, token_t obj)
     if (LIQUID() != 0)
         spk = BOTTLE_FULL;
     if (spk == BOTTLED_WATER) {
-        game.prop[BOTTLE] = MOD(COND[game.loc], 4) / 2 * 2;
+        game.prop[BOTTLE] = MOD(conditions[game.loc], 4) / 2 * 2;
         k = LIQUID();
         if (TOTING(BOTTLE))
             game.place[k] = CARRIED;
index 979196f80a3a31129d2cb6159a8c6b7fb28766e2..f52ea8e3ea4b432c3636a1bf79452e0c8cb2d516 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -149,10 +149,10 @@ extern int restore(FILE *);
 #define HERE(OBJ)      (AT(OBJ) || TOTING(OBJ))
 #define LIQ2(PBOTL)    ((1-(PBOTL))*WATER+((PBOTL)/2)*(WATER+OIL))
 #define LIQUID()       (LIQ2(game.prop[BOTTLE]<0 ? -1-game.prop[BOTTLE] : game.prop[BOTTLE]))
-#define LIQLOC(LOC)    (LIQ2((MOD(COND[LOC]/2*2,8)-5)*MOD(COND[LOC]/4,2)+1))
-#define CNDBIT(L,N)    (TSTBIT(COND[L],N))
-#define FORCED(LOC)    (COND[LOC] == 2)
-#define DARK(DUMMY)    ((!CNDBIT(game.loc,COND_LIT)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
+#define LIQLOC(LOC)    (LIQ2((MOD(conditions[LOC]/2*2,8)-5)*MOD(conditions[LOC]/4,2)+1))
+#define CNDBIT(L,N)    (TSTBIT(conditions[L],N))
+#define FORCED(LOC)    (conditions[LOC] == 2)
+#define DARK(DUMMY)    ((!TSTBIT(conditions[game.loc],COND_LIT)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
 #define PCT(N)         (randrange(100) < (N))
 #define GSTONE(OBJ)    ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
 #define FOREST(LOC)    ((LOC) >= LOC_FOREST1 && (LOC) <= LOC_FOREST22)
index 997b49ecff7b4b472b7aaa721b715f4c9b8626e0..f34cf129cc2a183eff17e3938451520b813ab111 100644 (file)
--- a/dungeon.c
+++ b/dungeon.c
@@ -40,7 +40,6 @@ long OBJSND[NOBJECTS + 1];
 long OBJTXT[NOBJECTS + 1];
 long STEXT[LOCSIZ + 1];
 long LTEXT[LOCSIZ + 1];
-long COND[LOCSIZ + 1];
 long KEY[LOCSIZ + 1];
 long LOCSND[LOCSIZ + 1];
 long LINES[LINSIZ + 1];
@@ -300,16 +299,14 @@ static void read_action_verb_message_nr(FILE* database)
     }
 }
 
-/*  Read info about available liquids and other conditions, store in COND. */
+/*  Read info about available liquids and other conditions. */
 static void read_conditions(FILE* database)
 {
     long K;
     while ((K = GETNUM(database)) != -1) {
         long loc;
         while ((loc = GETNUM(NULL)) != 0) {
-            if (is_set(COND[loc], K))
-                BUG(LOCATION_HAS_CONDITION_BIT_BEING_SET_TWICE);
-            COND[loc] = COND[loc] + (1L << K);
+           continue;   /* COND is no longer used */
         }
     }
 }
@@ -360,8 +357,7 @@ static int read_database(FILE* database)
      *  location N.  LTEXT(N) is long description.  PTEXT(N) points to
      *  message for game.prop(N)=0.  Successive prop messages are
      *  found by chasing pointers.  RTEXT contains section 6's stuff.
-     *  TTEXT is for section 14.  We also clear COND (see description
-     *  of section 9 for details). */
+     *  TTEXT is for section 14. */
     for (int I = 1; I <= NOBJECTS; I++) {
         PTEXT[I] = 0;
         OBJSND[I] = 0;
@@ -373,7 +369,6 @@ static int read_database(FILE* database)
     for (int I = 1; I <= LOCSIZ; I++) {
         STEXT[I] = 0;
         LTEXT[I] = 0;
-        COND[I] = 0;
         KEY[I] = 0;
         LOCSND[I] = 0;
     }
@@ -440,8 +435,7 @@ static int read_database(FILE* database)
 /*  Finish constructing internal data format */
 
 /*  Having read in the database, certain things are now constructed.
- *  game.propS are set to zero.  We finish setting up COND by checking for
- *  forced-motion travel entries.  The PLAC and FIXD arrays are used
+ *  game.propS are set to zero.    The PLAC and FIXD arrays are used
  *  to set up game.atloc(N) as the first object at location N, and
  *  game.link(OBJ) as the next object at the same location as OBJ.
  *  (OBJ>NOBJECTS indicates that game.fixed(OBJ-NOBJECTS)=LOC; game.link(OBJ) is
@@ -488,7 +482,6 @@ static void write_file(FILE* header_file)
     // content variables
     write_1d(header_file, OBJSND, NOBJECTS + 1, "OBJSND");
     write_1d(header_file, OBJTXT, NOBJECTS + 1, "OBJTXT");
-    write_1d(header_file, COND, LOCSIZ + 1, "COND");
     write_1d(header_file, KEY, LOCSIZ + 1, "KEY");
     write_1d(header_file, LOCSND, LOCSIZ + 1, "LOCSND");
     write_1d(header_file, TRAVEL, TRVSIZ + 1, "TRAVEL");
diff --git a/init.c b/init.c
index 76bdc8ae21732c08e4449120769f81a8149e4aa6..5ae974f5dc10ae17e05c729f40c551528d4a64fd 100644 (file)
--- a/init.c
+++ b/init.c
@@ -184,7 +184,8 @@ void initialise(void)
         game.abbrev[i] = 0;
         if (!(locations[i].description.big == 0 || KEY[i] == 0)) {
             int k = KEY[i];
-            if (MOD(labs(TRAVEL[k]), 1000) == 1)COND[i] = 2;
+            if (MOD(labs(TRAVEL[k]), 1000) == 1)
+               conditions[i] = 2;
         }
         game.atloc[i] = 0;
     }
@@ -376,4 +377,17 @@ void initialise(void)
     game.clshnt = false;
     game.novice = false;
     game.blklin = true;
+
+#ifdef ODEBUG
+# define NEWFLAGS      ((1<<COND_ABOVE)|(1<<COND_FOREST)|(1<<COND_DEEP));
+    int mismatches = 0;
+    for (int i = 0; i < LOCSIZ; i++) {
+       long condbits = conditions[i] & ~NEWFLAGS;
+       if (condbits == COND[i] || COND[i] == 2 && condbits == 0)
+           continue;
+       ++mismatches;
+       printf("Mismatch at %ld: COND=%x consitions=%x\n", COND[i], condbits);
+    }
+    printf("%d condbit mismatches\n", mismatches);
+#endif
 }
diff --git a/main.c b/main.c
index debbb4670a310de8dc4f98d6332be88dfef578d5..90665c7b35a888b4bc0db37bf20ba052fbe56d68 100644 (file)
--- a/main.c
+++ b/main.c
@@ -188,7 +188,7 @@ static bool fallback_handler(char *buf)
  *  notes). */
 static void checkhints(void)
 {
-    if (COND[game.loc] >= game.conds) {
+    if (conditions[game.loc] >= game.conds) {
         for (int hint = 0; hint < HINT_COUNT; hint++) {
             if (game.hinted[hint])
                 continue;
index 092c342e52038588bc08550cc985fb3bbca5e4d0..624ea865ed30f8f5901701199a25a2f99aad0eb4 100755 (executable)
@@ -59,7 +59,7 @@ extern const class_t classes[];
 extern turn_threshold_t turn_thresholds[];
 extern obituary_t obituaries[];
 extern hint_t hints[];
-extern const long conditions[];
+extern long conditions[];
 
 extern const size_t CLSSES;
 extern const int maximum_deaths;
@@ -114,7 +114,7 @@ hint_t hints[] = {{
 {}
 }};
 
-const long conditions[] = {{
+long conditions[] = {{
 {}
 }};