From: Eric S. Raymond Date: Sat, 10 Jun 2017 17:43:17 +0000 (-0400) Subject: Last goto removed from actions.c X-Git-Tag: 1.1~451 X-Git-Url: https://jxself.org/git/?a=commitdiff_plain;h=b92fb66c44fd6f41bd16914a845e18ab09ac39d5;p=open-adventure.git Last goto removed from actions.c --- diff --git a/actions.c b/actions.c index 276c0cb..df76463 100644 --- 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);