From 8d4d64fafbff1191bf221e32ed4a8aba48ac63f4 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Fri, 7 Apr 2023 10:52:16 -0400 Subject: [PATCH] Structurization of hints. --- advent.h | 8 +++++--- main.c | 28 ++++++++++++++-------------- score.c | 2 +- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/advent.h b/advent.h index 04d2fc2..62a54ac 100644 --- a/advent.h +++ b/advent.h @@ -191,14 +191,16 @@ struct game_t { loc_t loc; // location of dwarves, initially hard-wired in loc_t oldloc; // prior loc of each dwarf, initially garbage } dwarves[NDWARVES + 1]; - struct object { + struct { 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. + int lc; // hints[i].lc = show int at LOC with cond bit i + } hints[NHINTS]; obj_t link[NOBJECTS * 2 + 1];// object-list links - bool hinted[NHINTS]; // hinted[i] = true iff hint i has been used. - int hintlc[NHINTS]; // hintlc[i] = show int at LOC with cond bit i }; /* diff --git a/main.c b/main.c index 5e7d6ab..52e4187 100644 --- a/main.c +++ b/main.c @@ -104,14 +104,14 @@ static void checkhints(void) { if (conditions[game.loc] >= game.conds) { for (int hint = 0; hint < NHINTS; hint++) { - if (game.hinted[hint]) + if (game.hints[hint].used) continue; if (!CNDBIT(game.loc, hint + 1 + COND_HBASE)) - game.hintlc[hint] = -1; - ++game.hintlc[hint]; + game.hints[hint].lc = -1; + ++game.hints[hint].lc; /* Come here if he's been int enough at required loc(s) for some * unused hint. */ - if (game.hintlc[hint] >= hints[hint].turns) { + if (game.hints[hint].lc >= hints[hint].turns) { int i; switch (hint) { @@ -119,7 +119,7 @@ static void checkhints(void) /* cave */ if (game.objects[GRATE].prop == GRATE_CLOSED && !HERE(KEYS)) break; - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; return; case 1: /* bird */ if (game.objects[BIRD].place == game.loc && TOTING(ROD) && game.oldobj == BIRD) @@ -128,7 +128,7 @@ static void checkhints(void) case 2: /* snake */ if (HERE(SNAKE) && !HERE(BIRD)) break; - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; return; case 3: /* maze */ if (game.locs[game.loc].atloc == NO_OBJECT && @@ -136,19 +136,19 @@ static void checkhints(void) game.locs[game.oldlc2].atloc == NO_OBJECT && game.holdng > 1) break; - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; return; case 4: /* dark */ if (game.objects[EMERALD].prop != STATE_NOTFOUND && game.objects[PYRAMID].prop == STATE_NOTFOUND) break; - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; return; case 5: /* witt */ break; case 6: /* urn */ if (game.dflag == 0) break; - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; return; case 7: /* woods */ if (game.locs[game.loc].atloc == NO_OBJECT && @@ -159,7 +159,7 @@ static void checkhints(void) case 8: /* ogre */ i = atdwrf(game.loc); if (i < 0) { - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; return; } if (HERE(OGRE) && i == 0) @@ -168,7 +168,7 @@ static void checkhints(void) case 9: /* jade */ if (game.tally == 1 && game.objects[JADE].prop < 0) break; - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; return; default: // LCOV_EXCL_LINE // Should never happen @@ -176,12 +176,12 @@ static void checkhints(void) } /* Fall through to hint display */ - game.hintlc[hint] = 0; + game.hints[hint].lc = 0; if (!yes_or_no(hints[hint].question, arbitrary_messages[NO_MESSAGE], arbitrary_messages[OK_MAN])) return; rspeak(HINT_COST, hints[hint].penalty, hints[hint].penalty); - game.hinted[hint] = yes_or_no(arbitrary_messages[WANT_HINT], hints[hint].hint, arbitrary_messages[OK_MAN]); - if (game.hinted[hint] && game.limit > WARNTIME) + game.hints[hint].used = yes_or_no(arbitrary_messages[WANT_HINT], hints[hint].hint, arbitrary_messages[OK_MAN]); + if (game.hints[hint].used && game.limit > WARNTIME) game.limit += WARNTIME * hints[hint].penalty; } } diff --git a/score.c b/score.c index d3eeb0a..2e804e4 100644 --- a/score.c +++ b/score.c @@ -96,7 +96,7 @@ int score(enum termination mode) /* Deduct for hints/turns/saves. Hints < 4 are special; see database desc. */ for (int i = 0; i < NHINTS; i++) { - if (game.hinted[i]) + if (game.hints[i].used) score = score - hints[i].penalty; } if (game.novice) -- 2.31.1