diff --git a/actions.c b/actions.c index 6cdc61d..2a223bc 100644 --- a/actions.c +++ b/actions.c @@ -1054,7 +1054,8 @@ int action(FILE *input, enum speechpart part, token_t verb, token_t obj) switch (part) { case intransitive: - if (WD2 > 0 && verb != SAY) return (2800); + if (WD2 > 0 && verb != SAY) + return GO_WORD2; if (verb == SAY)obj = WD2; if (obj == 0 || obj == INTRANSITIVE) { /* Analyse an intransitive verb (ie, no object given yet). */ diff --git a/advent.h b/advent.h index f199489..ff62476 100644 --- a/advent.h +++ b/advent.h @@ -91,6 +91,9 @@ extern void* xmalloc(size_t size); extern char* xstrdup(const char*); extern void packed_to_token(long, char token[]); extern void speak(const char*); +extern bool wordeq(token_t, token_t); +extern bool wordempty(token_t); +extern void wordclear(token_t *); extern void PSPEAK(vocab_t, int); extern void RSPEAK(vocab_t); extern void SETPRM(long, long, long); diff --git a/init.c b/init.c index 36f00b1..0e52a32 100644 --- a/init.c +++ b/init.c @@ -131,7 +131,7 @@ * apply to players whose scores are higher than the previous N but not * higher than this N. Note that these scores probably change with every * modification (and particularly expansion) of the program. - * SECTION 11: Hints. Each line contains a hint number (add 10 to get cond + * Section 11: Hints. Each line contains a hint number (add 10 to get cond * bit; see section 9), the number of turns he must be at the right loc(s) * before triggering the hint, the points deducted for taking the hint, * the message number (section 6) of the question, and the message number diff --git a/main.c b/main.c index 92ee303..b830d89 100644 --- a/main.c +++ b/main.c @@ -1060,8 +1060,9 @@ L2607: if (V1 == ENTER && WD2 > 0) { WD1 = WD2; WD1X = WD2X; - WD2 = 0; + wordclear(&WD2); } else { + /* FIXME: Magic numbers */ if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) || (V2 != 1000 + PLANT && V2 != 1000 + DOOR))) { if (AT(V2 - 1000)) @@ -1071,12 +1072,12 @@ L2607: WD1 = MAKEWD(WORD_CATCH); } L2620: - if (WD1 == MAKEWD(WORD_WEST)) { + if (wordeq(WD1, MAKEWD(WORD_WEST))) { ++game.iwest; if (game.iwest == 10) RSPEAK(W_IS_WEST); } - if (WD1 == MAKEWD(WORD_GO) && WD2 != 0) { + if (wordeq(WD1, MAKEWD(WORD_GO)) && !wordempty(WD2)) { if (++igo == 10) RSPEAK(GO_UNNEEDED); } @@ -1133,7 +1134,7 @@ Laction: /* Get second word for analysis. */ WD1 = WD2; WD1X = WD2X; - WD2 = 0; + wordclear(&WD2); goto L2620; case GO_UNKNOWN: /* Random intransitive verbs come here. Clear obj just in case diff --git a/misc.c b/misc.c index ee2ac25..ba834fd 100644 --- a/misc.c +++ b/misc.c @@ -50,6 +50,23 @@ void packed_to_token(long packed, char token[6]) } } +/* Hide the fact that wods are corrently packed longs */ + +bool wordeq(token_t a, token_t b) +{ + return a == b; +} + +bool wordempty(token_t a) +{ + return a == 0; +} + +void wordclear(token_t *v) +{ + *v = 0; +} + /* I/O routines (SPEAK, PSPEAK, RSPEAK, SETPRM, GETIN, YES) */ void speak(const char* msg) diff --git a/tests/drinkfail.chk b/tests/drinkfail.chk new file mode 100644 index 0000000..43f9e2c --- /dev/null +++ b/tests/drinkfail.chk @@ -0,0 +1,37 @@ + +Welcome to Adventure!! Would you like instructions? + +> n + +You are standing at the end of a road before a small brick building. +Around you is a forest. A small stream flows out of the building and +down a gully. + +> in + +You are inside a building, a well house for a large spring. + +There are some keys on the ground here. + +There is a shiny brass lamp nearby. + +There is food here. + +There is a bottle of water here. + +> xyzzy + +>>Foof!<< + +It is now pitch dark. If you proceed you will likely fall into a pit. + +> drink + +Drink what? + + +You scored 32 out of a possible 430, using 3 turns. + +You are obviously a rank amateur. Better luck next time. + +To achieve the next higher rating, you need 14 more points. diff --git a/tests/drinkfail.log b/tests/drinkfail.log new file mode 100644 index 0000000..7beb35b --- /dev/null +++ b/tests/drinkfail.log @@ -0,0 +1,5 @@ +## Drink unknown +n +in +xyzzy +drink diff --git a/tests/fillfail.chk b/tests/fillfail.chk new file mode 100644 index 0000000..48835ed --- /dev/null +++ b/tests/fillfail.chk @@ -0,0 +1,57 @@ + +Welcome to Adventure!! Would you like instructions? + +> n + +You are standing at the end of a road before a small brick building. +Around you is a forest. A small stream flows out of the building and +down a gully. + +> in + +You are inside a building, a well house for a large spring. + +There are some keys on the ground here. + +There is a shiny brass lamp nearby. + +There is food here. + +There is a bottle of water here. + +> carry lamp + +OK + +> carry bottle + +OK + +> fill bottle + +Your bottle is already full. + +> drink + +The bottle of water is now empty. + +> xyzzy + +>>Foof!<< + +It is now pitch dark. If you proceed you will likely fall into a pit. + +> fill lamp + +You can't fill that. + +> fill bottle + +There is nothing here with which to fill the bottle. + + +You scored 32 out of a possible 430, using 8 turns. + +You are obviously a rank amateur. Better luck next time. + +To achieve the next higher rating, you need 14 more points. diff --git a/tests/fillfail.log b/tests/fillfail.log new file mode 100644 index 0000000..5fa485d --- /dev/null +++ b/tests/fillfail.log @@ -0,0 +1,10 @@ +## Attempt to fill lamp, attempt to fill bottle with no source +n +in +carry lamp +carry bottle +fill bottle +drink +xyzzy +fill lamp +fill bottle \ No newline at end of file diff --git a/tests/illformed.chk b/tests/illformed.chk index 5163971..73d1bb5 100644 --- a/tests/illformed.chk +++ b/tests/illformed.chk @@ -31,6 +31,54 @@ Seed set to 1801426495 You're in front of building. +> in + +You are inside a building, a well house for a large spring. + +There are some keys on the ground here. + +There is a shiny brass lamp nearby. + +There is food here. + +There is a bottle of water here. + +> nothing food + +OK + +> calm food + +I'm game. Would you care to explain how? + +> walk food + +Where? + +> score food + +Huh? + +> foo food + +I don't know how. + +> brief food + +On what? + +> suspend food + +Huh? + +> resume food + +Huh? + +> out + +You're in front of building. + > stream You are in a valley in the forest beside a stream tumbling along a @@ -75,7 +123,9 @@ Carry what? I am unsure how you are facing. Use compass points or nearby objects. -You're in front of building. +You are standing at the end of a road before a small brick building. +Around you is a forest. A small stream flows out of the building and +down a gully. > eat @@ -106,7 +156,7 @@ OK > in -You are inside a building, a well house for a large spring. +You're inside building. There are some keys on the ground here. @@ -381,7 +431,7 @@ Okay, "BOO". > score -You have garnered 27 out of a possible 430 points, using 74 turns. +You have garnered 27 out of a possible 430 points, using 84 turns. > quit keys @@ -395,7 +445,7 @@ Do you really want to quit now? OK -You scored 27 out of a possible 430, using 76 turns. +You scored 27 out of a possible 430, using 86 turns. You are obviously a rank amateur. Better luck next time. diff --git a/tests/illformed.log b/tests/illformed.log index 4a0443c..448403c 100644 --- a/tests/illformed.log +++ b/tests/illformed.log @@ -2,6 +2,16 @@ foo y seed 1801426495 +in +nothing food +calm food +walk food +score food +foo food +brief food +suspend food +resume food +out stream lock take water diff --git a/tests/intransitivecarry.chk b/tests/intransitivecarry.chk new file mode 100644 index 0000000..510a9bd --- /dev/null +++ b/tests/intransitivecarry.chk @@ -0,0 +1,43 @@ + +Welcome to Adventure!! Would you like instructions? + +> n + +You are standing at the end of a road before a small brick building. +Around you is a forest. A small stream flows out of the building and +down a gully. + +> in + +You are inside a building, a well house for a large spring. + +There are some keys on the ground here. + +There is a shiny brass lamp nearby. + +There is food here. + +There is a bottle of water here. + +> carry lamp + +OK + +> out + +You're in front of building. + +> drop lamp + +OK + +> carry + +OK + + +You scored 32 out of a possible 430, using 5 turns. + +You are obviously a rank amateur. Better luck next time. + +To achieve the next higher rating, you need 14 more points. diff --git a/tests/intransitivecarry.log b/tests/intransitivecarry.log new file mode 100644 index 0000000..640a296 --- /dev/null +++ b/tests/intransitivecarry.log @@ -0,0 +1,7 @@ +## Carry when only one object is present +n +in +carry lamp +out +drop lamp +carry