From a8ac2f477a2564bcf5b40508aea2c192d237c88a Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 4 Jul 2017 13:40:05 -0400 Subject: [PATCH 1/1] Abstract out some state arithmetic. --- actions.c | 5 ++--- advent.h | 5 +++++ main.c | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/actions.c b/actions.c index d817c6d..ec17c07 100644 --- a/actions.c +++ b/actions.c @@ -361,7 +361,7 @@ static int vcarry(token_t verb, token_t obj) } - if (obj == BIRD && game.prop[BIRD] != BIRD_CAGED && -1 - game.prop[BIRD] != BIRD_CAGED) { + if (obj == BIRD && game.prop[BIRD] != BIRD_CAGED && STASHED(BIRD) != BIRD_CAGED) { if (game.prop[BIRD] == BIRD_FOREST_UNCAGED) { DESTROY(BIRD); rspeak(BIRD_CRAP); @@ -380,8 +380,7 @@ static int vcarry(token_t verb, token_t obj) /* FIXME: Arithmetic on state numbers */ if ((obj == BIRD || obj == CAGE) && - (game.prop[BIRD] == BIRD_CAGED || - -1 - game.prop[BIRD] == 1)) + (game.prop[BIRD] == BIRD_CAGED || STASHED(BIRD) == BIRD_CAGED)) carry(BIRD + CAGE - obj, game.loc); carry(obj, game.loc); if (obj == BOTTLE && LIQUID() != NO_OBJECT) diff --git a/advent.h b/advent.h index cca1dba..3c33725 100644 --- a/advent.h +++ b/advent.h @@ -29,6 +29,11 @@ #define STATE_NOTFOUND -1 // 'Not found" state of treasures */ #define STATE_GROUND 0 // After discovered, before messed with +/* Map a state property value to a negative range, where the object cannot be + * picked up but the value can be recovered later. Avoid colliding with -1, + * which has its own meaning. */ +#define STASHED(obj) (-1 - game.prop[obj]) + /* * MOD(N,M) = Arithmetic modulus * AT(OBJ) = true if on either side of two-placed object diff --git a/main.c b/main.c index 2790696..71a7dac 100644 --- a/main.c +++ b/main.c @@ -1028,7 +1028,7 @@ L2600: pspeak(OYSTER, look, 1, true); for (size_t i = 1; i <= NOBJECTS; i++) { if (TOTING(i) && game.prop[i] < 0) - game.prop[i] = -1 - game.prop[i]; + game.prop[i] = STASHED(i); } } game.wzdark = DARK(game.loc); -- 2.31.1