Last goto removed from actions.c
authorEric S. Raymond <esr@thyrsus.com>
Sat, 10 Jun 2017 17:43:17 +0000 (13:43 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Sat, 10 Jun 2017 17:43:17 +0000 (13:43 -0400)
actions.c

index 276c0cb6e414e8f4609b002ca59d184a8a3be547..df76463cc9cf8650d2a5f7fd32c5c8d940c19b27 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -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,56 +1036,6 @@ 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))
-               /* 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)
-               goto L4090;
            SETPRM(1,WD1,WD1X);
            RSPEAK(255);
            return(2600);