From 247633546a1a391d8509d8479d359880d32143cf Mon Sep 17 00:00:00 2001 From: Florian Date: Sun, 26 Apr 2026 00:57:54 +0200 Subject: [PATCH] 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. --- data/ascension_overrides.json | 68 +++++++--- tools/kg_build_data.py | 52 ++++++- web/assets/dungeons.json | 248 +++++++++++++++++++--------------- 3 files changed, 236 insertions(+), 132 deletions(-) diff --git a/data/ascension_overrides.json b/data/ascension_overrides.json index 5ce74cd..11b90ee 100644 --- a/data/ascension_overrides.json +++ b/data/ascension_overrides.json @@ -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": { "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} + "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.", + "floors": [ + { + "kg_floor_id": 223, + "image": "maps/scholomance_floor1.webp", + "width": 4096, "height": 3072, + "label": "The Reliquary", + "bosses": [ + {"name": "Blood Steward of Kirtonos", "pos": [2400, 1600], "cls": 3} + ] + }, + { + "kg_floor_id": 224, + "image": "maps/scholomance_floor2.webp", + "width": 4096, "height": 3072, + "label": "Chamber of Summoning", + "bosses": [ + {"name": "Kirtonos the Herald (Summon)", "pos": [1850, 600], "cls": 3}, + {"name": "Vectus", "pos": [2400, 400], "cls": 3}, + {"name": "Marduk Blackpool", "pos": [1300, 1100], "cls": 3} + ] + }, + { + "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} + ] + } ] } }, diff --git a/tools/kg_build_data.py b/tools/kg_build_data.py index 55b4c28..21a6ab5 100644 --- a/tools/kg_build_data.py +++ b/tools/kg_build_data.py @@ -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 = [] diff --git a/web/assets/dungeons.json b/web/assets/dungeons.json index 517d892..c96326f 100644 --- a/web/assets/dungeons.json +++ b/web/assets/dungeons.json @@ -123454,19 +123454,19 @@ "mapping_id": 219, "maps": [ { - "image": "maps/scholomance.webp", - "width": 2048, - "height": 2048, - "label": "Scholomance", - "kg_floor_id": null, + "image": "maps/scholomance_floor1.webp", + "width": 4096, + "height": 3072, + "label": "The Reliquary", + "kg_floor_id": 223, "enemies": [ { "id": null, "npc_id": null, "name": "Blood Steward of Kirtonos", "pos": [ - 1046, - 637 + 2400, + 1600 ], "classification": 3, "skippable": false, @@ -123475,14 +123475,26 @@ "pack_id": null, "patrol_id": null, "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, "npc_id": null, - "name": "Kirtonos the Herald", + "name": "Kirtonos the Herald (Summon)", "pos": [ - 555, - 264 + 1850, + 600 ], "classification": 3, "skippable": false, @@ -123497,8 +123509,8 @@ "npc_id": null, "name": "Vectus", "pos": [ - 327, - 746 + 2400, + 400 ], "classification": 3, "skippable": false, @@ -123513,8 +123525,36 @@ "npc_id": null, "name": "Marduk Blackpool", "pos": [ - 391, - 928 + 1300, + 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, "skippable": false, @@ -123529,8 +123569,8 @@ "npc_id": null, "name": "Rattlegore", "pos": [ - 564, - 974 + 700, + 800 ], "classification": 3, "skippable": false, @@ -123545,8 +123585,8 @@ "npc_id": null, "name": "Lorekeeper Polkelt", "pos": [ - 928, - 1174 + 3200, + 800 ], "classification": 3, "skippable": false, @@ -123561,88 +123601,8 @@ "npc_id": null, "name": "Doctor Theolen Krastinov", "pos": [ - 1328, - 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": "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 + 1850, + 1700 ], "classification": 3, "skippable": false, @@ -123657,8 +123617,84 @@ "npc_id": null, "name": "Instructor Malicia", "pos": [ - 391, - 1401 + 1850, + 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, "skippable": false, @@ -123673,8 +123709,8 @@ "npc_id": null, "name": "Darkmaster Gandling", "pos": [ - 1529, - 1456 + 1850, + 850 ], "classification": 4, "skippable": false, @@ -123691,7 +123727,7 @@ } ], "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",