Fixed feed command and white space in tests
[open-adventure.git] / actions.c
index d5d6446e4c415324951a9cdc62ad22810bc03a75..5ead1f22d234ed0e259a3d5981c09af74829ff8d 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -6,13 +6,6 @@
 
 static int fill(token_t, token_t);
 
-static void state_change(long obj, long state)
-/* Object must have a change-message list for this to be useful; only some do */
-{
-    game.prop[obj] = state;
-    pspeak(obj, change, state, true);
-}
-
 static int attack(struct command_t *command)
 /*  Attack.  Assume target if unambiguous.  "Throw" also links here.
  *  Attackable objects fall into two categories: enemies (snake,
@@ -303,7 +296,8 @@ static int vcarry(token_t verb, token_t obj)
     }
 
     if (game.fixed[obj] != IS_FREE) {
-        if (obj == PLANT && game.prop[PLANT] <= 0) { // FIXME: magical state assertion
+        /* Next guard tests whether plant is tiny or stashed */
+        if (obj == PLANT && game.prop[PLANT] <= PLANT_THIRSTY) {
             rspeak(DEEP_ROOTS);
             return GO_CLEAROBJ;
         }
@@ -475,7 +469,7 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
                 rspeak(spk);
                 if (spk != RUG_WIGGLES) {
                     /* FIXME: Arithmetic on state numbers */
-                    int k = 2 - game.prop[RUG];
+                    int k = (game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER;
                     game.prop[RUG] = k;
                     if (k == RUG_HOVER)
                         k = objects[SAPPH].plac;
@@ -502,9 +496,9 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
                    game.loc == objects[PILLOW].plac) {
             rspeak(OK_MAN);
         } else {
-           state_change(VASE, AT(PILLOW)
-                        ? VASE_WHOLE
-                        : VASE_DROPPED);
+            state_change(VASE, AT(PILLOW)
+                         ? VASE_WHOLE
+                         : VASE_DROPPED);
             if (game.prop[VASE] != VASE_WHOLE)
                 game.fixed[VASE] = IS_FIXED;
         }
@@ -546,9 +540,8 @@ static int drink(token_t verb, token_t obj)
         return GO_CLEAROBJ;
     }
     if (LIQUID() == WATER && HERE(BOTTLE)) {
-        game.prop[BOTTLE] = EMPTY_BOTTLE;
         game.place[WATER] = LOC_NOWHERE;
-        rspeak(BOTTLE_EMPTY);
+        state_change(BOTTLE, EMPTY_BOTTLE);
         return GO_CLEAROBJ;
     }
 
