From: Eric S. Raymond Date: Mon, 10 Apr 2023 22:46:47 +0000 (-0400) Subject: Condition in alternative state-management macros. X-Git-Tag: 1.16~8 X-Git-Url: https://jxself.org/git/?a=commitdiff_plain;h=82c3ae5e65573b97f52d3c14986d45167fa8f884;p=open-adventure.git Condition in alternative state-management macros. These do not entirely work yet. #define FOUNDBOOL to enable them. All tests pass, 100% coverage. --- diff --git a/advent.h b/advent.h index b24eed7..42491e7 100644 --- a/advent.h +++ b/advent.h @@ -48,20 +48,31 @@ #define IS_FIXED -1 #define IS_FREE 0 -/* STASH 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, +/* PROP_STASHED maps a state property value to a negative range, where the object + * cannot be picked up but the value can be recovered later. */ +#ifndef FOUNDBOOL +/* PROP_STASHED needs ro avoid colliding with -1, * which has its own meaning as STATE_NOTFOUND. */ #define PROP_STASHED(obj) (STATE_NOTFOUND - game.objects[obj].prop) #define PROP_IS_STASHED(obj) (game.objects[obj].prop < STATE_NOTFOUND) #define PROP_IS_NOTFOUND(obj) (game.objects[obj].prop == STATE_NOTFOUND) -/* Don't use this on an object wi nore thab 2 (unstashed) states */ #define PROP_IS_FOUND(obj) (game.objects[obj].prop == STATE_FOUND) -/* Magic number -2 allows a PROP_STASHED version of state 1 */ -#define PROP_IS_INVALID(val) (val < -2 || val > 1) #define PROP_IS_STASHED_OR_UNSEEN(obj) (game.objects[obj].prop < 0) #define PROP_SET_FOUND(obj) (game.objects[obj].prop = STATE_FOUND) #define PROP_SET_NOT_FOUND(obj) (game.objects[obj].prop = STATE_NOTFOUND) #define PROP_IS_NOTFOUND2(g, o) (g.objects[o].prop == STATE_NOTFOUND) +#else +#define PROP_STASHED(obj) (-game.objects[obj].prop) +#define PROP_IS_STASHED(obj) (game.objects[obj].prop < 0) +#define PROP_IS_NOTFOUND(obj) (!game.objects[obj].found) +#define PROP_IS_FOUND(obj) (game.objects[obj].found && game.objects[obj].prop == 0) +#define PROP_IS_STASHED_OR_UNSEEN(obj) (!game.objects[obj].found || game.objects[obj].prop < 0) +#define PROP_SET_FOUND(obj) do {game.objects[obj].found = true; game.objects[obj].prop = STATE_FOUND;} while(0) +#define PROP_SET_NOT_FOUND(obj) game.objects[obj].found = false +#define PROP_IS_NOTFOUND2(g, o) (!g.objects[o].found) +#endif +/* Magic number -2 allows a PROP_STASHED version of state 1 */ +#define PROP_IS_INVALID(val) (val < -2 || val > 1) #define PROMPT "> " @@ -202,13 +213,20 @@ struct game_t { loc_t oldloc; // prior loc of each dwarf, initially garbage } dwarves[NDWARVES + 1]; struct { +#ifdef FOUNDBOOL + bool found; // has the location of this object bween found? +#endif loc_t fixed; // fixed location of object (if not IS_FREE) int prop; // object state */ loc_t place; // location of object } objects[NOBJECTS + 1]; struct { bool used; // hints[i].used = true iff hint i has been used. +#ifndef FOUNDBOOL int lc; // hints[i].lc = show int at LOC with cond bit i +#else + int lc; // hints[i].lc = show int at LOC with cond bit i +#endif } hints[NHINTS]; obj_t link[NOBJECTS * 2 + 1];// object-list links }; diff --git a/misc.c b/misc.c index f224d4c..0d540c6 100644 --- a/misc.c +++ b/misc.c @@ -600,7 +600,12 @@ void put(obj_t object, loc_t where, int pval) * negated game.prop values for the repository objects. */ { move(object, where); +#ifndef FOUNDBOOL game.objects[object].prop = (-1) - pval;; // Needs to stay synchronized with PROP_STASHED +#else + game.objects[object].prop = - pval;; // Needs to stay synchronized with PROP_STASHED + game.objects[object].found = true; +#endif } void carry(obj_t object, loc_t where)