Refactor analyze function
This commit is contained in:
parent
370d065544
commit
e306034c65
1 changed files with 46 additions and 45 deletions
91
actions.c
91
actions.c
|
@ -964,6 +964,46 @@ static int resume(FILE *input)
|
||||||
return suspend_resume_common(1);
|
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
|
/* 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
|
* 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
|
* 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) {
|
switch(STARTAT) {
|
||||||
case 4000: goto L4000;
|
case 4000: goto L4000;
|
||||||
case 4090: goto L4090;
|
case 4090: goto L4090;
|
||||||
case 5000: goto L5000;
|
case 5000: {
|
||||||
|
long ret = analyse(verb, &obj);
|
||||||
|
if (ret != -1)
|
||||||
|
return ret;
|
||||||
|
goto L4090;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
BUG(99);
|
BUG(99);
|
||||||
|
|
||||||
|
@ -1068,48 +1113,4 @@ L4090: switch (verb-1) {
|
||||||
case 33: /* ZZZZ */ return reservoir();
|
case 33: /* ZZZZ */ return reservoir();
|
||||||
}
|
}
|
||||||
BUG(24);
|
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. */
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue