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". * "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 /* Analyse a verb. Remember what it was, go back for object if second word
* unless verb is "say", which snarfs arbitrary second word. * unless verb is "say", which snarfs arbitrary second word.
*/ */
{ {
int kk; int kk;
switch(STARTAT) { switch(part)
case 4000: goto L4000; {
case 4090: goto L4090; case intransitive:
case 5000: goto L5000;
}
BUG(99);
L4000:
SPK=ACTSPK[verb]; SPK=ACTSPK[verb];
if (WD2 > 0 && verb != SAY) return(2800); if (WD2 > 0 && verb != SAY) return(2800);
if (verb == SAY)obj=WD2; if (verb == SAY)obj=WD2;
if (obj > 0) goto L4090; if (obj == 0) {
/* Analyse an intransitive verb (ie, no object given yet). */ /* Analyse an intransitive verb (ie, no object given yet). */
switch (verb-1) { switch (verb-1) {
case 0: /* CARRY */ return carry(INTRANSITIVE); case 0: /* CARRY */ return carry(INTRANSITIVE);
case 1: /* DROP */ return(8000); case 1: /* DROP */ return(8000);
@ -1035,10 +1028,12 @@ L4000:
case 33: /* ZZZZ */ return reservoir(); case 33: /* ZZZZ */ return reservoir();
} }
BUG(23); BUG(23);
}
/* FALLTHRU */
case transitive:
L4090:
/* Analyse a transitive verb. */ /* Analyse a transitive verb. */
switch (verb-1) {
L4090: switch (verb-1) {
case 0: /* CARRY */ return carry(obj); case 0: /* CARRY */ return carry(obj);
case 1: /* DROP */ return discard(obj, false); case 1: /* DROP */ return discard(obj, false);
case 2: /* SAY */ return say(); case 2: /* SAY */ return say();
@ -1075,14 +1070,14 @@ L4090: switch (verb-1) {
case 33: /* ZZZZ */ return reservoir(); case 33: /* ZZZZ */ return reservoir();
} }
BUG(24); BUG(24);
case unknown:
/* Analyse an object word. See if the thing is here, whether we've got a verb /* Analyse an object word. See if the thing is here, whether
* yet, and so on. Object must be here unless verb is "find" or "invent(ory)" * we've got a verb yet, and so on. Object must be here
* (and no new verb yet to be analysed). Water and oil are also funny, since * unless verb is "find" or "invent(ory)" (and no new verb
* they are never actually dropped at any location, but might be here inside * yet to be analysed). Water and oil are also funny, since
* the bottle or urn or as a feature of the location. */ * they are never actually dropped at any location, but might
* be here inside the bottle or urn or as a feature of the
L5000: * location. */
if (!HERE(obj)) if (!HERE(obj))
goto L5100; goto L5100;
L5010: L5010:
@ -1131,4 +1126,7 @@ L5100:
SETPRM(1,WD1,WD1X); SETPRM(1,WD1,WD1X);
RSPEAK(256); RSPEAK(256);
return(2012); return(2012);
default:
BUG(99);
}
} }

View file

@ -182,3 +182,4 @@ extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
/* everything else */ /* everything else */
extern long K, SPK, WD1, WD1X, WD2, WD2X; 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 KQ, VERB, KK, V1, V2;
long obj, i; long obj, i;
static long IGO = 0; static long IGO = 0;
enum speechpart part;
/* Can't leave cave once it's closing (except by main office). */ /* Can't leave cave once it's closing (except by main office). */
if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) { 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. */ /* Verb and object analysis moved to separate module. */
L4000: i=4000; VERB=K; goto Laction; L4000: part=intransitive; VERB=K; goto Laction;
L4090: i=4090; goto Laction; L4090: part=transitive; goto Laction;
L5000: i=5000; obj = K; L5000: part=unknown; obj = K;
Laction: Laction:
switch (action(cmdin, i, VERB, obj)) { switch (action(cmdin, part, VERB, obj)) {
case 2: return true; case 2: return true;
case 8: goto L8; case 8: goto L8;
case 2000: goto L2000; case 2000: goto L2000;