From a678b68b39f21f8b2853e45c6138d815a82a3423 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 19 Jun 2017 17:21:45 -0400 Subject: [PATCH 1/5] Mostly confine assumptions about what token_t is to misc.c The token_t things like WD* are presently longs and will someday be char[6]. By introducing some trivial functions - wordeq(), wordempty(), and wordclear() - we mostly hide the difference. All runtime knowledge about packing now lives only in misc.c and the list of magic WORD_* defines in advent.h. Outside this, literals are now accessed through #define names that could expand to either longs or strings. Still to be done: WD* values are sometiimes compated to zero in ways implying they can be negative. Must figure out wat thus means. --- actions.c | 3 ++- advent.h | 3 +++ init.c | 2 +- main.c | 9 +++++---- misc.c | 17 +++++++++++++++++ 5 files changed, 28 insertions(+), 6 deletions(-) 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 f79c68c..1db050f 100644 --- a/main.c +++ b/main.c @@ -1057,8 +1057,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)) @@ -1068,12 +1069,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); } @@ -1130,7 +1131,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) From 7753ad3134be3184981b1889c1c38069f2bce6e0 Mon Sep 17 00:00:00 2001 From: Aaron Traas Date: Mon, 19 Jun 2017 15:21:03 -0400 Subject: [PATCH 2/5] Test coverage - drink with no valid object --- tests/drinkfail.chk | 37 +++++++++++++++++++++++++++++++++++++ tests/drinkfail.log | 5 +++++ 2 files changed, 42 insertions(+) create mode 100644 tests/drinkfail.chk create mode 100644 tests/drinkfail.log 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 From 08c0524ee3a9a58ca1dc01901cbf8aa162d65fb9 Mon Sep 17 00:00:00 2001 From: Aaron Traas Date: Mon, 19 Jun 2017 15:36:42 -0400 Subject: [PATCH 3/5] Test coverage -- intransitive carry when one object is present --- tests/intransitivecarry.chk | 43 +++++++++++++++++++++++++++++++++++++ tests/intransitivecarry.log | 7 ++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/intransitivecarry.chk create mode 100644 tests/intransitivecarry.log 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..24ebc2b --- /dev/null +++ b/tests/intransitivecarry.log @@ -0,0 +1,7 @@ +## Drink unknown +n +in +carry lamp +out +drop lamp +carry From 7ae0782b2507ebed265e9bd2bb8db6b1ac062411 Mon Sep 17 00:00:00 2001 From: Aaron Traas Date: Mon, 19 Jun 2017 16:07:35 -0400 Subject: [PATCH 4/5] Test coverage - failure to fill --- tests/fillfail.chk | 57 +++++++++++++++++++++++++++++++++++++ tests/fillfail.log | 10 +++++++ tests/intransitivecarry.log | 2 +- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 tests/fillfail.chk create mode 100644 tests/fillfail.log 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/intransitivecarry.log b/tests/intransitivecarry.log index 24ebc2b..640a296 100644 --- a/tests/intransitivecarry.log +++ b/tests/intransitivecarry.log @@ -1,4 +1,4 @@ -## Drink unknown +## Carry when only one object is present n in carry lamp From 9c88649cd4d2064d4f4fa0f09d6b664e2cf7cc01 Mon Sep 17 00:00:00 2001 From: Aaron Traas Date: Mon, 19 Jun 2017 16:26:14 -0400 Subject: [PATCH 5/5] Test coverage More misuse of transitive verbs --- tests/illformed.chk | 58 +++++++++++++++++++++++++++++++++++++++++---- tests/illformed.log | 10 ++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) 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