From cf4adf8d028e75e041abe4850259edad54171264 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 20 Sep 2024 10:49:44 -0400 Subject: [PATCH 01/16] Repair truncation in oldstyle mode. Sure would be nice to remember while this code had TOKEN + TOKEN where one would think it should just say TOKEN. --- misc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/misc.c b/misc.c index aa11786..533735b 100644 --- a/misc.c +++ b/misc.c @@ -514,8 +514,7 @@ static void tokenize(char *raw, command_t *cmd) { * possible an emulation of the original UI. */ if (settings.oldstyle) { - cmd->word[0].raw[TOKLEN + TOKLEN] = - cmd->word[1].raw[TOKLEN + TOKLEN] = '\0'; + cmd->word[0].raw[TOKLEN] = cmd->word[1].raw[TOKLEN] = '\0'; for (size_t i = 0; i < strlen(cmd->word[0].raw); i++) { cmd->word[0].raw[i] = toupper(cmd->word[0].raw[i]); } -- 2.31.1 From f1cb740c41a992c6b25a83d098b0b580cf85486c Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 20 Sep 2024 22:04:16 -0400 Subject: [PATCH 02/16] Define TRUNCLEN and explain its issues. --- misc.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/misc.c b/misc.c index 533735b..af88737 100644 --- a/misc.c +++ b/misc.c @@ -512,9 +512,14 @@ static void tokenize(char *raw, command_t *cmd) { * in their tools. On the other, not simulating this misbehavior * goes against the goal of making oldstyle as accurate as * possible an emulation of the original UI. + * + * The definition of TRUNCLEN is dubious. It accurately reflects the + * FORTRAN, but it's possible that was a bug and the proper definition + * is (TOKLEN). */ +#define TRUNCLEN (TOKLEN + TOKLEN) if (settings.oldstyle) { - cmd->word[0].raw[TOKLEN] = cmd->word[1].raw[TOKLEN] = '\0'; + cmd->word[0].raw[TRUNCLEN] = cmd->word[1].raw[TRUNCLEN] = '\0'; for (size_t i = 0; i < strlen(cmd->word[0].raw); i++) { cmd->word[0].raw[i] = toupper(cmd->word[0].raw[i]); } -- 2.31.1 From 8c553af53e6d04462716d50a654102b028e86e96 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 20 Sep 2024 22:05:25 -0400 Subject: [PATCH 03/16] Avoid a GNUism, POSIX strncasecmp() is declarted in strings.h. --- misc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/misc.c b/misc.c index af88737..7760cc5 100644 --- a/misc.c +++ b/misc.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include -- 2.31.1 From 20fd7c589fcd1e9817db541e988341b4501f8305 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 20 Sep 2024 22:19:14 -0400 Subject: [PATCH 04/16] Typo fix. --- init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.c b/init.c index 58bb0e8..b4ee643 100644 --- a/init.c +++ b/init.c @@ -1,7 +1,7 @@ /* * Initialisation * - * SPDX-FileCopyrightText: (C) 1977, 2005 by Will Crowther and Don Woodsm + * SPDX-FileCopyrightText: (C) 1977, 2005 by Will Crowther and Don Woods * SPDX-License-Identifier: BSD-2-Clause */ -- 2.31.1 From 9c3f4b0c90690f35669b802a3661c3ef31460900 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sun, 22 Sep 2024 13:08:31 -0400 Subject: [PATCH 05/16] Reflow. --- advent.h | 6 +++--- main.c | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/advent.h b/advent.h index 5aadcbb..17e02eb 100644 --- a/advent.h +++ b/advent.h @@ -87,11 +87,11 @@ #define PROP_IS_INVALID(val) (val < -MAX_STATE || val > MAX_STATE) #define OBJECT_IS_STASHED(obj) (game.objects[obj].prop < 0) #define OBJECT_IS_NOTFOUND(obj) (!game.objects[obj].found) -#define OBJECT_IS_FOUND(obj) \ +#define OBJECT_IS_FOUND(obj) \ (game.objects[obj].found && game.objects[obj].prop == 0) -#define OBJECT_IS_STASHED_OR_UNSEEN(obj) \ +#define OBJECT_IS_STASHED_OR_UNSEEN(obj) \ (!game.objects[obj].found || game.objects[obj].prop < 0) -#define OBJECT_SET_FOUND(obj) \ +#define OBJECT_SET_FOUND(obj) \ do { \ game.objects[obj].found = true; \ game.objects[obj].prop = STATE_FOUND; \ diff --git a/main.c b/main.c index e0e4c58..4db3836 100644 --- a/main.c +++ b/main.c @@ -1272,8 +1272,9 @@ static bool do_command(void) { pspeak(OYSTER, look, true, 1); } for (size_t i = 1; i <= NOBJECTS; i++) { - if (TOTING(i) && (OBJECT_IS_NOTFOUND(i) || - OBJECT_IS_STASHED(i))) { + if (TOTING(i) && + (OBJECT_IS_NOTFOUND(i) || + OBJECT_IS_STASHED(i))) { game.objects[i].prop = OBJECT_STASHED(i); } @@ -1282,10 +1283,10 @@ static bool do_command(void) { /* Check to see if the room is dark. */ game.wzdark = DARK(game.loc); - + /* If the knife is not here it permanently disappears. - * Possibly this should fire if the knife is here but - * the room is dark? */ + * Possibly this should fire if the knife is here but + * the room is dark? */ if (game.knfloc > LOC_NOWHERE && game.knfloc != game.loc) { game.knfloc = LOC_NOWHERE; -- 2.31.1 From 354e56a69ba6671cf56a0e51950162abb2542bfd Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sun, 22 Sep 2024 22:06:02 -0400 Subject: [PATCH 06/16] Clean up some comments. --- advent.h | 2 +- init.c | 2 +- misc.c | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/advent.h b/advent.h index 17e02eb..9f306c1 100644 --- a/advent.h +++ b/advent.h @@ -257,7 +257,7 @@ struct game_t { bool32_t found; // has the location of this object been found? #endif loc_t fixed; // fixed location of object (if not IS_FREE) - int32_t prop; // object state */ + int32_t prop; // object state loc_t place; // location of object } objects[NOBJECTS + 1]; struct { diff --git a/init.c b/init.c index b4ee643..372e494 100644 --- a/init.c +++ b/init.c @@ -77,7 +77,7 @@ int initialise(void) { * STATE_FOUND the first time they are described. game.tally * keeps track of how many are not yet found, so we know when to * close the cave. - * (ESR) Non-trreasures are set to STATE_FOUND explicity so we + * (ESR) Non-treasures are set to STATE_FOUND explicitly so we * don't rely on the value of uninitialized storage. This is to * make translation to future languages easier. */ for (int object = 1; object <= NOBJECTS; object++) { diff --git a/misc.c b/misc.c index 7760cc5..9fddfd5 100644 --- a/misc.c +++ b/misc.c @@ -622,11 +622,9 @@ void move(obj_t object, loc_t where) { } void put(obj_t object, loc_t where, int pval) { - /* put() is the same as move(), except it returns a value used to set - * up the negated game.prop values for the repository objects. */ + /* put() is the same as move(), except the object is stashed and + * can no longer be picked up. */ move(object, where); - /* (ESR) Read this in combination with the macro defintions in advent.h. - */ game.objects[object].prop = PROP_STASHIFY(pval); #ifdef OBJECT_SET_SEEN OBJECT_SET_SEEN(object); -- 2.31.1 From 0157e5866872f9b2e6f0b8f875ad9696f658944b Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sun, 22 Sep 2024 22:21:47 -0400 Subject: [PATCH 07/16] Remove an unneeded layer of macro indirection. --- actions.c | 2 +- advent.h | 3 +-- main.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/actions.c b/actions.c index 27b7904..107b298 100644 --- a/actions.c +++ b/actions.c @@ -407,7 +407,7 @@ static phase_codes_t vcarry(verb_t verb, obj_t obj) { } if ((obj == BIRD || obj == CAGE) && (game.objects[BIRD].prop == BIRD_CAGED || - OBJECT_STASHED(BIRD) == BIRD_CAGED)) { + PROP_STASHIFY(game.objects[BIRD].prop) == BIRD_CAGED)) { /* expression maps BIRD to CAGE and CAGE to BIRD */ carry(BIRD + CAGE - obj, game.loc); } diff --git a/advent.h b/advent.h index 9f306c1..9841037 100644 --- a/advent.h +++ b/advent.h @@ -61,7 +61,7 @@ * STATE_NOTFOUND is only set on treasures. Non-treasures start the * game in STATE_FOUND. * - * OBJECT_STASHED is supposed to map a state property value to a + * PROP_STASHIFY is supposed to map a state property value to a * negative range, where the object cannot be picked up but the value * can be recovered later. Various objects get this property when * the cave starts to close. Only seems to be significant for the bird @@ -100,7 +100,6 @@ #define OBJECT_IS_NOTFOUND2(g, o) (!g.objects[o].found) #define OBJECT_SET_SEEN(obj) game.objects[object].found = true #endif -#define OBJECT_STASHED(obj) PROP_STASHIFY(game.objects[obj].prop) #define PROMPT "> " diff --git a/main.c b/main.c index 4db3836..688cfc7 100644 --- a/main.c +++ b/main.c @@ -1276,7 +1276,7 @@ static bool do_command(void) { (OBJECT_IS_NOTFOUND(i) || OBJECT_IS_STASHED(i))) { game.objects[i].prop = - OBJECT_STASHED(i); + PROP_STASHIFY(game.objects[i].prop); } } } -- 2.31.1 From 08f0351817b54e76f33609b12deec52e8efbcd4c Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sun, 22 Sep 2024 22:34:07 -0400 Subject: [PATCH 08/16] Introduce OBJECT_STASHIFY. --- advent.h | 1 + main.c | 3 +-- misc.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/advent.h b/advent.h index 9841037..d1504f0 100644 --- a/advent.h +++ b/advent.h @@ -100,6 +100,7 @@ #define OBJECT_IS_NOTFOUND2(g, o) (!g.objects[o].found) #define OBJECT_SET_SEEN(obj) game.objects[object].found = true #endif +#define OBJECT_STASHIFY(obj, pval) game.objects[obj].prop = PROP_STASHIFY(pval) #define PROMPT "> " diff --git a/main.c b/main.c index 688cfc7..14c9065 100644 --- a/main.c +++ b/main.c @@ -1275,8 +1275,7 @@ static bool do_command(void) { if (TOTING(i) && (OBJECT_IS_NOTFOUND(i) || OBJECT_IS_STASHED(i))) { - game.objects[i].prop = - PROP_STASHIFY(game.objects[i].prop); + OBJECT_STASHIFY(i, game.objects[i].prop); } } } diff --git a/misc.c b/misc.c index 9fddfd5..b28949e 100644 --- a/misc.c +++ b/misc.c @@ -625,7 +625,7 @@ void put(obj_t object, loc_t where, int pval) { /* put() is the same as move(), except the object is stashed and * can no longer be picked up. */ move(object, where); - game.objects[object].prop = PROP_STASHIFY(pval); + OBJECT_STASHIFY(object, pval); #ifdef OBJECT_SET_SEEN OBJECT_SET_SEEN(object); #endif -- 2.31.1 From 9a6e4406f55df92d448fcad0b54aff1902787e11 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sun, 22 Sep 2024 23:09:16 -0400 Subject: [PATCH 09/16] Confine uses of PROP_STASHIFY() to advent.h Now it shouyld be possible to manipulate a stashed flag by only changing macros. --- actions.c | 3 +-- advent.h | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/actions.c b/actions.c index 107b298..6f93eb0 100644 --- a/actions.c +++ b/actions.c @@ -406,8 +406,7 @@ static phase_codes_t vcarry(verb_t verb, obj_t obj) { game.objects[BIRD].prop = BIRD_CAGED; } if ((obj == BIRD || obj == CAGE) && - (game.objects[BIRD].prop == BIRD_CAGED || - PROP_STASHIFY(game.objects[BIRD].prop) == BIRD_CAGED)) { + OBJECT_STATE_EQUALS(BIRD, BIRD_CAGED)) { /* expression maps BIRD to CAGE and CAGE to BIRD */ carry(BIRD + CAGE - obj, game.loc); } diff --git a/advent.h b/advent.h index d1504f0..6686dfc 100644 --- a/advent.h +++ b/advent.h @@ -77,6 +77,7 @@ #define OBJECT_SET_FOUND(obj) (game.objects[obj].prop = STATE_FOUND) #define OBJECT_SET_NOT_FOUND(obj) (game.objects[obj].prop = STATE_NOTFOUND) #define OBJECT_IS_NOTFOUND2(g, o) (g.objects[o].prop == STATE_NOTFOUND) +#define OBJECT_STATE_EQUALS(obj, pval) ((game.objects[obj].prop == pval) || (game.objects[obj].prop == PROP_STASHIFY(pval))) #else /* (ESR) Only the boldest of adventurers will explore here. This * alternate set of definitions for the macros above was an attempt to -- 2.31.1 From a4fd14caf710b8327d631a99c49b81f411f0161a Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Sun, 22 Sep 2024 23:32:23 -0400 Subject: [PATCH 10/16] Back away from trying for the found member until we make stashed work. --- advent.h | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/advent.h b/advent.h index 6686dfc..fa3c185 100644 --- a/advent.h +++ b/advent.h @@ -47,7 +47,6 @@ #define IS_FIXED -1 #define IS_FREE 0 -#ifndef FOUNDBOOL /* (ESR) It is fitting that translation of the original ADVENT should * have left us a maze of twisty little conditionals that resists all * understanding. Setting and use of what is now the per-object state @@ -78,29 +77,6 @@ #define OBJECT_SET_NOT_FOUND(obj) (game.objects[obj].prop = STATE_NOTFOUND) #define OBJECT_IS_NOTFOUND2(g, o) (g.objects[o].prop == STATE_NOTFOUND) #define OBJECT_STATE_EQUALS(obj, pval) ((game.objects[obj].prop == pval) || (game.objects[obj].prop == PROP_STASHIFY(pval))) -#else -/* (ESR) Only the boldest of adventurers will explore here. This - * alternate set of definitions for the macros above was an attempt to - * break out of the state encoding a per-object "found" member - * telling whether or not the player has seen the object. - */ -#define PROP_STASHIFY(n) (-(n)) -#define PROP_IS_INVALID(val) (val < -MAX_STATE || val > MAX_STATE) -#define OBJECT_IS_STASHED(obj) (game.objects[obj].prop < 0) -#define OBJECT_IS_NOTFOUND(obj) (!game.objects[obj].found) -#define OBJECT_IS_FOUND(obj) \ - (game.objects[obj].found && game.objects[obj].prop == 0) -#define OBJECT_IS_STASHED_OR_UNSEEN(obj) \ - (!game.objects[obj].found || game.objects[obj].prop < 0) -#define OBJECT_SET_FOUND(obj) \ - do { \ - game.objects[obj].found = true; \ - game.objects[obj].prop = STATE_FOUND; \ - } while (0) -#define OBJECT_SET_NOT_FOUND(obj) game.objects[obj].found = false -#define OBJECT_IS_NOTFOUND2(g, o) (!g.objects[o].found) -#define OBJECT_SET_SEEN(obj) game.objects[object].found = true -#endif #define OBJECT_STASHIFY(obj, pval) game.objects[obj].prop = PROP_STASHIFY(pval) #define PROMPT "> " @@ -254,9 +230,6 @@ struct game_t { loc_t oldloc; // prior loc of each dwarf, initially garbage } dwarves[NDWARVES + 1]; struct { -#ifdef FOUNDBOOL - bool32_t found; // has the location of this object been found? -#endif loc_t fixed; // fixed location of object (if not IS_FREE) int32_t prop; // object state loc_t place; // location of object -- 2.31.1 From 40742e112ba73e1fd98c9b898f6ce5812c7c74b7 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 23 Sep 2024 03:53:28 -0400 Subject: [PATCH 11/16] Expand a macro to simplify code. --- actions.c | 2 +- advent.h | 9 ++++----- main.c | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/actions.c b/actions.c index 6f93eb0..e5f2e70 100644 --- a/actions.c +++ b/actions.c @@ -970,7 +970,7 @@ static phase_codes_t listen(void) { } for (obj_t i = 1; i <= NOBJECTS; i++) { if (!HERE(i) || objects[i].sounds[0] == NULL || - OBJECT_IS_STASHED_OR_UNSEEN(i)) { + OBJECT_IS_STASHED(i) || OBJECT_IS_NOTFOUND(i)) { continue; } int mi = game.objects[i].prop; diff --git a/advent.h b/advent.h index fa3c185..204fce7 100644 --- a/advent.h +++ b/advent.h @@ -67,17 +67,16 @@ * and readable objects, notably the clam/oyster - but the code around * those tests is difficult to read. */ -#define PROP_STASHIFY(n) (-1 - (n)) -#define PROP_IS_INVALID(val) (val < -MAX_STATE - 1 || val > MAX_STATE) -#define OBJECT_IS_STASHED(obj) (game.objects[obj].prop < STATE_NOTFOUND) #define OBJECT_IS_NOTFOUND(obj) (game.objects[obj].prop == STATE_NOTFOUND) #define OBJECT_IS_FOUND(obj) (game.objects[obj].prop == STATE_FOUND) -#define OBJECT_IS_STASHED_OR_UNSEEN(obj) (game.objects[obj].prop < 0) #define OBJECT_SET_FOUND(obj) (game.objects[obj].prop = STATE_FOUND) #define OBJECT_SET_NOT_FOUND(obj) (game.objects[obj].prop = STATE_NOTFOUND) #define OBJECT_IS_NOTFOUND2(g, o) (g.objects[o].prop == STATE_NOTFOUND) -#define OBJECT_STATE_EQUALS(obj, pval) ((game.objects[obj].prop == pval) || (game.objects[obj].prop == PROP_STASHIFY(pval))) +#define PROP_IS_INVALID(val) (val < -MAX_STATE - 1 || val > MAX_STATE) +#define PROP_STASHIFY(n) (-1 - (n)) #define OBJECT_STASHIFY(obj, pval) game.objects[obj].prop = PROP_STASHIFY(pval) +#define OBJECT_IS_STASHED(obj) (game.objects[obj].prop < STATE_NOTFOUND) +#define OBJECT_STATE_EQUALS(obj, pval) ((game.objects[obj].prop == pval) || (game.objects[obj].prop == PROP_STASHIFY(pval))) #define PROMPT "> " diff --git a/main.c b/main.c index 14c9065..c823280 100644 --- a/main.c +++ b/main.c @@ -188,7 +188,7 @@ static void checkhints(void) { return; case 9: /* jade */ if (game.tally == 1 && - OBJECT_IS_STASHED_OR_UNSEEN(JADE)) { + (OBJECT_IS_STASHED(JADE) || OBJECT_IS_NOTFOUND(JADE))) { break; } game.hints[hint].lc = 0; @@ -1061,7 +1061,7 @@ static void listobjects(void) { * running this code only on objects with the treasure * property set. Nope. There is mystery here. */ - if (OBJECT_IS_STASHED_OR_UNSEEN(obj)) { + if (OBJECT_IS_STASHED(i) || OBJECT_IS_NOTFOUND(obj)) { if (game.closed) { continue; } -- 2.31.1 From 96ad6c6245bfc18fb36116717143a299b98a9c77 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 23 Sep 2024 04:38:24 -0400 Subject: [PATCH 12/16] Reflow. --- advent.h | 4 +++- main.c | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/advent.h b/advent.h index 204fce7..b9c98d9 100644 --- a/advent.h +++ b/advent.h @@ -76,7 +76,9 @@ #define PROP_STASHIFY(n) (-1 - (n)) #define OBJECT_STASHIFY(obj, pval) game.objects[obj].prop = PROP_STASHIFY(pval) #define OBJECT_IS_STASHED(obj) (game.objects[obj].prop < STATE_NOTFOUND) -#define OBJECT_STATE_EQUALS(obj, pval) ((game.objects[obj].prop == pval) || (game.objects[obj].prop == PROP_STASHIFY(pval))) +#define OBJECT_STATE_EQUALS(obj, pval) \ + ((game.objects[obj].prop == pval) || \ + (game.objects[obj].prop == PROP_STASHIFY(pval))) #define PROMPT "> " diff --git a/main.c b/main.c index c823280..d383095 100644 --- a/main.c +++ b/main.c @@ -188,7 +188,8 @@ static void checkhints(void) { return; case 9: /* jade */ if (game.tally == 1 && - (OBJECT_IS_STASHED(JADE) || OBJECT_IS_NOTFOUND(JADE))) { + (OBJECT_IS_STASHED(JADE) || + OBJECT_IS_NOTFOUND(JADE))) { break; } game.hints[hint].lc = 0; @@ -1275,7 +1276,8 @@ static bool do_command(void) { if (TOTING(i) && (OBJECT_IS_NOTFOUND(i) || OBJECT_IS_STASHED(i))) { - OBJECT_STASHIFY(i, game.objects[i].prop); + OBJECT_STASHIFY( + i, game.objects[i].prop); } } } -- 2.31.1 From 92451f1fff194355ccc4c770ddc54944ec7fda6a Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 23 Sep 2024 05:08:11 -0400 Subject: [PATCH 13/16] Eliminate thew last property inequality outside a macro. --- actions.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/actions.c b/actions.c index e5f2e70..1786c53 100644 --- a/actions.c +++ b/actions.c @@ -329,8 +329,7 @@ static phase_codes_t vcarry(verb_t verb, obj_t obj) { if (game.objects[obj].fixed != IS_FREE) { switch (obj) { case PLANT: - /* Next guard tests whether plant is tiny or stashed */ - rspeak(game.objects[PLANT].prop <= PLANT_THIRSTY + rspeak((game.objects[PLANT].prop == PLANT_THIRSTY || OBJECT_IS_STASHED(PLANT)) ? DEEP_ROOTS : YOU_JOKING); break; -- 2.31.1 From 5c90880f0a20ec7e06740e7699cd5ff9c94b44b4 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 23 Sep 2024 06:04:40 -0400 Subject: [PATCH 14/16] Comment and macro cleanup. --- actions.c | 3 ++- advent.h | 39 ++++++++++++++++++++------------------- main.c | 4 ++-- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/actions.c b/actions.c index 1786c53..96dabb3 100644 --- a/actions.c +++ b/actions.c @@ -329,7 +329,8 @@ static phase_codes_t vcarry(verb_t verb, obj_t obj) { if (game.objects[obj].fixed != IS_FREE) { switch (obj) { case PLANT: - rspeak((game.objects[PLANT].prop == PLANT_THIRSTY || OBJECT_IS_STASHED(PLANT)) + rspeak((game.objects[PLANT].prop == PLANT_THIRSTY || + OBJECT_IS_STASHED(PLANT)) ? DEEP_ROOTS : YOU_JOKING); break; diff --git a/advent.h b/advent.h index b9c98d9..4a6d4d3 100644 --- a/advent.h +++ b/advent.h @@ -83,23 +83,24 @@ #define PROMPT "> " /* - * DESTROY(N) = Get rid of an item by putting it in LOC_NOWHERE - * MOD(N,M) = Arithmetic modulus - * TOTING(OBJ) = true if the OBJ is being carried - * AT(OBJ) = true if on either side of two-placed object - * HERE(OBJ) = true if the OBJ is at "LOC" (or is being carried) - * CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit) - * LIQUID() = object number of liquid in bottle - * LIQLOC(LOC) = object number of liquid (if any) at LOC - * FORCED(LOC) = true if LOC moves without asking for input (COND=2) - * DARK(LOC) = true if location "LOC" is dark - * PCT(N) = true N% of the time (N integer from 0 to 100) - * GSTONE(OBJ) = true if OBJ is a gemstone - * FOREST(LOC) = true if LOC is part of the forest - * OUTSID(LOC) = true if location not in the cave - * INSIDE(LOC) = true if location is in the cave or the building at the - * beginning of the game INDEEP(LOC) = true if location is in the Hall of Mists - * or deeper BUG(X) = report bug and exit + * DESTROY(N) = Get rid of an item by putting it in LOC_NOWHERE + * MOD(N,M) = Arithmetic modulus + * TOTING(OBJ) = true if the OBJ is being carried + * AT(OBJ) = true if on either side of two-placed object + * HERE(OBJ) = true if the OBJ is at "LOC" (or is being carried) + * CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit) + * LIQUID() = object number of liquid in bottle + * LIQLOC(LOC) = object number of liquid (if any) at LOC + * FORCED(LOC) = true if LOC moves without asking for input (COND=2) + * DARK(LOC) = true if location "LOC" is dark + * PCT(N) = true N% of the time (N integer from 0 to 100) + * GSTONE(OBJ) = true if OBJ is a gemstone + * FOREST(LOC) = true if LOC is part of the forest + * OUTSIDE(LOC) = true if location not in the cave + * INSIDE(LOC) = true if location is in the cave or the building at the + * beginning of the game + * INDEEP(LOC) = true if location is in the Hall of Mists or deeper + * BUG(X) = report bug and exit */ #define DESTROY(N) move(N, LOC_NOWHERE) #define MOD(N, M) ((N) % (M)) @@ -124,8 +125,8 @@ #define GSTONE(OBJ) \ ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH) #define FOREST(LOC) CNDBIT(LOC, COND_FOREST) -#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC)) -#define INSIDE(LOC) (!OUTSID(LOC) || LOC == LOC_BUILDING) +#define OUTSIDE(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC)) +#define INSIDE(LOC) (!OUTSIDE(LOC) || LOC == LOC_BUILDING) #define INDEEP(LOC) CNDBIT((LOC), COND_DEEP) #define BUG(x) bug(x, #x) diff --git a/main.c b/main.c index d383095..3ecf65a 100644 --- a/main.c +++ b/main.c @@ -640,7 +640,7 @@ static void playermove(int motion) { } else if (motion == CAVE) { /* Cave. Different messages depending on whether above ground. */ - rspeak((OUTSID(game.loc) && game.loc != LOC_GRATE) + rspeak((OUTSIDE(game.loc) && game.loc != LOC_GRATE) ? FOLLOW_STREAM : NEED_DETAIL); return; @@ -1193,7 +1193,7 @@ static bool preprocess_command(command_t *command) { static bool do_move(void) { /* Actually execute the move to the new location and dwarf movement */ /* Can't leave cave once it's closing (except by main office). */ - if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) { + if (OUTSIDE(game.newloc) && game.newloc != 0 && game.closng) { rspeak(EXIT_CLOSED); game.newloc = game.loc; if (!game.panic) { -- 2.31.1 From a2bb39dc7e9379900d4c87d8084c196ddd61b32f Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 23 Sep 2024 14:17:52 -0400 Subject: [PATCH 15/16] Eliminate a confusing dummy argument in a macro. --- actions.c | 6 +++--- advent.h | 38 +++++++++++++++++++------------------- main.c | 8 ++++---- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/actions.c b/actions.c index 96dabb3..469e92f 100644 --- a/actions.c +++ b/actions.c @@ -676,7 +676,7 @@ static phase_codes_t extinguish(verb_t verb, obj_t obj) { break; case LAMP: state_change(LAMP, LAMP_DARK); - rspeak(DARK(game.loc) ? PITCH_DARK : NO_MESSAGE); + rspeak(IS_DARK_HERE() ? PITCH_DARK : NO_MESSAGE); break; case DRAGON: case VOLCANO: @@ -1155,12 +1155,12 @@ static phase_codes_t read(command_t command) } } if (command.obj > NOBJECTS || command.obj == NO_OBJECT || - DARK(game.loc)) { + IS_DARK_HERE()) { return GO_UNKNOWN; } } - if (DARK(game.loc)) { + if (IS_DARK_HERE()) { sspeak(NO_SEE, command.word[0].raw); } else if (command.obj == OYSTER) { if (!TOTING(OYSTER) || !game.closed) { diff --git a/advent.h b/advent.h index 4a6d4d3..3ae9012 100644 --- a/advent.h +++ b/advent.h @@ -83,24 +83,24 @@ #define PROMPT "> " /* - * DESTROY(N) = Get rid of an item by putting it in LOC_NOWHERE - * MOD(N,M) = Arithmetic modulus - * TOTING(OBJ) = true if the OBJ is being carried - * AT(OBJ) = true if on either side of two-placed object - * HERE(OBJ) = true if the OBJ is at "LOC" (or is being carried) - * CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit) - * LIQUID() = object number of liquid in bottle - * LIQLOC(LOC) = object number of liquid (if any) at LOC - * FORCED(LOC) = true if LOC moves without asking for input (COND=2) - * DARK(LOC) = true if location "LOC" is dark - * PCT(N) = true N% of the time (N integer from 0 to 100) - * GSTONE(OBJ) = true if OBJ is a gemstone - * FOREST(LOC) = true if LOC is part of the forest - * OUTSIDE(LOC) = true if location not in the cave - * INSIDE(LOC) = true if location is in the cave or the building at the - * beginning of the game - * INDEEP(LOC) = true if location is in the Hall of Mists or deeper - * BUG(X) = report bug and exit + * DESTROY(N) = Get rid of an item by putting it in LOC_NOWHERE + * MOD(N,M) = Arithmetic modulus + * TOTING(OBJ) = true if the OBJ is being carried + * AT(OBJ) = true if on either side of two-placed object + * HERE(OBJ) = true if the OBJ is at "LOC" (or is being carried) + * CNDBIT(L,N) = true if COND(L) has bit n set (bit 0 is units bit) + * LIQUID() = object number of liquid in bottle + * LIQLOC(LOC) = object number of liquid (if any) at LOC + * FORCED(LOC) = true if LOC moves without asking for input (COND=2) + * IS_DARK_HERE() = true if location "LOC" is dark + * PCT(N) = true N% of the time (N integer from 0 to 100) + * GSTONE(OBJ) = true if OBJ is a gemstone + * FOREST(LOC) = true if LOC is part of the forest + * OUTSIDE(LOC) = true if location not in the cave + * INSIDE(LOC) = true if location is in the cave or the building at the + * beginning of the game + * INDEEP(LOC) = true if location is in the Hall of Mists or deeper + * BUG(X) = report bug and exit */ #define DESTROY(N) move(N, LOC_NOWHERE) #define MOD(N, M) ((N) % (M)) @@ -118,7 +118,7 @@ (CNDBIT((LOC), COND_FLUID) ? CNDBIT((LOC), COND_OILY) ? OIL : WATER \ : NO_OBJECT) #define FORCED(LOC) CNDBIT(LOC, COND_FORCED) -#define DARK(DUMMY) \ +#define IS_DARK_HERE() \ (!CNDBIT(game.loc, COND_LIT) && \ (game.objects[LAMP].prop == LAMP_DARK || !HERE(LAMP))) #define PCT(N) (randrange(100) < (N)) diff --git a/main.c b/main.c index 3ecf65a..835fc1b 100644 --- a/main.c +++ b/main.c @@ -534,7 +534,7 @@ static void describe_location(void) { msg = locations[game.loc].description.big; } - if (!FORCED(game.loc) && DARK(game.loc)) { + if (!FORCED(game.loc) && IS_DARK_HERE()) { msg = arbitrary_messages[PITCH_DARK]; } @@ -1047,7 +1047,7 @@ static void listobjects(void) { * Similarly for chain; game.prop is initially CHAINING_BEAR (locked to * bear). These hacks are because game.prop=0 is needed to * get full score. */ - if (!DARK(game.loc)) { + if (!IS_DARK_HERE()) { ++game.locs[game.loc].abbrev; for (int i = game.locs[game.loc].atloc; i != 0; i = game.link[i]) { @@ -1229,7 +1229,7 @@ static bool do_move(void) { /* The easiest way to get killed is to fall into a pit in * pitch darkness. */ - if (!FORCED(game.loc) && DARK(game.loc) && game.wzdark && + if (!FORCED(game.loc) && IS_DARK_HERE() && game.wzdark && PCT(PIT_KILL_PROB)) { rspeak(PIT_FALL); game.oldlc2 = game.loc; @@ -1283,7 +1283,7 @@ static bool do_command(void) { } /* Check to see if the room is dark. */ - game.wzdark = DARK(game.loc); + game.wzdark = IS_DARK_HERE(); /* If the knife is not here it permanently disappears. * Possibly this should fire if the knife is here but -- 2.31.1 From 9df69fe0347d4c02956336d3659d8aa06a91dce9 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 23 Sep 2024 18:48:11 -0400 Subject: [PATCH 16/16] Ready to ship 1.20. --- NEWS.adoc | 2 +- advent.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS.adoc b/NEWS.adoc index f9c70d6..0140574 100644 --- a/NEWS.adoc +++ b/NEWS.adoc @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: (C) Eric S. Raymond // SPDX-License-Identifier: CC-BY-4.0 -Repository head:: +1.20: 2024-09-23:: Make oldstyle correctly suppress line editing. 1.19: 2024-06-27:: diff --git a/advent.h b/advent.h index 3ae9012..fa0767b 100644 --- a/advent.h +++ b/advent.h @@ -66,6 +66,8 @@ * the cave starts to close. Only seems to be significant for the bird * and readable objects, notably the clam/oyster - but the code around * those tests is difficult to read. + * + * All tests of the prop member are done with either these macros or ==. */ #define OBJECT_IS_NOTFOUND(obj) (game.objects[obj].prop == STATE_NOTFOUND) #define OBJECT_IS_FOUND(obj) (game.objects[obj].prop == STATE_FOUND) -- 2.31.1