Replace magic MINTRS/MAXTRS with a treasure attribute in YAML.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index debbb4670a310de8dc4f98d6332be88dfef578d5..069c8651c808ea312a150a4b9246713226a7a52a 100644 (file)
--- a/main.c
+++ b/main.c
@@ -188,8 +188,8 @@ static bool fallback_handler(char *buf)
  *  notes). */
 static void checkhints(void)
 {
-    if (COND[game.loc] >= game.conds) {
-        for (int hint = 0; hint < HINT_COUNT; hint++) {
+    if (conditions[game.loc] >= game.conds) {
+        for (int hint = 0; hint < NHINTS; hint++) {
             if (game.hinted[hint])
                 continue;
             if (!CNDBIT(game.loc, hint + 1 + COND_HBASE))
@@ -203,7 +203,7 @@ static void checkhints(void)
                 switch (hint) {
                 case 0:
                     /* cave */
-                    if (game.prop[GRATE] == 0 && !HERE(KEYS))
+                    if (game.prop[GRATE] == GRATE_CLOSED && !HERE(KEYS))
                         break;
                     game.hintlc[hint] = 0;
                     return;
@@ -289,7 +289,9 @@ static bool spotted_by_pirate(int i)
         return true;
     int snarfed = 0;
     bool movechest = false, robplayer = false;
-    for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
+    for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+       if (!object_descriptions[treasure].is_treasure)
+           continue;
         /*  Pirate won't take pyramid from plover room or dark
          *  room (too easy!). */
         if (treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD])) {
@@ -303,7 +305,7 @@ static bool spotted_by_pirate(int i)
         }
     }
     /* Force chest placement before player finds last treasure */
-    if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) {
+    if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == LAMP_BRIGHT) {
         rspeak(PIRATE_SPOTTED);
         movechest = true;
     }
@@ -323,7 +325,9 @@ static bool spotted_by_pirate(int i)
     }
     if (robplayer) {
         rspeak(PIRATE_POUNCES);
-        for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
+       for (int treasure = 1; treasure <= NOBJECTS; treasure++) {
+           if (!object_descriptions[treasure].is_treasure)
+               continue;
             if (!(treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD]))) {
                 if (AT(treasure) && game.fixed[treasure] == 0)
                     CARRY(treasure, game.loc);
@@ -468,7 +472,7 @@ static bool dwarfmove(void)
 /*  "You're dead, Jim."
  *
  *  If the current loc is zero, it means the clown got himself killed.
- *  We'll allow this maxdie times.  maximum_deaths is automatically set based
+ *  We'll allow this maxdie times.  NDEATHS is automatically set based
  *  on the number of snide messages available.  Each death results in
  *  a message (81, 83, etc.)  which offers reincarnation; if accepted,
  *  this results in message 82, 84, etc.  The last time, if he wants
@@ -496,12 +500,12 @@ static void croak(void)
          *  death and exit. */
         rspeak(DEATH_CLOSING);
         terminate(endgame);
-    } else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN]))
+    } else if (game.numdie == NDEATHS || !YES(query, yes_response, arbitrary_messages[OK_MAN]))
         terminate(endgame);
     else {
         game.place[WATER] = game.place[OIL] = LOC_NOWHERE;
         if (TOTING(LAMP))
-            game.prop[LAMP] = 0;
+            game.prop[LAMP] = LAMP_DARK;
         for (int j = 1; j <= NOBJECTS; j++) {
             int i = NOBJECTS + 1 - j;
             if (TOTING(i)) {
@@ -687,7 +691,7 @@ static bool playermove(token_t verb, int motion)
                      *  and block him.  (standard travel entries check for
                      *  game.prop(TROLL)=0.)  Special stuff for bear. */
                     if (game.prop[TROLL] == 1) {
-                        pspeak(TROLL, 1);
+                        pspeak(TROLL,look, 1);
                         game.prop[TROLL] = 0;
                         MOVE(TROLL2, 0);
                         MOVE(TROLL2 + NOBJECTS, 0);
@@ -761,7 +765,7 @@ static bool closecheck(void)
      *  know the bivalve is an oyster.  *And*, the dwarves must
      *  have been activated, since we've found chest. */
     if (game.clock1 == 0) {
-        game.prop[GRATE] = 0;
+        game.prop[GRATE] = GRATE_CLOSED;
         game.prop[FISSURE] = 0;
         for (int i = 1; i <= NDWARVES; i++) {
             game.dseen[i] = false;
@@ -799,10 +803,9 @@ static bool closecheck(void)
          *  objects he might be carrying (lest he have some which
          *  could cause trouble, such as the keys).  We describe the
          *  flash of light and trundle back. */
-        game.prop[BOTTLE] = PUT(BOTTLE, LOC_NE, 1);
+        game.prop[BOTTLE] = PUT(BOTTLE, LOC_NE, EMPTY_BOTTLE);
         game.prop[PLANT] = PUT(PLANT, LOC_NE, 0);
         game.prop[OYSTER] = PUT(OYSTER, LOC_NE, 0);
-        OBJTXT[OYSTER] = 3;
         game.prop[LAMP] = PUT(LAMP, LOC_NE, 0);
         game.prop[ROD] = PUT(ROD, LOC_NE, 0);
         game.prop[DWARF] = PUT(DWARF, LOC_NE, 0);
@@ -813,7 +816,7 @@ static bool closecheck(void)
          *  Reuse sign. */
         PUT(GRATE, LOC_SW, 0);
         PUT(SIGN, LOC_SW, 0);
-        ++OBJTXT[SIGN];
+        game.prop[SIGN] = ENDGAME_SIGN;
         game.prop[SNAKE] = PUT(SNAKE, LOC_SW, 1);
         game.prop[BIRD] = PUT(BIRD, LOC_SW, 1);
         game.prop[CAGE] = PUT(CAGE, LOC_SW, 0);
@@ -839,7 +842,7 @@ static bool closecheck(void)
 static void lampcheck(void)
 /* Check game limit and lamp timers */
 {
-    if (game.prop[LAMP] == 1)
+    if (game.prop[LAMP] == LAMP_BRIGHT)
         --game.limit;
 
     /*  Another way we can force an end to things is by having the
@@ -848,16 +851,16 @@ static void lampcheck(void)
      *  here, in which case we replace the batteries and continue.
      *  Second is for other cases of lamp dying.  Eve after it goes
      *  out, he can explore outside for a while if desired. */
-    if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == 0 && HERE(LAMP)) {
+    if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == FRESH_BATTERIES && HERE(LAMP)) {
         rspeak(REPLACE_BATTERIES);
-        game.prop[BATTERY] = 1;
+        game.prop[BATTERY] = DEAD_BATTERIES;
         if (TOTING(BATTERY))
             DROP(BATTERY, game.loc);
         game.limit += BATTERYLIFE;
         game.lmwarn = false;
     } else if (game.limit == 0) {
         game.limit = -1;
-        game.prop[LAMP] = 0;
+        game.prop[LAMP] = LAMP_DARK;
         if (HERE(LAMP))
             rspeak(LAMP_OUT);
     } else if (game.limit <= WARNTIME) {
@@ -865,7 +868,8 @@ static void lampcheck(void)
             game.lmwarn = true;
             int spk = GET_BATTERIES;
             if (game.place[BATTERY] == LOC_NOWHERE)spk = LAMP_DIM;
-            if (game.prop[BATTERY] == 1)spk = MISSING_BATTERYIES;
+            if (game.prop[BATTERY] == DEAD_BATTERIES)
+               spk = MISSING_BATTERIES;
             rspeak(spk);
         }
     }
@@ -912,7 +916,7 @@ static void listobjects(void)
             int kk = game.prop[obj];
             if (obj == STEPS && game.loc == game.fixed[STEPS])
                 kk = 1;
-            pspeak(obj, kk);
+            pspeak(obj, look, kk);
         }
     }
 }
@@ -999,7 +1003,7 @@ L2600:
          *  tick game.clock1 unless well into cave (and not at Y2). */
         if (game.closed) {
             if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
-                pspeak(OYSTER, 1);
+                pspeak(OYSTER, look, 1);
             for (size_t i = 1; i <= NOBJECTS; i++) {
                 if (TOTING(i) && game.prop[i] < 0)
                     game.prop[i] = -1 - game.prop[i];
@@ -1022,7 +1026,7 @@ L2607:
 
        /* If a turn threshold has been met, apply penalties and tell
         * the player about it. */
-       for (int i = 0; i < turn_threshold_count; ++i)
+       for (int i = 0; i < NTHRESHOLDS; ++i)
          {
            if (game.turns == turn_thresholds[i].threshold + 1)
              {