Elimination of OBJSND.
[open-adventure.git] / actions.c
index caf20eee0e084a138907f260538581bb47f992f0..16ed7ca7f35b1cc52f69764ae78305e74b038030 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -42,11 +42,11 @@ static int attack(FILE *input, struct command_t *command)
             return GO_CLEAROBJ;
         }
         DESTROY(BIRD);
-        game.prop[BIRD] = 0;
         spk = BIRD_DEAD;
     } else if (obj == VEND) {
-        pspeak(VEND, game.prop[VEND] + 2);
-        game.prop[VEND] = 3 - game.prop[VEND];
+       bool blocking = (game.prop[VEND] == VEND_BLOCKS);
+        game.prop[VEND] = blocking ? VEND_UNBLOCKS : VEND_BLOCKS;
+        rspeak(blocking ? MACHINE_SWINGOUT : MACHINE_SWINGBACK);
         return GO_CLEAROBJ;
     }
 
@@ -83,7 +83,7 @@ static int attack(FILE *input, struct command_t *command)
         GETIN(input, &command->wd1, &command->wd1x, &command->wd2, &command->wd2x);
         if (command->wd1 != MAKEWD(WORD_YINIT) && command->wd1 != MAKEWD(WORD_YES))
             return GO_CHECKFOO;
-        pspeak(DRAGON, 3);
+        pspeak(DRAGON, look, 3);
         game.prop[DRAGON] = 1;
         game.prop[RUG] = 0;
         int k = (PLAC[DRAGON] + FIXD[DRAGON]) / 2;
@@ -112,7 +112,7 @@ static int bigwords(token_t foo)
     int k = VOCAB(foo, 3);
     int spk = NOTHING_HAPPENS;
     if (game.foobar != 1 - k) {
-        if (game.foobar != 0)spk = START_OVER;
+        if (game.foobar != 0 && game.loc == LOC_GIANTROOM)spk = START_OVER;
         rspeak(spk);
         return GO_CLEAROBJ;
     } else {
@@ -134,7 +134,7 @@ static int bigwords(token_t foo)
             if (HERE(EGGS))k = 1;
             if (game.loc == PLAC[EGGS])k = 0;
             MOVE(EGGS, PLAC[EGGS]);
-            pspeak(EGGS, k);
+            pspeak(EGGS, look, k);
             return GO_CLEAROBJ;
         }
     }
@@ -242,10 +242,11 @@ static int carry(token_t verb, token_t obj)
     }
     if (obj == WATER || obj == OIL) {
         if (!HERE(BOTTLE) || LIQUID() != obj) {
-            if (TOTING(BOTTLE) && game.prop[BOTTLE] == 1)
+            if (TOTING(BOTTLE) && game.prop[BOTTLE] == EMPTY_BOTTLE)
                 return (fill(verb, BOTTLE));
             else {
-                if (game.prop[BOTTLE] != 1)spk = BOTTLE_FULL;
+                if (game.prop[BOTTLE] != EMPTY_BOTTLE)
+                   spk = BOTTLE_FULL;
                 if (!TOTING(BOTTLE))spk = NO_CONTAINER;
                 rspeak(spk);
                 return GO_CLEAROBJ;
@@ -258,8 +259,8 @@ static int carry(token_t verb, token_t obj)
     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;
@@ -270,9 +271,9 @@ static int carry(token_t verb, token_t obj)
             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)
@@ -356,12 +357,11 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
         } else if (obj == COINS && HERE(VEND)) {
             DESTROY(COINS);
             DROP(BATTERY, game.loc);
-            pspeak(BATTERY, 0);
+            pspeak(BATTERY, look, FRESH_BATTERIES);
             return GO_CLEAROBJ;
         } 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);
@@ -376,7 +376,7 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
         } else {
             game.prop[VASE] = 2;
             if (AT(PILLOW))game.prop[VASE] = 0;
-            pspeak(VASE, game.prop[VASE] + 1);
+            pspeak(VASE, look, game.prop[VASE] + 1);
             if (game.prop[VASE] != 0)game.fixed[VASE] = -1;
         }
     }
