Another use of state_change().
[open-adventure.git] / actions.c
index fdf2319023732c79b8ea27b75d42b88468351619..de888d4584d1f1528378324ff5b3f50f84e22d3c 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -1,5 +1,6 @@
 #include <stdlib.h>
 #include <stdbool.h>
+#include <string.h>
 #include "advent.h"
 #include "dungeon.h"
 
@@ -481,13 +482,12 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
             DESTROY(BIRD);
             return GO_CLEAROBJ;
         } else if (obj == BEAR && AT(TROLL)) {
-            rspeak(TROLL_SCAMPERS);
+            state_change(TROLL, TROLL_GONE);
             move(TROLL, LOC_NOWHERE);
             move(TROLL + NOBJECTS, LOC_NOWHERE);
             move(TROLL2, objects[TROLL].plac);
             move(TROLL2 + NOBJECTS, objects[TROLL].fixd);
             juggle(CHASM);
-            game.prop[TROLL] = TROLL_GONE;
         } else if (obj != VASE ||
                    game.loc == objects[PILLOW].plac) {
             rspeak(OK_MAN);
@@ -942,15 +942,15 @@ static int pour(token_t verb, token_t obj)
         return GO_CLEAROBJ;
     }
     if (!AT(DOOR)) {
-        if (obj != WATER) {
+        if (obj == WATER) {
+           /* cycle through the three plant states */
+           state_change(PLANT, MOD(game.prop[PLANT] + 1, 3));
+           game.prop[PLANT2] = game.prop[PLANT];
+           return GO_MOVE;
+        } else {
             rspeak(SHAKING_LEAVES);
             return GO_CLEAROBJ;
-        }
-        /* FIXME: Arithmetic on state numbers */
-        pspeak(PLANT, look, game.prop[PLANT] + 3, true);
-        game.prop[PLANT] = MOD(game.prop[PLANT] + 1, 3);
-        game.prop[PLANT2] = game.prop[PLANT];
-        return GO_MOVE;
+       }
     } else {
         state_change(DOOR, (obj == OIL) ?
                      DOOR_UNRUSTED :
@@ -1037,11 +1037,11 @@ static int rub(token_t verb, token_t obj)
 static int say(struct command_t *command)
 /* Say.  Echo WD2 (or WD1 if no WD2 (SAY WHAT?, etc.).)  Magic words override. */
 {
-    long a = command->wd1, b = command->wd1x;
+    long a = command->wd1;
     if (command->wd2 > 0) {
         a = command->wd2;
-        b = command->wd2x;
         command->wd1 = command->wd2;
+       strcpy(command->raw1, command->raw2);
     }
     char word1[TOKLEN+1];
     packed_to_token(command->wd1, word1);
@@ -1056,7 +1056,7 @@ static int say(struct command_t *command)
         wordclear(&command->wd2);
         return GO_LOOKUP;
     }
-    rspeak(OKEY_DOKEY, a, b);
+    sspeak(OKEY_DOKEY, command->raw1);
     return GO_CLEAROBJ;
 }