Refactored carry for clarity
[open-adventure.git] / actions.c
index 0e6dd7ad69836045cfb6d3785a070d773a4bfecf..3403fe58fb971a643e4de806020fff2af1d42a3f 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -236,13 +236,16 @@ static void blast(void)
         !game.closed)
         rspeak(REQUIRES_DYNAMITE);
     else {
-        if (HERE(ROD2))
-            game.bonus = SPLATTER_MESSAGE;
-        else if (game.loc == LOC_NE)
-            game.bonus = DEFEAT_MESSAGE;
-        else
-            game.bonus = VICTORY_MESSAGE;
-        rspeak(game.bonus);
+        if (HERE(ROD2)) {
+            game.bonus = splatter;
+            rspeak(SPLATTER_MESSAGE);
+        } else if (game.loc == LOC_NE) {
+            game.bonus = defeat;
+            rspeak(DEFEAT_MESSAGE);
+        } else {
+            game.bonus = victory;
+            rspeak(VICTORY_MESSAGE);
+        }
         terminate(endgame);
     }
 }
@@ -308,40 +311,35 @@ static int vcarry(verb_t verb, obj_t obj)
     }
 
     if (game.fixed[obj] != IS_FREE) {
-        /* Next guard tests whether plant is tiny or stashed */
-        if (obj == PLANT && game.prop[PLANT] <= PLANT_THIRSTY) {
-            rspeak(DEEP_ROOTS);
-            return GO_CLEAROBJ;
-        }
-        if (obj == BEAR && game.prop[BEAR] == SITTING_BEAR) {
-            rspeak(BEAR_CHAINED);
-            return GO_CLEAROBJ;
-        }
-        if (obj == CHAIN && game.prop[BEAR] != UNTAMED_BEAR) {
-            rspeak(STILL_LOCKED);
-            return GO_CLEAROBJ;
-        }
-        if (obj == URN) {
+        switch (obj) {
+        case PLANT:
+            /* Next guard tests whether plant is tiny or stashed */
+            rspeak(game.prop[PLANT] <= PLANT_THIRSTY ? DEEP_ROOTS : YOU_JOKING);
+            break;
+        case BEAR:
+            rspeak( game.prop[BEAR] == SITTING_BEAR ? BEAR_CHAINED : YOU_JOKING);
+            break;
+        case CHAIN:
+            rspeak( game.prop[BEAR] != UNTAMED_BEAR ? STILL_LOCKED : YOU_JOKING);
+            break;
+        case RUG:
+            rspeak(game.prop[RUG] == RUG_HOVER ? RUG_HOVERS : YOU_JOKING);
+            break;
+        case URN:
             rspeak(URN_NOBUDGE);
-            return GO_CLEAROBJ;
-        }
-        if (obj == CAVITY) {
+            break;
+        case CAVITY:
             rspeak(DOUGHNUT_HOLES);
-            return GO_CLEAROBJ;
-        }
-        if (obj == BLOOD) {
+            break;
+        case BLOOD:
             rspeak(FEW_DROPS);
-            return GO_CLEAROBJ;
-        }
-        if (obj == RUG && game.prop[RUG] == RUG_HOVER) {
-            rspeak(RUG_HOVERS);
-            return GO_CLEAROBJ;
-        }
-        if (obj == SIGN) {
+            break;
+        case SIGN:
             rspeak(HAND_PASSTHROUGH);
-            return GO_CLEAROBJ;
+            break;
+        default:
+            rspeak(YOU_JOKING);
         }
-        rspeak(YOU_JOKING);
         return GO_CLEAROBJ;
     }
 
@@ -349,14 +347,14 @@ static int vcarry(verb_t verb, obj_t obj)
         obj == OIL) {
         if (!HERE(BOTTLE) ||
             LIQUID() != obj) {
-            if (TOTING(BOTTLE)) {
-                if (game.prop[BOTTLE] == EMPTY_BOTTLE) {
-                    return (fill(verb, BOTTLE));
-                } else if (game.prop[BOTTLE] != EMPTY_BOTTLE)
-                    rspeak(BOTTLE_FULL);
+            if (!TOTING(BOTTLE)) {
+                rspeak(NO_CONTAINER);
                 return GO_CLEAROBJ;
             }
-            rspeak(NO_CONTAINER);
+            if (game.prop[BOTTLE] == EMPTY_BOTTLE) {
+                return (fill(verb, BOTTLE));
+            } else
+                rspeak(BOTTLE_FULL);
             return GO_CLEAROBJ;
         }
         obj = BOTTLE;
@@ -386,12 +384,16 @@ static int vcarry(verb_t verb, obj_t obj)
     }
     if ((obj == BIRD ||
          obj == CAGE) &&
-        (game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED))
+        (game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED)) {
         /* expression maps BIRD to CAGE and CAGE to BIRD */
         carry(BIRD + CAGE - obj, game.loc);
+    }
+
     carry(obj, game.loc);
+
     if (obj == BOTTLE && LIQUID() != NO_OBJECT)
         game.place[LIQUID()] = CARRIED;
+
     if (GSTONE(obj) && game.prop[obj] != STATE_FOUND) {
         game.prop[obj] = STATE_FOUND;
         game.prop[CAVITY] = CAVITY_EMPTY;
@@ -477,15 +479,13 @@ static int discard(verb_t verb, obj_t obj)
         game.prop[CAVITY] = CAVITY_FULL;
         if (HERE(RUG) && ((obj == EMERALD && game.prop[RUG] != RUG_HOVER) ||
                           (obj == RUBY && game.prop[RUG] == RUG_HOVER))) {
-            int spk;
             if (obj == RUBY)
-                spk = RUG_SETTLES;
+                rspeak(RUG_SETTLES);
             else if (TOTING(RUG))
-                spk = RUG_WIGGLES;
+                rspeak(RUG_WIGGLES);
             else
-                spk = RUG_RISES;
-            rspeak(spk);
-            if (spk != RUG_WIGGLES) {
+                rspeak(RUG_RISES);
+            if (!TOTING(RUG) || obj == RUBY) {
                 int k = (game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER;
                 game.prop[RUG] = k;
                 if (k == RUG_HOVER)