@@ -384,11 +384,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 (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;
-    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;
 }
 
@@ -402,14 +404,14 @@ static int drink(token_t verb, token_t obj)
     if (obj != BLOOD) {
         if (obj != 0 && obj != WATER)spk = RIDICULOUS_ATTEMPT;
         if (spk != RIDICULOUS_ATTEMPT && LIQUID() == WATER && HERE(BOTTLE)) {
-            game.prop[BOTTLE] = 1;
+            game.prop[BOTTLE] = EMPTY_BOTTLE;
             game.place[WATER] = LOC_NOWHERE;
             spk = BOTTLE_EMPTY;
         }
     } else {
         DESTROY(BLOOD);
         game.prop[DRAGON] = 2;
-        OBJSND[BIRD] = OBJSND[BIRD] + 3;
+        game.blooded = true;
         spk = HEAD_BUZZES;
     }
     rspeak(spk);
@@ -444,7 +446,8 @@ static int extinguish(token_t verb, int obj)
 {
     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;
     }
@@ -453,7 +456,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[LAMP] = 0;
+        game.prop[LAMP] = LAMP_DARK;
         rspeak(LAMP_OFF);
         spk = DARK(game.loc) ? PITCH_DARK : NO_MESSAGE;
     } else if (obj == DRAGON || obj == VOLCANO)
@@ -476,7 +479,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);
-            game.prop[BIRD] = 0;
             spk = BIRD_DEVOURED;
         }
     } else if (obj == DWARF) {
@@ -534,7 +536,7 @@ int fill(token_t verb, token_t obj)
             return GO_CLEAROBJ;
         }
         game.place[k] = LOC_NOWHERE;
-        game.prop[BOTTLE] = 1;
+        game.prop[BOTTLE] = EMPTY_BOTTLE;
         if (k == OIL)game.prop[URN] = 1;
         spk = WATER_URN + game.prop[URN];
         rspeak(spk);
@@ -552,7 +554,8 @@ 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;
+       /* FIXME: Arithmetic on property values */
+        game.prop[BOTTLE] = MOD(conditions[game.loc], 4) / 2 * 2;
         k = LIQUID();
         if (TOTING(BOTTLE))
             game.place[k] = CARRIED;
@@ -621,7 +624,7 @@ static int inven(void)
         if (spk == NO_CARRY)
             rspeak(NOW_HOLDING);
         game.blklin = false;
-        pspeak(i, -1);
+        pspeak(i, touch, -1);
         game.blklin = true;
         spk = NO_MESSAGE;
     }
@@ -636,7 +639,8 @@ static int light(token_t verb, token_t obj)
 {
     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;
     }
@@ -659,7 +663,7 @@ static int light(token_t verb, token_t obj)
             rspeak(spk);
             return GO_CLEAROBJ;
         }
-        game.prop[LAMP] = 1;
+        game.prop[LAMP] = LAMP_BRIGHT;
         rspeak(LAMP_ON);
         if (game.wzdark)
             return GO_TOP;
@@ -671,20 +675,26 @@ static int light(token_t verb, token_t obj)
 static int listen(void)
 /*  Listen.  Intransitive only.  Print stuff based on objsnd/locsnd. */
 {
-    int k;
+    long k;
     int spk = ALL_SILENT;
-    k = LOCSND[game.loc];
-    if (k != 0) {
-        rspeak(labs(k));
-        if (k < 0) return GO_CLEAROBJ;
-        spk = NO_MESSAGE;
+    k = locations[game.loc].sound;
+    if (k != SILENT) {
+        rspeak(k);
+        if (locations[game.loc].loud)
+           return GO_CLEAROBJ;
+       else
+           spk = NO_MESSAGE;
     }
     for (int i = 1; i <= NOBJECTS; i++) {
-        if (!HERE(i) || OBJSND[i] == 0 || game.prop[i] < 0)
+        if (!HERE(i) || object_descriptions[i].sounds[0] == NULL || game.prop[i] < 0)
             continue;
-        pspeak(i, OBJSND[i] + game.prop[i], game.zzword);
+       int mi =  game.prop[i];
+       if (i == BIRD)
+           mi += 3 * game.blooded;
+        pspeak(i, hear, mi, game.zzword);
         spk = NO_MESSAGE;
-        if (i == BIRD && OBJSND[i] + game.prop[i] == 8)
+       /* FIXME: Magic number, sensitive to bird state logic */
+       if (i == BIRD && game.prop[i] == 5)
             DESTROY(BIRD);
     }
     rspeak(spk);
@@ -727,7 +737,7 @@ static int lock(token_t verb, token_t obj)
                 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;
             }
         }
