Name the lamp, grate, and bird states.
authorEric S. Raymond <esr@thyrsus.com>
Fri, 23 Jun 2017 18:21:25 +0000 (14:21 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Fri, 23 Jun 2017 18:59:32 +0000 (14:59 -0400)
actions.c
advent.h
adventure.yaml
main.c

index 0f7ece8e6c17ed69a3deeb4196204e65ac099ba1..4cfcbdcd4f2b709ba538ef8a36aa51dcc02b1c79 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -42,7 +42,6 @@ static int attack(FILE *input, struct command_t *command)
             return GO_CLEAROBJ;
         }
         DESTROY(BIRD);
             return GO_CLEAROBJ;
         }
         DESTROY(BIRD);
-        game.prop[BIRD] = 0;
         spk = BIRD_DEAD;
     } else if (obj == VEND) {
         pspeak(VEND, game.prop[VEND] + 2);
         spk = BIRD_DEAD;
     } else if (obj == VEND) {
         pspeak(VEND, game.prop[VEND] + 2);
@@ -259,8 +258,8 @@ static int carry(token_t verb, token_t obj)
     if (game.holdng >= INVLIMIT) {
         rspeak(spk);
         return GO_CLEAROBJ;
     if (game.holdng >= INVLIMIT) {
         rspeak(spk);
         return GO_CLEAROBJ;
-    } else if (obj == BIRD && game.prop[BIRD] != 1 && -1 - game.prop[BIRD] != 1) {
-        if (game.prop[BIRD] == 2) {
+    } else if (obj == BIRD && game.prop[BIRD] != BIRD_CAGED && -1 - game.prop[BIRD] != BIRD_CAGED) {
+        if (game.prop[BIRD] == BIRD_FOREST_UNCAGED) {
             DESTROY(BIRD);
             rspeak(BIRD_CRAP);
             return GO_CLEAROBJ;
             DESTROY(BIRD);
             rspeak(BIRD_CRAP);
             return GO_CLEAROBJ;
@@ -271,9 +270,9 @@ static int carry(token_t verb, token_t obj)
             rspeak(spk);
             return GO_CLEAROBJ;
         }
             rspeak(spk);
             return GO_CLEAROBJ;
         }
-        game.prop[BIRD] = 1;
+        game.prop[BIRD] = BIRD_CAGED;
     }
     }
-    if ((obj == BIRD || obj == CAGE) && (game.prop[BIRD] == 1 || -1 - game.prop[BIRD] == 1))
+    if ((obj == BIRD || obj == CAGE) && (game.prop[BIRD] == BIRD_CAGED || -1 - game.prop[BIRD] == 1))
         CARRY(BIRD + CAGE - obj, game.loc);
     CARRY(obj, game.loc);
     if (obj == BOTTLE && LIQUID() != 0)
         CARRY(BIRD + CAGE - obj, game.loc);
     CARRY(obj, game.loc);
     if (obj == BOTTLE && LIQUID() != 0)
@@ -362,7 +361,6 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
         } else if (obj == BIRD && AT(DRAGON) && game.prop[DRAGON] == 0) {
             rspeak(BIRD_BURNT);
             DESTROY(BIRD);
         } else if (obj == BIRD && AT(DRAGON) && game.prop[DRAGON] == 0) {
             rspeak(BIRD_BURNT);
             DESTROY(BIRD);
-            game.prop[BIRD] = 0;
             return GO_CLEAROBJ;
         } else if (obj == BEAR && AT(TROLL)) {
             rspeak(TROLL_SCAMPERS);
             return GO_CLEAROBJ;
         } else if (obj == BEAR && AT(TROLL)) {
             rspeak(TROLL_SCAMPERS);
@@ -385,11 +383,13 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
     if (k == obj)obj = BOTTLE;
     if (obj == BOTTLE && k != 0)
         game.place[k] = LOC_NOWHERE;
     if (k == obj)obj = BOTTLE;
     if (obj == BOTTLE && k != 0)
         game.place[k] = LOC_NOWHERE;
-    if (obj == CAGE && game.prop[BIRD] == 1)DROP(BIRD, game.loc);
+    if (obj == CAGE && game.prop[BIRD] == BIRD_CAGED)
+       DROP(BIRD, game.loc);
     DROP(obj, game.loc);
     if (obj != BIRD) return GO_CLEAROBJ;
     DROP(obj, game.loc);
     if (obj != BIRD) return GO_CLEAROBJ;
-    game.prop[BIRD] = 0;
-    if (FOREST(game.loc))game.prop[BIRD] = 2;
+    game.prop[BIRD] = BIRD_UNCAGED;
+    if (FOREST(game.loc))
+       game.prop[BIRD] = BIRD_FOREST_UNCAGED;
     return GO_CLEAROBJ;
 }
 
     return GO_CLEAROBJ;
 }
 
