Last goto removed from actions.c
[open-adventure.git] / actions.c
index 4a545c37bded2bd3960fcbc68c90fadbb3eb3e38..df76463cc9cf8650d2a5f7fd32c5c8d940c19b27 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -752,7 +752,7 @@ static int rub(token_t obj)
     DSTROY(URN);
     DROP(AMBER,game.loc);
     game.prop[AMBER]=1;
-    game.tally=game.tally-1;
+    --game.tally;
     DROP(CAVITY,game.loc);
     SPK=216;
     return(2011);
@@ -842,7 +842,7 @@ static int throw(FILE *cmdin, long verb, long obj)
     game.dseen[i]=false;
     game.dloc[i]=0;
     SPK=47;
-    game.dkill=game.dkill+1;
+    ++game.dkill;
     if (game.dkill == 1)SPK=149;
 
     return throw_support(SPK);
@@ -875,7 +875,7 @@ static int wave(token_t obj)
     if (SPK == 206 && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
        DROP(JADE,game.loc);
        game.prop[JADE]=0;
-       game.tally=game.tally-1;
+       --game.tally;
        SPK=208;
        return(2011);
     } else {
@@ -888,17 +888,67 @@ static int wave(token_t obj)
     }
 }
 
-/* We're called with a number that says what label the caller wanted
- * to "goto", and we return a similar label number for the caller to
- * "goto".
- */
-
 int action(FILE *input, enum speechpart part, long verb, long obj)
 /*  Analyse a verb.  Remember what it was, go back for object if second word
  *  unless verb is "say", which snarfs arbitrary second word.
  */
 {
     int kk;
+
+    if (part == unknown)
+    {
+           /*  Analyse an object word.  See if the thing is here, whether
+            *  we've got a verb yet, and so on.  Object must be here
+            *  unless verb is "find" or "invent(ory)" (and no new verb
+            *  yet to be analysed).  Water and oil are also funny, since
+            *  they are never actually dropped at any location, but might
+            *  be here inside the bottle or urn or as a feature of the
+            *  location. */
+           if (HERE(obj))
+               /* FALL THROUGH */;
+           else if (obj == GRATE) {
+               if (game.loc == 1 || game.loc == 4 || game.loc == 7)
+                   obj=DPRSSN;
+               if (game.loc > 9 && game.loc < 15)
+                   obj=ENTRNC;
+               if (obj != GRATE)
+                   return(8);
+           }
+           else if (obj == DWARF && ATDWRF(game.loc) > 0)
+               /* FALL THROUGH */;
+           else if ((LIQ(0) == obj && HERE(BOTTLE)) || obj == LIQLOC(game.loc))
+               /* FALL THROUGH */;
+           else if (obj == OIL && HERE(URN) && game.prop[URN] != 0) {
+               obj=URN;
+               /* FALL THROUGH */;
+           }
+           else if (obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != 0) {
+               obj=PLANT2;
+               /* FALL THROUGH */;
+           }
+           else if (obj == KNIFE && game.knfloc == game.loc) {
+               game.knfloc= -1;
+               SPK=116;
+               return(2011);
+           }
+           else if (obj == ROD && HERE(ROD2)) {
+               obj=ROD2;
+               /* FALL THROUGH */;
+           }
+           else if ((verb == FIND || verb == INVENT) && WD2 <= 0)
+               /* FALL THROUGH */;
+           else {
+               SETPRM(1,WD1,WD1X);
+               RSPEAK(256);
+               return(2012);
+           }
+
+           if (WD2 > 0)
+               return(2800);
+           if (verb != 0)
+               part = transitive;
+    }
+
     switch(part)
     {
        case intransitive:
@@ -947,7 +997,6 @@ int action(FILE *input, enum speechpart part, long verb, long obj)
            }
            /* FALLTHRU */
        case transitive:
-       L4090:
            /*  Analyse a transitive verb. */
            switch (verb-1) {
                case  0: /* CARRY */ return carry(obj);    
@@ -987,62 +1036,10 @@ int action(FILE *input, enum speechpart part, long verb, long obj)
            }
            BUG(24);
        case unknown:
-           /*  Analyse an object word.  See if the thing is here, whether
-            *  we've got a verb yet, and so on.  Object must be here
-            *  unless verb is "find" or "invent(ory)" (and no new verb
-            *  yet to be analysed).  Water and oil are also funny, since
-            *  they are never actually dropped at any location, but might
-            *  be here inside the bottle or urn or as a feature of the
-            *  location. */
-           if (!HERE(obj))
-               goto L5100;
-       L5010:
-           if (WD2 > 0)
-               return(2800);
-           if (verb != 0)
-               goto L4090;
            SETPRM(1,WD1,WD1X);
            RSPEAK(255);
            return(2600);
-
-       L5100:
-           if (obj == GRATE) {
-               if (game.loc == 1 || game.loc == 4 || game.loc == 7)
-                   obj=DPRSSN;
-               if (game.loc > 9 && game.loc < 15)
-                   obj=ENTRNC;
-               if (obj != GRATE)
-                   return(8);
-           }
-
-           if (obj == DWARF && ATDWRF(game.loc) > 0)
-               goto L5010;
-           if ((LIQ(0) == obj && HERE(BOTTLE)) || obj == LIQLOC(game.loc))
-               goto L5010;
-           if (obj == OIL && HERE(URN) && game.prop[URN] != 0) {
-               obj=URN;
-               goto L5010;
-           }
-           if (obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != 0) {
-               obj=PLANT2;
-               goto L5010;
-           }
-           if (obj == KNIFE && game.knfloc == game.loc) {
-               game.knfloc= -1;
-               SPK=116;
-               return(2011);
-           }
-           if (obj == ROD && HERE(ROD2)) {
-               obj=ROD2;
-               goto L5010;
-           }
-           if ((verb == FIND || verb == INVENT) && WD2 <= 0)
-               goto L5010;
-
-           SETPRM(1,WD1,WD1X);
-           RSPEAK(256);
-           return(2012);
-       default:
+    default:
            BUG(99);
     }
 }