Working but unpolished refactor of bigwords().
[open-adventure.git] / actions.c
index 971bbb349cee39fb9c5398b1dcf18e7d26417dd1..2b432f371470eb0645532951774149d7ce2d3925 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -178,46 +178,51 @@ static int attack(struct command_t *command)
     return GO_CLEAROBJ;
 }
 
-static int bigwords(token_t foo)
+static int bigwords(long id)
 /*  FEE FIE FOE FOO (AND FUM).  Advance to next state if given in proper order.
  *  Look up foo in special section of vocab to determine which word we've got.
  *  Last word zips the eggs back to the giant room (unless already there). */
 {
-    char word[TOKLEN + 1];
-    packed_to_token(foo, word);
-    int k = (int) get_special_vocab_id(word);
-    if (game.foobar != 1 - k) {
-        if (game.foobar != 0 && game.loc == LOC_GIANTROOM) {
-            rspeak( START_OVER);
-        } else {
-            rspeak(NOTHING_HAPPENS);
-        }
-        return GO_CLEAROBJ;
-    } else {
-        game.foobar = k;
-        if (k != 4) {
-            rspeak(OK_MAN);
-            return GO_CLEAROBJ;
-        }
-        game.foobar = 0;
-        if (game.place[EGGS] == objects[EGGS].plac ||
-            (TOTING(EGGS) && game.loc == objects[EGGS].plac)) {
-            rspeak(NOTHING_HAPPENS);
-            return GO_CLEAROBJ;
-        } else {
-            /*  Bring back troll if we steal the eggs back from him before
-             *  crossing. */
-            if (game.place[EGGS] == LOC_NOWHERE && game.place[TROLL] == LOC_NOWHERE && game.prop[TROLL] == TROLL_UNPAID)
-                game.prop[TROLL] = TROLL_PAIDONCE;
-            k = EGGS_DONE;
-            if (HERE(EGGS))
-                k = EGGS_VANISHED;
-            if (game.loc == objects[EGGS].plac)
-                k = EGGS_HERE;
-            move(EGGS, objects[EGGS].plac);
-            pspeak(EGGS, look, k, true);
-            return GO_CLEAROBJ;
-        }
+  if ((game.foobar == WORD_EMPTY && id == ACTION_WORD(FEE)) ||
+      (game.foobar == ACTION_WORD(FEE) && id == ACTION_WORD(FIE)) ||
+      (game.foobar == ACTION_WORD(FIE) && id == ACTION_WORD(FOE)) ||
+      (game.foobar == ACTION_WORD(FOE) && id == ACTION_WORD(FOO)) ||
+      (game.foobar == ACTION_WORD(FOE) && id == ACTION_WORD(FUM)))
+    {
+      game.foobar = id;
+      if ((id != ACTION_WORD(FOO)) && (id != ACTION_WORD(FUM))) {
+       rspeak(OK_MAN);
+       return GO_CLEAROBJ;
+      }
+      game.foobar = WORD_EMPTY;
+      if (game.place[EGGS] == objects[EGGS].plac ||
+         (TOTING(EGGS) && game.loc == objects[EGGS].plac)) {
+       rspeak(NOTHING_HAPPENS);
+       return GO_CLEAROBJ;
+      } else {
+       /*  Bring back troll if we steal the eggs back from him before
+        *  crossing. */
+       if (game.place[EGGS] == LOC_NOWHERE && game.place[TROLL] == LOC_NOWHERE && game.prop[TROLL] == TROLL_UNPAID)
+         game.prop[TROLL] = TROLL_PAIDONCE;
+       int k = EGGS_DONE;
+       if (HERE(EGGS))
+         k = EGGS_VANISHED;
+       if (game.loc == objects[EGGS].plac)
+         k = EGGS_HERE;
+       move(EGGS, objects[EGGS].plac);
+       pspeak(EGGS, look, k, true);
+       return GO_CLEAROBJ;
+      }
+    }
+  else
+    {
+      if (game.loc == LOC_GIANTROOM) {
+       rspeak( START_OVER);
+      } else {
+       rspeak(NOTHING_HAPPENS);
+      }
+      game.foobar = WORD_EMPTY;
+      return GO_CLEAROBJ;
     }
 }
 
@@ -624,46 +629,59 @@ 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);
+            break;
         }
-    } else if (obj == OGRE) {
+        rspeak(actions[verb].message);
+        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;
 }
 
@@ -1102,7 +1120,11 @@ static int say(struct command_t *command)
     if (wd == MOTION_WORD(XYZZY) ||
         wd == MOTION_WORD(PLUGH) ||
         wd == MOTION_WORD(PLOVER) ||
-        wd == ACTION_WORD(GIANTWORDS) ||
+        wd == ACTION_WORD(FEE) ||
+       wd == ACTION_WORD(FIE) ||
+       wd == ACTION_WORD(FOE) ||
+       wd == ACTION_WORD(FOO) ||
+       wd == ACTION_WORD(FUM) ||
         wd == ACTION_WORD(PART)) {
         /* FIXME: scribbles on the interpreter's command block */
         wordclear(&command->wd2);
@@ -1363,8 +1385,12 @@ int action(struct command_t *command)
             case SCORE:
                 score(scoregame);
                 return GO_CLEAROBJ;
-            case GIANTWORDS:
-                return bigwords(command->wd1);
+           case FEE:
+           case FIE:
+           case FOE:
+           case FOO:
+            case FUM:
+                return bigwords(command->id1);
             case BRIEF:
                 return brief();
             case READ:
@@ -1451,7 +1477,11 @@ int action(struct command_t *command)
             rspeak(actions[command->verb].message);
             return GO_CLEAROBJ;
         }
-        case GIANTWORDS: {
+       case FEE:
+       case FIE:
+       case FOE:
+       case FOO:
+        case FUM: {
             rspeak(actions[command->verb].message);
             return GO_CLEAROBJ;
         }