@@ -445,7 +445,8 @@ static int extinguish(token_t verb, int obj)
 {
     int spk = ACTSPK[verb];
     if (obj == INTRANSITIVE) {
 {
     int spk = ACTSPK[verb];
     if (obj == INTRANSITIVE) {
-        if (HERE(LAMP) && game.prop[LAMP] == 1)obj = LAMP;
+        if (HERE(LAMP) && game.prop[LAMP] == LAMP_BRIGHT)
+           obj = LAMP;
         if (HERE(URN) && game.prop[URN] == 2)obj = obj * NOBJECTS + URN;
         if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN;
     }
         if (HERE(URN) && game.prop[URN] == 2)obj = obj * NOBJECTS + URN;
         if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN;
     }
@@ -454,7 +455,7 @@ static int extinguish(token_t verb, int obj)
         game.prop[URN] = game.prop[URN] / 2;
         spk = URN_DARK;
     } else if (obj == LAMP) {
         game.prop[URN] = game.prop[URN] / 2;
         spk = URN_DARK;
     } else if (obj == LAMP) {
-        game.prop[LAMP] = 0;
+        game.prop[LAMP] = LAMP_DARK;
         rspeak(LAMP_OFF);
         spk = DARK(game.loc) ? PITCH_DARK : NO_MESSAGE;
     } else if (obj == DRAGON || obj == VOLCANO)
         rspeak(LAMP_OFF);
         spk = DARK(game.loc) ? PITCH_DARK : NO_MESSAGE;
     } else if (obj == DRAGON || obj == VOLCANO)
@@ -477,7 +478,6 @@ static int feed(token_t verb, token_t obj)
         if (obj == TROLL)spk = TROLL_VICES;
         if (obj == SNAKE && !game.closed && HERE(BIRD)) {
             DESTROY(BIRD);
         if (obj == TROLL)spk = TROLL_VICES;
         if (obj == SNAKE && !game.closed && HERE(BIRD)) {
             DESTROY(BIRD);
-            game.prop[BIRD] = 0;
             spk = BIRD_DEVOURED;
         }
     } else if (obj == DWARF) {
             spk = BIRD_DEVOURED;
         }
     } else if (obj == DWARF) {
@@ -638,7 +638,8 @@ static int light(token_t verb, token_t obj)
 {
     int spk = ACTSPK[verb];
     if (obj == INTRANSITIVE) {
 {
     int spk = ACTSPK[verb];
     if (obj == INTRANSITIVE) {
-        if (HERE(LAMP) && game.prop[LAMP] == 0 && game.limit >= 0)obj = LAMP;
+        if (HERE(LAMP) && game.prop[LAMP] == LAMP_DARK && game.limit >= 0)
+           obj = LAMP;
         if (HERE(URN) && game.prop[URN] == 1)obj = obj * NOBJECTS + URN;
         if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN;
     }
         if (HERE(URN) && game.prop[URN] == 1)obj = obj * NOBJECTS + URN;
         if (obj == INTRANSITIVE || obj == 0 || obj > NOBJECTS) return GO_UNKNOWN;
     }
@@ -661,7 +662,7 @@ static int light(token_t verb, token_t obj)
             rspeak(spk);
             return GO_CLEAROBJ;
         }
             rspeak(spk);
             return GO_CLEAROBJ;
         }
-        game.prop[LAMP] = 1;
+        game.prop[LAMP] = LAMP_BRIGHT;
         rspeak(LAMP_ON);
         if (game.wzdark)
             return GO_TOP;
         rspeak(LAMP_ON);
         if (game.wzdark)
             return GO_TOP;
@@ -731,7 +732,7 @@ static int lock(token_t verb, token_t obj)
                 if (!game.panic)game.clock2 = PANICTIME;
                 game.panic = true;
             } else {
                 if (!game.panic)game.clock2 = PANICTIME;
                 game.panic = true;
             } else {
-                game.prop[GRATE] = (verb == LOCK) ? 0 : 1;
+                game.prop[GRATE] = (verb == LOCK) ? GRATE_CLOSED : GRATE_OPEN;
                 spk = game.prop[GRATE] ? GRATE_UNLOCKED : GRATE_LOCKED;
             }
         }
                 spk = game.prop[GRATE] ? GRATE_UNLOCKED : GRATE_LOCKED;
             }
         }
@@ -968,7 +969,9 @@ static int wave(token_t verb, token_t obj)
         rspeak(spk);
         return GO_CLEAROBJ;
     }
         rspeak(spk);
         return GO_CLEAROBJ;
     }