@@ -754,7 +764,7 @@ static int pour(token_t verb, token_t obj)
     }
     if (HERE(URN) && game.prop[URN] == 0)
         return fill(verb, URN);
-    game.prop[BOTTLE] = 1;
+    game.prop[BOTTLE] = EMPTY_BOTTLE;
     game.place[obj] = LOC_NOWHERE;
     spk = GROUND_WET;
     if (!(AT(PLANT) || AT(DOOR))) {
@@ -767,7 +777,7 @@ static int pour(token_t verb, token_t obj)
             rspeak(spk);
             return GO_CLEAROBJ;
         }
-        pspeak(PLANT, game.prop[PLANT] + 3);
+        pspeak(PLANT, look, game.prop[PLANT] + 3);
         game.prop[PLANT] = MOD(game.prop[PLANT] + 1, 3);
         game.prop[PLANT2] = game.prop[PLANT];
         return GO_MOVE;
@@ -803,12 +813,12 @@ static int read(struct command_t command)
 
     if (DARK(game.loc)) {
         rspeak(NO_SEE, command.wd1, command.wd1x);
+    } else if (command.obj == OYSTER && !game.clshnt && game.closed) {
+        game.clshnt = YES(arbitrary_messages[CLUE_QUERY], arbitrary_messages[WAYOUT_CLUE], arbitrary_messages[OK_MAN]);
     } else if (OBJTXT[command.obj] == 0 || game.prop[command.obj] < 0) {
         rspeak(ACTSPK[command.verb]);
-    } else if (command.obj == OYSTER && !game.clshnt) {
-        game.clshnt = YES(arbitrary_messages[CLUE_QUERY], arbitrary_messages[WAYOUT_CLUE], arbitrary_messages[OK_MAN]);
     } else
-        pspeak(command.obj, OBJTXT[command.obj] + game.prop[command.obj]);
+        pspeak(command.obj, study, game.prop[command.obj]);
     return GO_CLEAROBJ;
 }
 
@@ -819,7 +829,7 @@ static int reservoir(void)
         rspeak(NOTHING_HAPPENS);
         return GO_CLEAROBJ;
     } else {
-        pspeak(RESER, game.prop[RESER] + 1);
+        pspeak(RESER, look, game.prop[RESER] + 1);
         game.prop[RESER] = 1 - game.prop[RESER];
         if (AT(RESER))
             return GO_CLEAROBJ;
@@ -964,7 +974,9 @@ static int wave(token_t verb, token_t obj)
         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;
@@ -983,7 +995,7 @@ static int wave(token_t verb, token_t obj)
         }
         if (HERE(BIRD))rspeak(spk);
         game.prop[FISSURE] = 1 - game.prop[FISSURE];
-        pspeak(FISSURE, 2 - game.prop[FISSURE]);
+        pspeak(FISSURE, look, 2 - game.prop[FISSURE]);
         return GO_CLEAROBJ;
     }
 }
@@ -1011,8 +1023,6 @@ int action(FILE *input, struct command_t *command)
             if (game.loc == LOC_COBBLE || game.loc == LOC_DEBRIS || game.loc == LOC_AWKWARD ||
                 game.loc == LOC_BIRD || game.loc == LOC_PITTOP)
                 command->obj = ENTRNC;
-            if (command->obj != GRATE)
-                return GO_MOVE;
         } else if (command->obj == DWARF && ATDWRF(game.loc) > 0)
             /* FALL THROUGH */;
         else if ((LIQUID() == command->obj && HERE(BOTTLE)) || command->obj == LIQLOC(game.loc))