Unspk'd pour command
[open-adventure.git] / actions.c
index d9802f627143051a568c6b42302401cdbf87921e..52c041791f6c67b90574dfb79a86c03268b2f419 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -20,9 +20,6 @@ static int attack(struct command_t *command)
     vocab_t verb = command->verb;
     vocab_t obj = command->obj;
 
-    if (obj == INTRANSITIVE) {
-        return GO_UNKNOWN;
-    }
     long spk = actions[verb].message;
     if (obj == NO_OBJECT || obj == INTRANSITIVE) {
         int changes = 0;
@@ -521,23 +518,25 @@ static int eat(token_t verb, token_t obj)
 /*  Eat.  Intransitive: assume food if present, else ask what.  Transitive: food
  *  ok, some things lose appetite, rest are ridiculous. */
 {
-    int spk = actions[verb].message;
     if (obj == INTRANSITIVE) {
         if (!HERE(FOOD))
             return GO_UNKNOWN;
         DESTROY(FOOD);
-        spk = THANKS_DELICIOUS;
-    } else {
-        if (obj == FOOD) {
-            DESTROY(FOOD);
-            spk = THANKS_DELICIOUS;
-        }
-        if (obj == BIRD || obj == SNAKE || obj == CLAM || obj == OYSTER || obj ==
-            DWARF || obj == DRAGON || obj == TROLL || obj == BEAR || obj ==
-            OGRE)
-            spk = LOST_APPETITE;
+        rspeak(THANKS_DELICIOUS);
+        return GO_CLEAROBJ;
     }
-    rspeak(spk);
+    if (obj == FOOD) {
+        DESTROY(FOOD);
+        rspeak(THANKS_DELICIOUS);
+        return GO_CLEAROBJ;
+    }
+    if (obj == BIRD || obj == SNAKE || obj == CLAM || obj == OYSTER || obj ==
+        DWARF || obj == DRAGON || obj == TROLL || obj == BEAR || obj ==
+        OGRE) {
+        rspeak(LOST_APPETITE);
+        return GO_CLEAROBJ;
+    }
+    rspeak(actions[verb].message);
     return GO_CLEAROBJ;
 }
 
@@ -874,33 +873,30 @@ static int pour(token_t verb, token_t obj)
 /*  Pour.  If no object, or object is bottle, assume contents of bottle.
  *  special tests for pouring water or oil on plant or rusty door. */
 {
-    int spk = actions[verb].message;
     if (obj == BOTTLE || obj == NO_OBJECT)
         obj = LIQUID();
     if (obj == NO_OBJECT)
         return GO_UNKNOWN;
     if (!TOTING(obj)) {
-        rspeak(spk);
+        rspeak(actions[verb].message);
         return GO_CLEAROBJ;
     }
-    spk = CANT_POUR;
+
     if (obj != OIL && obj != WATER) {
-        rspeak(spk);
+        rspeak(CANT_POUR);
         return GO_CLEAROBJ;
     }
     if (HERE(URN) && game.prop[URN] == URN_EMPTY)
         return fill(verb, URN);
     game.prop[BOTTLE] = EMPTY_BOTTLE;
     game.place[obj] = LOC_NOWHERE;
-    spk = GROUND_WET;
     if (!(AT(PLANT) || AT(DOOR))) {
-        rspeak(spk);
+        rspeak(GROUND_WET);
         return GO_CLEAROBJ;
     }
     if (!AT(DOOR)) {
-        spk = SHAKING_LEAVES;
         if (obj != WATER) {
-            rspeak(spk);
+            rspeak(SHAKING_LEAVES);
             return GO_CLEAROBJ;
         }
         pspeak(PLANT, look, game.prop[PLANT] + 3, true);
@@ -1086,50 +1082,33 @@ static int wake(token_t verb, token_t obj)
     }
 }
 
-static token_t birdspeak(void)
-{
-    switch (game.prop[BIRD]) {
-    case BIRD_UNCAGED:
-    case BIRD_FOREST_UNCAGED:
-        return FREE_FLY;
-    case BIRD_CAGED:
-        return CAGE_FLY;
-    }
-}
-
 static int wave(token_t verb, token_t obj)
 /* Wave.  No effect unless waving rod at fissure or at bird. */
 {
-    int spk = actions[verb].message;
-    if ((!TOTING(obj)) && (obj != ROD || !TOTING(ROD2)))
-        spk = ARENT_CARRYING;
     if (obj != ROD ||
         !TOTING(obj) ||
         (!HERE(BIRD) && (game.closng || !AT(FISSURE)))) {
-        rspeak(spk);
+        rspeak(((!TOTING(obj)) && (obj != ROD || !TOTING(ROD2))) ? ARENT_CARRYING : actions[verb].message);
         return GO_CLEAROBJ;
     }
 
-    if (HERE(BIRD))
-        spk = birdspeak();
-    if (spk == FREE_FLY && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
+    if (game.prop[BIRD] == BIRD_UNCAGED && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
         drop(JADE, game.loc);
         game.prop[JADE] = 0;
         --game.tally;
-        spk = NECKLACE_FLY;
-        rspeak(spk);
+        rspeak(NECKLACE_FLY);
         return GO_CLEAROBJ;
     } else {
         if (game.closed) {
-            rspeak(spk);
+            rspeak((game.prop[BIRD] == BIRD_CAGED) ? CAGE_FLY : FREE_FLY);
             return GO_DWARFWAKE;
         }
         if (game.closng || !AT(FISSURE)) {
-            rspeak(spk);
+            rspeak((game.prop[BIRD] == BIRD_CAGED) ? CAGE_FLY : FREE_FLY);
             return GO_CLEAROBJ;
         }
         if (HERE(BIRD))
-            rspeak(spk);
+            rspeak((game.prop[BIRD] == BIRD_CAGED) ? CAGE_FLY : FREE_FLY);
 
         /* FIXME: Arithemetic on property values */
         game.prop[FISSURE] = 1 - game.prop[FISSURE];
@@ -1138,8 +1117,6 @@ static int wave(token_t verb, token_t obj)
     }
 }
 
-
-
 int action(struct command_t *command)
 /*  Analyse a verb.  Remember what it was, go back for object if second word
  *  unless verb is "say", which snarfs arbitrary second word.