-    if (HERE(BIRD))spk = FREE_FLY + MOD(game.prop[BIRD], 2);
+    /* FIXME: Arithemetic on proprty values */
+    if (HERE(BIRD))
+       spk = FREE_FLY + MOD(game.prop[BIRD], 2);
     if (spk == FREE_FLY && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
         DROP(JADE, game.loc);
         game.prop[JADE] = 0;
     if (spk == FREE_FLY && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
         DROP(JADE, game.loc);
         game.prop[JADE] = 0;
index f231569f5620ec7ae7467d14940748b99cec42a9..b642fbf6dccf26441cfd053d2ae91060f495f800 100644 (file)
--- a/advent.h
+++ b/advent.h
@@ -152,7 +152,7 @@ extern int restore(FILE *);
 #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)    CNDBIT(LOC, COND_FORCED)
 #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)    CNDBIT(LOC, COND_FORCED)
-#define DARK(DUMMY)    ((!TSTBIT(conditions[game.loc],COND_LIT)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
+#define DARK(DUMMY)    ((!TSTBIT(conditions[game.loc],COND_LIT)) && (game.prop[LAMP] == LAMP_DARK || !HERE(LAMP)))
 #define PCT(N)         (randrange(100) < (N))
 #define GSTONE(OBJ)    ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
 #define FOREST(LOC)    CNDBIT(LOC, COND_FOREST)
 #define PCT(N)         (randrange(100) < (N))
 #define GSTONE(OBJ)    ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
 #define FOREST(LOC)    CNDBIT(LOC, COND_FOREST)
index f5df5c00f0c754cf5cf30ac2dd41b41987505b18..0d44671efbe8df1c31b2df62043cf8c4bb0bcbfe 100644 (file)
@@ -1484,13 +1484,13 @@ object_descriptions: !!omap
 - OBJ_2:
     inventory: 'Brass lantern'
     longs:
 - OBJ_2:
     inventory: 'Brass lantern'
     longs:
-    - 'There is a shiny brass lamp nearby.'
-    - 'There is a lamp shining nearby.'
+    - [LAMP_DARK, 'There is a shiny brass lamp nearby.']
+    - [LAMP_BRIGHT, 'There is a lamp shining nearby.']
 - OBJ_3:
     inventory: '*grate'
     longs:
 - OBJ_3:
     inventory: '*grate'
     longs:
-    - 'The grate is locked.'
-    - 'The grate is open.'
+    - [GRATE_CLOSED, 'The grate is locked.']
+    - [GRATE_OPEN, 'The grate is open.']
 - OBJ_4:
     inventory: 'Wicker cage'
     longs:
 - OBJ_4:
     inventory: 'Wicker cage'
     longs:
@@ -1511,9 +1511,9 @@ object_descriptions: !!omap
 - OBJ_8:
     inventory: 'Little bird in cage'
     longs:
 - OBJ_8:
     inventory: 'Little bird in cage'
     longs:
-    - 'A cheerful little bird is sitting here singing.'
-    - 'There is a little bird in the cage.'
-    - 'A cheerful little bird is sitting here singing.'
+    - [BIRD_UNCAGED, 'A cheerful little bird is sitting here singing.']
+    - [BIRD_CAGED, 'There is a little bird in the cage.']
+    - [BIRD_FOREST_UNCAGED, 'A cheerful little bird is sitting here singing.']
     - 'The bird''s singing is quite melodious.'
     - 'The bird does not seem inclined to sing while in the cage.'
     - 'It almost seems as though the bird is trying to tell you something.'
     - 'The bird''s singing is quite melodious.'
     - 'The bird does not seem inclined to sing while in the cage.'
     - 'It almost seems as though the bird is trying to tell you something.'
diff --git a/main.c b/main.c
index 3c4c034bfb94d2655812ffeeea4c56564525122a..cbcd45c4f0a7cc61bb60f3cc1ea049fe9553df4d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -203,7 +203,7 @@ static void checkhints(void)
                 switch (hint) {
                 case 0:
                     /* cave */
                 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;
                         break;
                     game.hintlc[hint] = 0;
                     return;
@@ -303,7 +303,7 @@ static bool spotted_by_pirate(int i)
         }
     }
     /* Force chest placement before player finds last treasure */
         }
     }
     /* 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;
     }
         rspeak(PIRATE_SPOTTED);
         movechest = true;
     }
@@ -501,7 +501,7 @@ static void croak(void)
     else {
         game.place[WATER] = game.place[OIL] = LOC_NOWHERE;
         if (TOTING(LAMP))
     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)) {
         for (int j = 1; j <= NOBJECTS; j++) {
             int i = NOBJECTS + 1 - j;
             if (TOTING(i)) {
@@ -761,7 +761,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) {
      *  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;
         game.prop[FISSURE] = 0;
         for (int i = 1; i <= NDWARVES; i++) {
             game.dseen[i] = false;
@@ -839,7 +839,7 @@ static bool closecheck(void)
 static void lampcheck(void)
 /* Check game limit and lamp timers */
 {
 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
         --game.limit;
 
     /*  Another way we can force an end to things is by having the
@@ -857,7 +857,7 @@ static void lampcheck(void)
         game.lmwarn = false;
     } else if (game.limit == 0) {
         game.limit = -1;
         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) {
         if (HERE(LAMP))
             rspeak(LAMP_OUT);
     } else if (game.limit <= WARNTIME) {