diff --git a/actions.c b/actions.c index 283c19f..c6b0037 100644 --- a/actions.c +++ b/actions.c @@ -964,6 +964,46 @@ static int resume(FILE *input) return suspend_resume_common(1); } +static int analyse(token_t verb, token_t *obj) +/* 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. */ +{ + *obj=K; + if (!HERE(K)) { + + if (K == GRATE) { + if (game.loc == 1 || game.loc == 4 || game.loc == 7)K=DPRSSN; + if (game.loc > 9 && game.loc < 15)K=ENTRNC; + if (K != GRATE) return(8); + } + if (K == DWARF && ATDWRF(game.loc) > 0) ; + else if ((LIQ(0) == K && HERE(BOTTLE)) || K == LIQLOC(game.loc)) ; + else if (*obj == OIL && HERE(URN) && game.prop[URN] != 0) { + *obj=URN; + } else if (*obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != 0) { + *obj=PLANT2; + } else if (*obj == KNIFE && game.knfloc == game.loc) { + game.knfloc= -1; + SPK=116; + return(2011); + } else if (*obj == ROD && HERE(ROD2)) { + *obj=ROD2; + } else if ((verb != FIND && verb != INVENT) || WD2 > 0) { + SETPRM(1,WD1,WD1X); + RSPEAK(256); + return(2012); + } + } + + if (WD2 > 0) return(2800); + if (verb != 0) return(-1); + SETPRM(1,WD1,WD1X); + RSPEAK(255); + return(2600); +} /* This stuff was broken off as part of an effort to get the main program * to compile without running out of memory. We're called with a number * that says what label the caller wanted to "goto", and we return a @@ -979,7 +1019,12 @@ int action(FILE *input, long STARTAT, long verb, long obj) switch(STARTAT) { case 4000: goto L4000; case 4090: goto L4090; - case 5000: goto L5000; + case 5000: { + long ret = analyse(verb, &obj); + if (ret != -1) + return ret; + goto L4090; + } } BUG(99); @@ -1068,48 +1113,4 @@ L4090: switch (verb-1) { case 33: /* ZZZZ */ return reservoir(); } BUG(24); - -/* 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. */ - -L5000: obj=K; - if (!HERE(K)) goto L5100; -L5010: if (WD2 > 0) return(2800); - if (verb != 0) goto L4090; - SETPRM(1,WD1,WD1X); - RSPEAK(255); - return(2600); - -L5100: if (K != GRATE) goto L5110; - if (game.loc == 1 || game.loc == 4 || game.loc == 7)K=DPRSSN; - if (game.loc > 9 && game.loc < 15)K=ENTRNC; - if (K != GRATE) return(8); -L5110: if (K == DWARF && ATDWRF(game.loc) > 0) goto L5010; - if ((LIQ(0) == K && HERE(BOTTLE)) || K == LIQLOC(game.loc)) goto L5010; - if (obj != OIL || !HERE(URN) || game.prop[URN] == 0) goto L5120; - obj=URN; - goto L5010; -L5120: if (obj != PLANT || !AT(PLANT2) || game.prop[PLANT2] == 0) goto L5130; - obj=PLANT2; - goto L5010; -L5130: if (obj != KNIFE || game.knfloc != game.loc) goto L5140; - game.knfloc= -1; - SPK=116; - return(2011); -L5140: if (obj != ROD || !HERE(ROD2)) goto L5190; - obj=ROD2; - goto L5010; -L5190: if ((verb == FIND || verb == INVENT) && WD2 <= 0) goto L5010; - SETPRM(1,WD1,WD1X); - RSPEAK(256); - return(2012); - - -/* Statement numbers in this section are 8000 for intransitive verbs, 9000 for - * transitive, plus ten times the verb number. Many intransitive verbs use the - * transitive code, and some verbs use code for other verbs, as noted below. */ - }