Scholomance: Real-ESRGAN-upscaled Atlas classic map + hand-pinned bosses

Real path forward for Scholomance after exhausting the upreza ecosystem (no classic-layout dungeon interior maps exist there because vanilla/TBC clients didn't ship dungeon interior maps — confirmed from WoWMapUprezClassic README + WoWMapUprezTBC contents).

Solution:
- Atlas-addon Scholomance.blp (512x512, classic single-room layout) upscaled to 2048x2048 with Real-ESRGAN x4plus. Numbers 1-14 are crisp and readable.
- New 'bosses' field in dungeon_replacements lets us hand-pin every enemy to a specific (x,y) on the new map. 14 classic Scholo bosses placed on their Atlas-numbered rooms.
- Single-floor dungeon (kg's 4-floor split is bypassed entirely).
This commit is contained in:
2026-04-26 00:43:20 +02:00
parent ad511d54e1
commit 58b3f74292
3 changed files with 205 additions and 8383 deletions
+51 -35
View File
@@ -243,47 +243,63 @@ def main() -> int:
atlasloot_data = None
def replacement_entry(tile_key, repl, registry_entry):
"""Build a complete dungeon record from a manual-override map +
AtlasLoot bosses. Bypasses kg entirely for this dungeon."""
al_id = repl["atlasloot_id"]
al = (atlasloot_data or {}).get("OriginalWoW", {}).get(al_id, {})
"""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)."""
W, H = repl["width"], repl["height"]
enemies = []
seen = set()
for k, v in al.items():
if not k.isdigit() or not isinstance(v, list):
continue
for ent in v:
if not isinstance(ent, dict):
continue
if ent.get("SubZone"):
continue
cords = ent.get("cords")
name = ent.get("1")
if not (isinstance(cords, list) and len(cords) == 2 and name):
continue
key = (name, cords[0], cords[1])
if key in seen:
continue
seen.add(key)
pin = ent.get("pinType")
lname = name.lower()
if pin == "dungeonskull":
cls = 3
elif pin is None and "rare" in lname:
cls = 5
else:
cls = 2 # quest item, summon spot, lever, etc.
if "bosses" in repl:
for b in repl["bosses"]:
enemies.append({
"id": None,
"npc_id": None,
"name": name,
"pos": [round(cords[0] / 100 * W, 1), round(cords[1] / 100 * H, 1)],
"classification": cls,
"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,
})
elif "atlasloot_id" in repl:
al_id = repl["atlasloot_id"]
al = (atlasloot_data or {}).get("OriginalWoW", {}).get(al_id, {})
seen = set()
for k, v in al.items():
if not k.isdigit() or not isinstance(v, list):
continue
for ent in v:
if not isinstance(ent, dict):
continue
if ent.get("SubZone"):
continue
cords = ent.get("cords")
name = ent.get("1")
if not (isinstance(cords, list) and len(cords) == 2 and name):
continue
key = (name, cords[0], cords[1])
if key in seen:
continue
seen.add(key)
pin = ent.get("pinType")
lname = name.lower()
if pin == "dungeonskull":
cls = 3
elif pin is None and "rare" in lname:
cls = 5
else:
cls = 2
enemies.append({
"id": None, "npc_id": None,
"name": name,
"pos": [round(cords[0] / 100 * W, 1), round(cords[1] / 100 * H, 1)],
"classification": cls,
"skippable": False, "required": False,
"kill_priority": None, "pack_id": None, "patrol_id": None,
})
map_obj = {
"image": repl["image"],
"width": W, "height": H,