From: Eric S. Raymond Date: Tue, 4 Jul 2017 17:40:05 +0000 (-0400) Subject: Abstract out some state arithmetic. X-Git-Tag: takebird~30 X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=commitdiff_plain;h=a8ac2f477a2564bcf5b40508aea2c192d237c88a;hp=4ac9df527bf965d4f74ce908d6b5170ed605aa91 Abstract out some state arithmetic. --- 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);