Scholomance: switch to upreza 4-floor 4096x3072 maps for parity with the rest of the picker

Same multi-floor look as every other dungeon: 4 webps with floor tabs (The Reliquary / Chamber of Summoning / The Upper Study / Headmaster's Study).

Each of the 14 classic Scholo bosses hand-pinned to a specific room within its floor:
  f1 (Reliquary):     Blood Steward of Kirtonos
  f2 (CoS):           Kirtonos summon, Vectus, Marduk Blackpool
  f3 (Upper Study):   Jandice, Rattlegore, Polkelt, Krastinov, Malicia
  f4 (Headmaster's):  Illucia, Alexei, Ravenian, Ras, Gandling

Schema change: dungeon_replacements now supports a 'floors' array for multi-floor manual overrides, alongside the existing single-floor 'bosses'/'atlasloot_id' modes.
This commit is contained in:
2026-04-26 00:57:54 +02:00
parent 58b3f74292
commit 247633546a
3 changed files with 236 additions and 132 deletions
+46 -6
View File
@@ -244,12 +244,52 @@ def main() -> int:
def replacement_entry(tile_key, repl, registry_entry):
"""Build a complete dungeon record from a manual-override map.
Two boss-source modes:
1. `bosses` list: explicit hand-pinned positions in the new
image's pixel space. Authoritative.
2. `atlasloot_id`: pull from AtlasLoot subkeys with cords. Coords
are 0-100 percent, scaled to the new image. Approximate (AL
coords are subzone-relative, not whole-map)."""
Three shapes are supported:
1. `floors`: list of per-floor maps each with their own bosses.
For multi-floor dungeons we want to ship at parity with the
rest of the picker (4 webps with floor-tabs).
2. `bosses` list at top level: single-floor + explicit pins.
3. `atlasloot_id`: single-floor + pull from AtlasLoot. Cords
are 0-100 percent of the AL subzone frame — only roughly
correct on full-map images."""
# --- multi-floor case ---
if "floors" in repl:
maps_out = []
for f in repl["floors"]:
fW, fH = f["width"], f["height"]
enemies = []
for b in f.get("bosses", []):
enemies.append({
"id": None, "npc_id": None,
"name": b["name"],
"pos": [round(b["pos"][0], 1), round(b["pos"][1], 1)],
"classification": b.get("cls", 3),
"skippable": False, "required": False,
"kill_priority": None, "pack_id": None, "patrol_id": None,
"ascension_pinned": True,
})
maps_out.append({
"image": f["image"],
"width": fW, "height": fH,
"label": f.get("label", tile_key),
"kg_floor_id": f.get("kg_floor_id"),
"enemies": enemies,
"packs": [], "patrols": [], "icons": [],
})
return {
"id": tile_key,
"expansion": "OriginalWoW",
"name": registry_entry.get("name", tile_key),
"acronym": registry_entry.get("acronym"),
"tile_key": tile_key,
"data_slug": registry_entry.get("data_slug"),
"mapping_id": registry_entry.get("mapping_id"),
"maps": maps_out,
"ascension_replaced": True,
"replacement_note": repl.get("note"),
}
W, H = repl["width"], repl["height"]
enemies = []