90def load_boss_soul_map(base_dir, subdir):
91 key = (base_dir, subdir)
92 if key
not in _BOSS_SOUL_CACHE:
93 path = os.path.join(base_dir, subdir,
"boss_souls.json")
95 with open(path, encoding=
"utf-8")
as f:
96 _BOSS_SOUL_CACHE[key] = json.load(f)
97 except (OSError, ValueError):
98 _BOSS_SOUL_CACHE[key] = {}
99 return _BOSS_SOUL_CACHE[key]
112def load_boss_route(base_dir, subdir):
113 key = (base_dir, subdir)
114 if key
not in _BOSS_ROUTE_CACHE:
115 path = os.path.join(base_dir, subdir,
"boss_route.json")
117 with open(path, encoding=
"utf-8")
as f:
118 _BOSS_ROUTE_CACHE[key] = json.load(f)
119 except (OSError, ValueError):
120 _BOSS_ROUTE_CACHE[key] = {}
121 return _BOSS_ROUTE_CACHE[key]
229def attach_defeated_bosses(ch, base_dir):
230 game = ch.get(
"game")
231 subdir = BOSS_SOUL_DB_DIR.get(game)
232 if not subdir
or ch.get(
"bosses"):
234 soul_db = load_boss_soul_map(base_dir, subdir)
236 for name, _q
in ch.get(
"boss_souls")
or []:
237 boss = soul_db.get(name)
239 bosses.setdefault(boss, set()).add(
"soul")
240 if (ch.get(
"ng_plus")
or 0) > 0:
241 for boss
in MANDATORY_BOSSES.get(game, ()):
242 bosses.setdefault(boss, set()).add(
"clear")
243 prereq = BOSS_PREREQ.get(game, {})
244 for boss
in list(bosses):
245 for pre
in prereq.get(boss, ()):
246 bosses.setdefault(pre, set()).add(
"gate")
250 ch[
"bosses"] = {b: sorted(bosses[b])
for b
in bosses}