3 # Enhance adventure.yaml entries with explicit properties based on Section 9
4 # of adventure.text and the kludgy macro definitions in advent.h.
6 # This script is meant to be gotten right, used once, and then discarded.
7 # We'll leave a copy in the repository history for reference
9 # When in doubt, make the code dumber and the data smarter.
13 # This is the original location-attribute data from section 9 of adventure.text
14 # Bit indices are the first element of each tuple; the remaining numbers are
15 # indices of locations with that bit set.
17 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
18 (0, 100, 115, 116, 126, 145, 146, 147, 148, 149, 150),
19 (0, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160),
20 (0, 161, 162, 163, 164, 165, 166, 167),
22 (2, 1, 3, 4, 7, 38, 95, 113, 24, 168, 169),
23 (3, 46, 47, 48, 54, 56, 58, 82, 85, 86),
24 (3, 122, 123, 124, 125, 126, 127, 128, 129, 130),
25 (4, 6, 145, 146, 147, 148, 149, 150, 151, 152),
26 (4, 153, 154, 155, 156, 157, 158, 159, 160, 161),
27 (4, 162, 163, 164, 165, 166, 42, 43, 44, 45),
28 (4, 49, 50, 51, 52, 53, 55, 57, 80, 83),
29 (4, 84, 87, 107, 112, 131, 132, 133, 134, 135),
30 (4, 136, 137, 138, 139, 108),
34 (14, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51),
35 (14, 52, 53, 54, 55, 56, 80, 81, 82, 86, 87),
39 (18, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154),
40 (18, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164),
43 (20, 8, 15, 64, 109, 126),
46 # Names for attribute bits
76 # For reference from advent.h:
78 # define FORCED(LOC) (COND[LOC] == 2)
79 # define FOREST(LOC) ((LOC) >= LOC_FOREST1 && (LOC) <= LOC_FOREST22)
81 #/* The following two functions were added to fix a bug (game.clock1 decremented
82 # * while in forest). They should probably be replaced by using another
83 # * "cond" bit. For now, however, a quick fix... OUTSID(LOC) is true if
84 # * LOC is outside, INDEEP(LOC) is true if LOC is "deep" in the cave (hall
85 # * of mists or deeper). Note special kludges for "Foof!" locs. */
86 # define OUTSID(LOC) ((LOC) <= LOC_GRATE || FOREST(LOC) || (LOC) == PLAC[SAPPH] || (LOC) == LOC_FOOF2 || (LOC) == LOC_FOOF4)
87 # define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC) && (LOC) != LOC_FOOF1)
92 for props in section12:
94 if props[0] not in attrs:
95 attrs.append(props[0])
96 # Adod new attributes. These are computed the same way as the
97 # INDEEP(), OUTSID(), and FOREST() macros in advent.h.
99 attrs.append(6) # FOREST
100 # 167 is the sapphire's start location
101 if loc in range(1, grate+1) or name in ("FOOF2", "FOOF4") or name == sapphireloc:
102 attrs.append(7) # ABOVE
103 if not loc in range(0, misthall+1) and name != "FOOF1" and 6 not in attrs:
104 attrs.append(8) # DEEP
105 names = str([attrnames[n] for n in attrs]).replace("'", "")
106 return " conditions: %s\n" % (names,)
108 if __name__ == "__main__":
109 with open("adventure.yaml", "r") as fp:
112 locnames = [el[0] for el in db["locations"]]
118 if line.startswith("- LOC"):
120 sys.stdout.write(genline(ln))
122 sys.stdout.write(line)