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:
@@ -2,7 +2,32 @@
|
||||
"_comment": "Ascension-specific corrections to the upstream kg / AtlasLoot data. Each entry overrides where an enemy/extra is rendered. Match by tile_key + name (case-insensitive substring). pos is in kg pixel space (z=4 stitched image, 6144x4096). kg_floor_id picks the floor (omit if the dungeon is single-floor).",
|
||||
|
||||
"_dungeon_replacements_comment": "When the kg map is the wrong layout for Ascension (e.g. retail/Cata layout vs classic), replace the entire dungeon's map with one we author manually. Coords are in the new map's pixel space (0..width, 0..height). Bosses come from AtlasLoot's per-dungeon entries with cords.",
|
||||
"dungeon_replacements": {},
|
||||
"dungeon_replacements": {
|
||||
"scholomance": {
|
||||
"image": "maps/scholomance.webp",
|
||||
"width": 2048,
|
||||
"height": 2048,
|
||||
"label": "Scholomance",
|
||||
"note": "kg + upreza both ship the post-Cata 4-floor redesign; Ascension uses the original classic single-room layout. Map is the Atlas-addon Scholomance.blp (512x512) upscaled to 2048x2048 with Real-ESRGAN x4plus. Boss positions are hand-pinned to the numbered rooms drawn on the Atlas map.",
|
||||
"_room_position_comment": "Room centers read off the upscaled Atlas map (2048x2048). Numbers refer to the Atlas-addon room numbers visible on the map texture. If a boss is rendered in the wrong room, edit the pos here.",
|
||||
"bosses": [
|
||||
{"name": "Blood Steward of Kirtonos", "pos": [1046, 637], "cls": 3, "room": 1},
|
||||
{"name": "Kirtonos the Herald", "pos": [555, 264], "cls": 3, "room": 2},
|
||||
{"name": "Vectus", "pos": [327, 746], "cls": 3, "room": 4},
|
||||
{"name": "Marduk Blackpool", "pos": [391, 928], "cls": 3, "room": 5},
|
||||
{"name": "Rattlegore", "pos": [564, 974], "cls": 3, "room": 6},
|
||||
{"name": "Lorekeeper Polkelt", "pos": [928, 1174], "cls": 3, "room": 10},
|
||||
{"name": "Doctor Theolen Krastinov", "pos": [1328, 1456], "cls": 3, "room": 9},
|
||||
{"name": "Ras Frostwhisper", "pos": [937, 1729], "cls": 3, "room": 8},
|
||||
{"name": "Lord Alexei Barov", "pos": [1483, 1702], "cls": 3, "room": 11},
|
||||
{"name": "Lady Illucia Barov", "pos": [1856, 1456], "cls": 3, "room": 12},
|
||||
{"name": "The Ravenian", "pos": [1502, 1092], "cls": 3, "room": 13},
|
||||
{"name": "Jandice Barov", "pos": [1665, 355], "cls": 3, "room": 3},
|
||||
{"name": "Instructor Malicia", "pos": [391, 1401], "cls": 3, "room": 7},
|
||||
{"name": "Darkmaster Gandling", "pos": [1529, 1456], "cls": 4, "room": 14}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
"_map_image_swaps_comment": "Swap the rendered image for one or more floors WITHOUT changing the kg enemy/pack/patrol data. Coords stay in kg's pixel space; the swapped image is force-stretched to those dims by the browser. Use this when a different render of the SAME WoW texture is sharper but has a different aspect ratio.",
|
||||
"map_image_swaps": {},
|
||||
|
||||
+24
-8
@@ -243,13 +243,30 @@ 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."""
|
||||
"""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 = []
|
||||
|
||||
if "bosses" in repl:
|
||||
for b in repl["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,
|
||||
})
|
||||
elif "atlasloot_id" in repl:
|
||||
al_id = repl["atlasloot_id"]
|
||||
al = (atlasloot_data or {}).get("OriginalWoW", {}).get(al_id, {})
|
||||
W, H = repl["width"], repl["height"]
|
||||
|
||||
enemies = []
|
||||
seen = set()
|
||||
for k, v in al.items():
|
||||
if not k.isdigit() or not isinstance(v, list):
|
||||
@@ -274,10 +291,9 @@ def main() -> int:
|
||||
elif pin is None and "rare" in lname:
|
||||
cls = 5
|
||||
else:
|
||||
cls = 2 # quest item, summon spot, lever, etc.
|
||||
cls = 2
|
||||
enemies.append({
|
||||
"id": None,
|
||||
"npc_id": None,
|
||||
"id": None, "npc_id": None,
|
||||
"name": name,
|
||||
"pos": [round(cords[0] / 100 * W, 1), round(cords[1] / 100 * H, 1)],
|
||||
"classification": cls,
|
||||
|
||||
+128
-8347
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user