125 lines
4 KiB
Python
Executable file
125 lines
4 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#
|
|
# Enhance adventure.yaml entries with explicit properties based on Section 9
|
|
# of adventure.text and the kludgy macro definitions in advent.h.
|
|
#
|
|
# The FORCED bit can't be set here. That has to be done fom the travel arrays.
|
|
#
|
|
# This script is meant to be gotten right, used once, and then discarded.
|
|
# We'll leave a copy in the repository history for reference
|
|
#
|
|
# When in doubt, make the code dumber and the data smarter.
|
|
#
|
|
import sys, yaml
|
|
|
|
# This is the original location-attribute data from section 9 of adventure.text
|
|
# Bit indices are the first element of each tuple; the remaining numbers are
|
|
# indices of locations with that bit set.
|
|
section12 = (
|
|
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
|
|
(0, 100, 115, 116, 126, 145, 146, 147, 148, 149, 150),
|
|
(0, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160),
|
|
(0, 161, 162, 163, 164, 165, 166, 167),
|
|
(1, 24),
|
|
(2, 1, 3, 4, 7, 38, 95, 113, 24, 168, 169),
|
|
(3, 46, 47, 48, 54, 56, 58, 82, 85, 86),
|
|
(3, 122, 123, 124, 125, 126, 127, 128, 129, 130),
|
|
(4, 6, 145, 146, 147, 148, 149, 150, 151, 152),
|
|
(4, 153, 154, 155, 156, 157, 158, 159, 160, 161),
|
|
(4, 162, 163, 164, 165, 166, 42, 43, 44, 45),
|
|
(4, 49, 50, 51, 52, 53, 55, 57, 80, 83),
|
|
(4, 84, 87, 107, 112, 131, 132, 133, 134, 135),
|
|
(4, 136, 137, 138, 139, 108),
|
|
(11, 8),
|
|
(12, 13),
|
|
(13, 19),
|
|
(14, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51),
|
|
(14, 52, 53, 54, 55, 56, 80, 81, 82, 86, 87),
|
|
(15, 99, 100, 101),
|
|
(16, 108),
|
|
(17, 6),
|
|
(18, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154),
|
|
(18, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164),
|
|
(18, 165, 166),
|
|
(19, 143),
|
|
(20, 8, 15, 64, 109, 126),
|
|
)
|
|
|
|
# Names for attribute bits
|
|
attrnames = (
|
|
"LIT", # 0
|
|
"OILY", # 1
|
|
"FLUID", # 2
|
|
"NOARRR", # 3
|
|
"NOBACK", # 4
|
|
"", # 5
|
|
"FOREST", # 6 # New
|
|
"ABOVE", # 7 # New
|
|
"DEEP", # 8 # New
|
|
"", # 9
|
|
"HBASE", # 10
|
|
"HCAVE", # 11
|
|
"HBIRD", # 12
|
|
"HSNAKE", # 13
|
|
"HMAZE", # 14
|
|
"HDARK", # 15
|
|
"HWITT", # 16
|
|
"HCLIFF", # 17
|
|
"HWOODS", # 18
|
|
"HOGRE", # 19
|
|
"HJADE", # 20
|
|
)
|
|
|
|
nlocs = 184
|
|
grate = 8
|
|
misthall = 15
|
|
sapphireloc = 167
|
|
|
|
# For reference from advent.h:
|
|
#
|
|
# define FOREST(LOC) ((LOC) >= LOC_FOREST1 && (LOC) <= LOC_FOREST22)
|
|
#
|
|
#/* The following two functions were added to fix a bug (game.clock1 decremented
|
|
# * while in forest). They should probably be replaced by using another
|
|
# * "cond" bit. For now, however, a quick fix... OUTSID(LOC) is true if
|
|
# * LOC is outside, INDEEP(LOC) is true if LOC is "deep" in the cave (hall
|
|
# * of mists or deeper). Note special kludges for "Foof!" locs. */
|
|
# define OUTSID(LOC) ((LOC) <= LOC_GRATE || FOREST(LOC) || (LOC) == PLAC[SAPPH] || (LOC) == LOC_FOOF2 || (LOC) == LOC_FOOF4)
|
|
# define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC) && (LOC) != LOC_FOOF1)
|
|
|
|
def genline(loc):
|
|
attrs = {}
|
|
name = locnames[loc]
|
|
for props in section12:
|
|
if loc in props[1:]:
|
|
if props[0] not in attrs:
|
|
attrs[attrnames[props[0]]] = True
|
|
# Adod new attributes. These are computed the same way as the
|
|
# INDEEP(), OUTSID(), and FOREST() macros in advent.h.
|
|
if "FOREST" in name:
|
|
attrs["FOREST"] = True
|
|
# 167 is the sapphire's start location
|
|
if loc in range(1, grate+1) or name in ("FOOF2", "FOOF4") or name == sapphireloc:
|
|
attrs["ABOVE"] = True
|
|
if not loc in range(0, misthall+1) and name != "FOOF1" and 6 not in attrs:
|
|
attrs["DEEP"] = True
|
|
naqmes = str(attrs).replace("'", "").replace("True", "true").replace("False", "false")
|
|
return " conditions: %s\n" % (names,)
|
|
|
|
if __name__ == "__main__":
|
|
with open("adventure.yaml", "r") as fp:
|
|
db = yaml.load(fp)
|
|
fp.seek(0)
|
|
locnames = [el[0] for el in db["locations"]]
|
|
ln = -1
|
|
while True:
|
|
line = fp.readline()
|
|
if not line:
|
|
break
|
|
if line.startswith("- LOC"):
|
|
if ln > -1:
|
|
sys.stdout.write(genline(ln))
|
|
ln += 1
|
|
sys.stdout.write(line)
|
|
|
|
# end
|