@@ -631,46 +624,58 @@ static int feed(token_t verb, token_t obj)
 /*  Feed.  If bird, no seed.  Snake, dragon, troll: quip.  If dwarf, make him
  *  mad.  Bear, special. */
 {
-    int spk = actions[verb].message;
-    if (obj == BIRD) {
+    switch (obj) {
+    case BIRD:
         rspeak(BIRD_PINING);
-        return GO_CLEAROBJ;
-    } else if (obj == SNAKE ||
-               obj == DRAGON ||
-               obj == TROLL) {
-        spk = NOTHING_EDIBLE;
-        if (obj == DRAGON && game.prop[DRAGON] != DRAGON_BARS)
-            spk = RIDICULOUS_ATTEMPT;
-        if (obj == TROLL)
-            spk = TROLL_VICES;
-        if (obj == SNAKE && !game.closed && HERE(BIRD)) {
+        break;
+
+    case DRAGON:
+        if (game.prop[DRAGON] != DRAGON_BARS)
+            rspeak(RIDICULOUS_ATTEMPT);
+        else
+            rspeak(NOTHING_EDIBLE);
+        break;
+    case SNAKE:
+        if (!game.closed && HERE(BIRD)) {
             DESTROY(BIRD);
-            spk = BIRD_DEVOURED;
-        }
-    } else if (obj == DWARF) {
+            rspeak(BIRD_DEVOURED);
+        } else
+            rspeak(NOTHING_EDIBLE);
+        break;
+    case TROLL:
+        rspeak(TROLL_VICES);
+        break;
+    case DWARF:
         if (HERE(FOOD)) {
             game.dflag += 2;
-            spk = REALLY_MAD;
+            rspeak(REALLY_MAD);
+        } else
+            rspeak(actions[verb].message);
+        break;
+    case BEAR:
+        if (game.prop[BEAR] == BEAR_DEAD) {
+            rspeak(RIDICULOUS_ATTEMPT);
+            break;
         }
-    } else if (obj == BEAR) {
-        if (game.prop[BEAR] == UNTAMED_BEAR)
-            spk = NOTHING_EDIBLE;
-        if (game.prop[BEAR] == BEAR_DEAD)
-            spk = RIDICULOUS_ATTEMPT;
-        if (HERE(FOOD)) {
-            DESTROY(FOOD);
-            game.prop[BEAR] = SITTING_BEAR;
-            game.fixed[AXE] = IS_FREE;
-            game.prop[AXE] = AXE_HERE;
-            spk = BEAR_TAMED;
+        if (game.prop[BEAR] == UNTAMED_BEAR) {
+            if (HERE(FOOD)) {
+                DESTROY(FOOD);
+                game.fixed[AXE] = IS_FREE;
+                game.prop[AXE] = AXE_HERE;
+                state_change(BEAR, SITTING_BEAR);
+            } else
+                rspeak(NOTHING_EDIBLE);
         }
-    } else if (obj == OGRE) {
+        break;
+    case OGRE:
         if (HERE(FOOD))
-            spk = OGRE_FULL;
-    } else {
-        spk = AM_GAME;
+            rspeak(OGRE_FULL);
+        else
+            rspeak(actions[verb].message);
+        break;
+    default:
+        rspeak(AM_GAME);
     }
-    rspeak(spk);
     return GO_CLEAROBJ;
 }
 
@@ -741,13 +746,11 @@ int fill(token_t verb, token_t obj)
         return GO_CLEAROBJ;
     }
 
-    game.prop[BOTTLE] = (LIQLOC(game.loc) == OIL) ? OIL_BOTTLE : WATER_BOTTLE;
+    state_change(BOTTLE, (LIQLOC(game.loc) == OIL)
+                 ? OIL_BOTTLE
+                 : WATER_BOTTLE);
     if (TOTING(BOTTLE))
         game.place[LIQUID()] = CARRIED;
-    if (LIQUID() == OIL)
-        rspeak(BOTTLED_OIL);
-    else
-        rspeak(BOTTLED_WATER);
     return GO_CLEAROBJ;
 }
 
@@ -805,10 +808,10 @@ static int fly(token_t verb, token_t obj)
     /* FIXME: Arithmetic on location values */
     game.newloc = game.place[RUG] + game.fixed[RUG] - game.loc;
 
-    if (game.prop[SAPPH] >= 0) {
-        rspeak(RUG_RETURNS);
-    } else {
+    if (game.prop[SAPPH] == STATE_NOTFOUND) {
         rspeak(RUG_GOES);
+    } else {
+        rspeak(RUG_RETURNS);
     }
     return GO_TERMINATE;
 }
@@ -871,7 +874,7 @@ static int light(token_t verb, token_t obj)
 }
 
 static int listen(void)
-/*  Listen.  Intransitive only.  Print stuff based on objsnd/locsnd. */
+/*  Listen.  Intransitive only.  Print stuff based on object sound proprties. */
 {
     long sound = locations[game.loc].sound;
     if (sound != SILENT) {
@@ -891,8 +894,7 @@ static int listen(void)
         long packed_zzword = token_to_packed(game.zzword);
         pspeak(i, hear, mi, true, packed_zzword);
         rspeak(NO_MESSAGE);
-        /* FIXME: Magic number, sensitive to bird state logic */
-        if (i == BIRD && game.prop[i] == 5)
+        if (i == BIRD && mi == BIRD_ENDSTATE)
             DESTROY(BIRD);
         return GO_CLEAROBJ;
     }