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
+47 -19
View File
@@ -4,27 +4,55 @@
"_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_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": { "scholomance": {
"image": "maps/scholomance.webp",
"width": 2048,
"height": 2048,
"label": "Scholomance", "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.", "note": "Multi-floor upreza maps (4096x3072) for the Cata-tier'd visual layout; classic boss assignments hand-pinned to specific rooms within each floor. Same look-and-feel as the rest of the dungeons in the picker.",
"_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.", "floors": [
{
"kg_floor_id": 223,
"image": "maps/scholomance_floor1.webp",
"width": 4096, "height": 3072,
"label": "The Reliquary",
"bosses": [ "bosses": [
{"name": "Blood Steward of Kirtonos", "pos": [1046, 637], "cls": 3, "room": 1}, {"name": "Blood Steward of Kirtonos", "pos": [2400, 1600], "cls": 3}
{"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}, "kg_floor_id": 224,
{"name": "Lorekeeper Polkelt", "pos": [928, 1174], "cls": 3, "room": 10}, "image": "maps/scholomance_floor2.webp",
{"name": "Doctor Theolen Krastinov", "pos": [1328, 1456], "cls": 3, "room": 9}, "width": 4096, "height": 3072,
{"name": "Ras Frostwhisper", "pos": [937, 1729], "cls": 3, "room": 8}, "label": "Chamber of Summoning",
{"name": "Lord Alexei Barov", "pos": [1483, 1702], "cls": 3, "room": 11}, "bosses": [
{"name": "Lady Illucia Barov", "pos": [1856, 1456], "cls": 3, "room": 12}, {"name": "Kirtonos the Herald (Summon)", "pos": [1850, 600], "cls": 3},
{"name": "The Ravenian", "pos": [1502, 1092], "cls": 3, "room": 13}, {"name": "Vectus", "pos": [2400, 400], "cls": 3},
{"name": "Jandice Barov", "pos": [1665, 355], "cls": 3, "room": 3}, {"name": "Marduk Blackpool", "pos": [1300, 1100], "cls": 3}
{"name": "Instructor Malicia", "pos": [391, 1401], "cls": 3, "room": 7}, ]
{"name": "Darkmaster Gandling", "pos": [1529, 1456], "cls": 4, "room": 14} },
{
"kg_floor_id": 225,
"image": "maps/scholomance_floor3.webp",
"width": 4096, "height": 3072,
"label": "The Upper Study",
"bosses": [
{"name": "Jandice Barov", "pos": [1850, 700], "cls": 3},
{"name": "Rattlegore", "pos": [700, 800], "cls": 3},
{"name": "Lorekeeper Polkelt", "pos": [3200, 800], "cls": 3},
{"name": "Doctor Theolen Krastinov", "pos": [1850, 1700], "cls": 3},
{"name": "Instructor Malicia", "pos": [1850, 2250], "cls": 3}
]
},
{
"kg_floor_id": 226,
"image": "maps/scholomance_floor4.webp",
"width": 4096, "height": 3072,
"label": "Headmaster's Study",
"bosses": [
{"name": "Lady Illucia Barov", "pos": [800, 850], "cls": 3},
{"name": "Lord Alexei Barov", "pos": [2950, 850], "cls": 3},
{"name": "The Ravenian", "pos": [1850, 1600], "cls": 3},
{"name": "Ras Frostwhisper", "pos": [1850, 2100], "cls": 3},
{"name": "Darkmaster Gandling","pos": [1850, 850], "cls": 4}
]
}
] ]
} }
}, },
+46 -6
View File
@@ -244,12 +244,52 @@ def main() -> int:
def replacement_entry(tile_key, repl, registry_entry): def replacement_entry(tile_key, repl, registry_entry):
"""Build a complete dungeon record from a manual-override map. """Build a complete dungeon record from a manual-override map.
Two boss-source modes: Three shapes are supported:
1. `bosses` list: explicit hand-pinned positions in the new 1. `floors`: list of per-floor maps each with their own bosses.
image's pixel space. Authoritative. For multi-floor dungeons we want to ship at parity with the
2. `atlasloot_id`: pull from AtlasLoot subkeys with cords. Coords rest of the picker (4 webps with floor-tabs).
are 0-100 percent, scaled to the new image. Approximate (AL 2. `bosses` list at top level: single-floor + explicit pins.
coords are subzone-relative, not whole-map).""" 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"] W, H = repl["width"], repl["height"]
enemies = [] enemies = []
+141 -105
View File
@@ -123454,19 +123454,19 @@
"mapping_id": 219, "mapping_id": 219,
"maps": [ "maps": [
{ {
"image": "maps/scholomance.webp", "image": "maps/scholomance_floor1.webp",
"width": 2048, "width": 4096,
"height": 2048, "height": 3072,
"label": "Scholomance", "label": "The Reliquary",
"kg_floor_id": null, "kg_floor_id": 223,
"enemies": [ "enemies": [
{ {
"id": null, "id": null,
"npc_id": null, "npc_id": null,
"name": "Blood Steward of Kirtonos", "name": "Blood Steward of Kirtonos",
"pos": [ "pos": [
1046, 2400,
637 1600
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123475,14 +123475,26 @@
"pack_id": null, "pack_id": null,
"patrol_id": null, "patrol_id": null,
"ascension_pinned": true "ascension_pinned": true
}
],
"packs": [],
"patrols": [],
"icons": []
}, },
{
"image": "maps/scholomance_floor2.webp",
"width": 4096,
"height": 3072,
"label": "Chamber of Summoning",
"kg_floor_id": 224,
"enemies": [
{ {
"id": null, "id": null,
"npc_id": null, "npc_id": null,
"name": "Kirtonos the Herald", "name": "Kirtonos the Herald (Summon)",
"pos": [ "pos": [
555, 1850,
264 600
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123497,8 +123509,8 @@
"npc_id": null, "npc_id": null,
"name": "Vectus", "name": "Vectus",
"pos": [ "pos": [
327, 2400,
746 400
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123513,8 +123525,36 @@
"npc_id": null, "npc_id": null,
"name": "Marduk Blackpool", "name": "Marduk Blackpool",
"pos": [ "pos": [
391, 1300,
928 1100
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
}
],
"packs": [],
"patrols": [],
"icons": []
},
{
"image": "maps/scholomance_floor3.webp",
"width": 4096,
"height": 3072,
"label": "The Upper Study",
"kg_floor_id": 225,
"enemies": [
{
"id": null,
"npc_id": null,
"name": "Jandice Barov",
"pos": [
1850,
700
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123529,8 +123569,8 @@
"npc_id": null, "npc_id": null,
"name": "Rattlegore", "name": "Rattlegore",
"pos": [ "pos": [
564, 700,
974 800
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123545,8 +123585,8 @@
"npc_id": null, "npc_id": null,
"name": "Lorekeeper Polkelt", "name": "Lorekeeper Polkelt",
"pos": [ "pos": [
928, 3200,
1174 800
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123561,88 +123601,8 @@
"npc_id": null, "npc_id": null,
"name": "Doctor Theolen Krastinov", "name": "Doctor Theolen Krastinov",
"pos": [ "pos": [
1328, 1850,
1456 1700
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "Ras Frostwhisper",
"pos": [
937,
1729
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "Lord Alexei Barov",
"pos": [
1483,
1702
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "Lady Illucia Barov",
"pos": [
1856,
1456
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "The Ravenian",
"pos": [
1502,
1092
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "Jandice Barov",
"pos": [
1665,
355
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123657,8 +123617,84 @@
"npc_id": null, "npc_id": null,
"name": "Instructor Malicia", "name": "Instructor Malicia",
"pos": [ "pos": [
391, 1850,
1401 2250
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
}
],
"packs": [],
"patrols": [],
"icons": []
},
{
"image": "maps/scholomance_floor4.webp",
"width": 4096,
"height": 3072,
"label": "Headmaster's Study",
"kg_floor_id": 226,
"enemies": [
{
"id": null,
"npc_id": null,
"name": "Lady Illucia Barov",
"pos": [
800,
850
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "Lord Alexei Barov",
"pos": [
2950,
850
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "The Ravenian",
"pos": [
1850,
1600
],
"classification": 3,
"skippable": false,
"required": false,
"kill_priority": null,
"pack_id": null,
"patrol_id": null,
"ascension_pinned": true
},
{
"id": null,
"npc_id": null,
"name": "Ras Frostwhisper",
"pos": [
1850,
2100
], ],
"classification": 3, "classification": 3,
"skippable": false, "skippable": false,
@@ -123673,8 +123709,8 @@
"npc_id": null, "npc_id": null,
"name": "Darkmaster Gandling", "name": "Darkmaster Gandling",
"pos": [ "pos": [
1529, 1850,
1456 850
], ],
"classification": 4, "classification": 4,
"skippable": false, "skippable": false,
@@ -123691,7 +123727,7 @@
} }
], ],
"ascension_replaced": true, "ascension_replaced": true,
"replacement_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." "replacement_note": "Multi-floor upreza maps (4096x3072) for the Cata-tier'd visual layout; classic boss assignments hand-pinned to specific rooms within each floor. Same look-and-feel as the rest of the dungeons in the picker."
}, },
{ {
"id": "shadowfang_keep", "id": "shadowfang_keep",