Replace magic linenumbers with a clearer enum.

This commit is contained in:
Eric S. Raymond 2017-06-10 00:23:28 -04:00
parent b22d6a65b9
commit 9bac28878d
3 changed files with 152 additions and 152 deletions

View file

@ -977,27 +977,20 @@ static int wave(token_t obj)
* "goto".
*/
int action(FILE *input, long STARTAT, long verb, long obj)
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;
switch(STARTAT) {
case 4000: goto L4000;
case 4090: goto L4090;
case 5000: goto L5000;
}
BUG(99);
L4000:
switch(part)
{
case intransitive:
SPK=ACTSPK[verb];
if (WD2 > 0 && verb != SAY) return(2800);
if (verb == SAY)obj=WD2;
if (obj > 0) goto L4090;
/* Analyse an intransitive verb (ie, no object given yet). */
if (obj == 0) {
/* Analyse an intransitive verb (ie, no object given yet). */
switch (verb-1) {
case 0: /* CARRY */ return carry(INTRANSITIVE);
case 1: /* DROP */ return(8000);
@ -1035,10 +1028,12 @@ L4000:
case 33: /* ZZZZ */ return reservoir();
}
BUG(23);
/* Analyse a transitive verb. */
L4090: switch (verb-1) {
}
/* FALLTHRU */
case transitive:
L4090:
/* Analyse a transitive verb. */
switch (verb-1) {
case 0: /* CARRY */ return carry(obj);
case 1: /* DROP */ return discard(obj, false);
case 2: /* SAY */ return say();
@ -1075,17 +1070,17 @@ 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:
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:
L5010:
if (WD2 > 0)
return(2800);
if (verb != 0)
@ -1094,7 +1089,7 @@ L5010:
RSPEAK(255);
return(2600);
L5100:
L5100:
if (obj == GRATE) {
if (game.loc == 1 || game.loc == 4 || game.loc == 7)
obj=DPRSSN;
@ -1131,4 +1126,7 @@ L5100:
SETPRM(1,WD1,WD1X);
RSPEAK(256);
return(2012);
default:
BUG(99);
}
}

View file

@ -182,3 +182,4 @@ extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
/* everything else */
extern long K, SPK, WD1, WD1X, WD2, WD2X;
enum speechpart {unknown, intransitive, transitive};

9
main.c
View file

@ -659,6 +659,7 @@ static bool do_command(FILE *cmdin)
long KQ, VERB, KK, V1, V2;
long obj, i;
static long IGO = 0;
enum speechpart part;
/* Can't leave cave once it's closing (except by main office). */
if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
@ -868,11 +869,11 @@ L3000: SETPRM(1,WD1,WD1X);
/* Verb and object analysis moved to separate module. */
L4000: i=4000; VERB=K; goto Laction;
L4090: i=4090; goto Laction;
L5000: i=5000; obj = K;
L4000: part=intransitive; VERB=K; goto Laction;
L4090: part=transitive; goto Laction;
L5000: part=unknown; obj = K;
Laction:
switch (action(cmdin, i, VERB, obj)) {
switch (action(cmdin, part, VERB, obj)) {
case 2: return true;
case 8: goto L8;
case 2000: goto L2000;