Structurization of hints.
authorEric S. Raymond <esr@thyrsus.com>
Fri, 7 Apr 2023 14:52:16 +0000 (10:52 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Fri, 7 Apr 2023 14:52:16 +0000 (10:52 -0400)
advent.h
main.c
score.c

index 04d2fc29f9544efa13b4ad9a5cd9860891583837..62a54acf4ca4711048119f6c01951d5e6e4e6c96 100644 (file)
--- 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 5e7d6abf932a1713c2c5f4e719cacae5a77d4325..52e418745398b019327178fbd4e3d6222ac5f389 100644 (file)
--- 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 d3eeb0aa7848d9d448a5460eea09c05acb6dbc41..2e804e4983741789f25190a076820df3e04088fd 100644 (file)
--- 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)