diff --git a/.gitignore b/.gitignore index cc2976f..1d65a69 100644 --- a/.gitignore +++ b/.gitignore @@ -13,11 +13,9 @@ Thumbs.db .idea/ *.swp -# Large data assets — not tracked in git (no LFS yet) +# Large data assets # legacy hires PNG dump (gone, but keep ignored) data/maps_png_hires/ -# 336 MB of WebP map tiles — exclude until LFS is set up -web/assets/maps/ # Build output output/ diff --git a/README.md b/README.md index bb11afc..34de992 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ courtesy of RaiderIO (verbal permission, see attribution below). comments, gateways), NPC names from companion `en_US.js`. - **Frontend:** vanilla HTML/CSS/JS, single page, no build step. Pan/zoom via CSS transform on the canvas stage; SVG overlay in image-pixel space. -- **Hosting:** static. ~470 MB of WebPs total. Drop behind nginx; no backend. +- **Hosting:** static. ~120 MB of WebPs total, committed to the repo. Drop + behind nginx; no backend. ## Layout @@ -40,7 +41,7 @@ mplus-routes/ ├── app.js └── assets/ ├── dungeons.json - └── maps/ per-dungeon WebPs (gitignored — too big without LFS) + └── maps/ per-dungeon WebPs (~120 MB, committed) ``` ## Build @@ -50,7 +51,7 @@ python3 -m venv .venv .venv/bin/pip install Pillow .venv/bin/python tools/kg_fetch.py --workers 32 --zoom 4 # fetch tiles + data (~1.3 GB raw) -.venv/bin/python tools/kg_stitch.py --workers 4 # → web/assets/maps/*.webp (~470 MB) +.venv/bin/python tools/kg_stitch.py --workers 4 # → web/assets/maps/*.webp (~120 MB) .venv/bin/python tools/kg_build_data.py # → web/assets/dungeons.json ``` @@ -71,8 +72,8 @@ TLS automatically. First-time bring-up: 1. Add `mplus.exil.es` A/AAAA records in NetBox (→ public HAProxy VIPs) 2. Push the Ansible commit, trigger `Ansible_DeployPublicHaproxy` -3. Materialize `web/assets/maps/` on the deploy host (run the build pipeline above) -4. Run `playbooks/setup_mplus_routes.yml` +3. Run `playbooks/setup_mplus_routes.yml` — `web/assets/maps/` ships in the + repo, no pre-build step needed. ## Coverage diff --git a/data/ascension_overrides.json b/data/ascension_overrides.json new file mode 100644 index 0000000..5ce74cd --- /dev/null +++ b/data/ascension_overrides.json @@ -0,0 +1,51 @@ +{ + "_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": { + "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": {}, + + "overrides": [ + { + "tile_key": "stratholme", + "name": "Magistrate Barthilas", + "kg_floor_id": 235, + "pos": [3498, 3300], + "note": "Ascension moved Barthilas to the southern courtyard of the Undead Side" + }, + { + "tile_key": "blackfathom_deeps", + "name": "Lorgus Jett", + "kg_floor_id": 192, + "pos": [2893, 2827], + "note": "kg places Lorgus on floor 1 (entrance pool) but he's actually in Moonshrine Sanctum on floor 2 — confirmed by AtlasLoot subzone tag" + } + ] +} diff --git a/data/atlasloot_extras.json b/data/atlasloot_extras.json index 3a8879e..4cc6d63 100644 --- a/data/atlasloot_extras.json +++ b/data/atlasloot_extras.json @@ -1,164 +1,249 @@ { "_comment": "Supplemental rare bosses + interactives lifted from AtlasLootAscension and transformed into keystone.guru pixel space. Generated by tools/atlasloot_extras.py.", "transforms": { - "RagefireChasm\u2192ragefire_chasm": [ + "RagefireChasm\u2192ragefire_chasm@floor216": [ 73.72443668498734, -643.6866761504352, 42.96310607515248, -122.87047634576129 ], - "TheDeadmines\u2192deadmines": [ - 38.86529733570145, - 795.3768071048042, - 42.675714797527434, - -4.190671073545933 + "TheDeadmines\u2192deadmines@floor196": [ + 66.26591999999972, + -234.06111999998757, + 44.597466666666755, + -303.3821333333399 ], - "WailingCaverns\u2192wailing_caverns": [ + "TheDeadmines\u2192deadmines@floor197": [ + 76.22242622951025, + -1563.346570491929, + 61.14531050583661, + -717.1209612451378 + ], + "WailingCaverns\u2192wailing_caverns@floor240": [ 81.43623828914878, -747.3569080929979, 34.84088492074497, 115.17092826840326 ], - "ShadowfangKeep\u2192shadowfang_keep": [ - 61.65109512912707, - 44.20626976136464, - 40.982516838487975, - -50.47485979381463 + "ShadowfangKeep\u2192shadowfang_keep@floor227": [ + 61.02459999999999, + 65.04460000000063, + 46.426533333333886, + -409.4137333333706 ], - "TheStockade\u2192the_stockade": [ + "ShadowfangKeep\u2192shadowfang_keep@floor228": [ + 62.30417777777773, + -50.73653333333141, + 43.851689795918375, + -132.65531428571467 + ], + "ShadowfangKeep\u2192shadowfang_keep@floor232": [ + 29.689000000000306, + 1920.5397999999814, + 34.11870476190476, + 138.36030476190467 + ], + "TheStockade\u2192the_stockade@floor236": [ 59.842452519084006, 61.74031633587583, 39.897596145904984, 21.673417205782425 ], - "Gnomeregan\u2192gnomeregan": [ - 111.07253811659204, - -1434.4782521973132, - 38.1758651250788, - 220.98302089552416 + "Gnomeregan\u2192gnomeregan@floor205": [ + 128.41971199999992, + -1675.7119999999968, + 54.99048421052646, + -1017.2874105263245 ], - "RazorfenKraul\u2192razorfen_kraul": [ + "Gnomeregan\u2192gnomeregan@floor207": [ + -7.172800000000279, + 2156.0112000000086, + 81.23751111111113, + -1217.8997333333346 + ], + "RazorfenKraul\u2192razorfen_kraul@floor218": [ 60.513804000979846, 88.27979514983198, 43.452935250680056, -74.45083218033032 ], - "RazorfenDowns\u2192razorfen_downs": [ + "RazorfenDowns\u2192razorfen_downs@floor217": [ 63.04291758924619, -290.16402952444923, 41.07698629536258, 102.3108550816687 ], - "ScarletMonastery\u2192scarlet_monastery_cathedral": [ + "ScarletMonastery\u2192scarlet_monastery_cathedral@floor220": [ 50.76749473684181, 557.1932350877345, 32.20170256410254, 167.73567179487236 ], - "ScarletMonastery\u2192scarlet_monastery_graveyard": [ + "ScarletMonastery\u2192scarlet_monastery_graveyard@floor221": [ 60.84316666666665, 37.29200000000128, 23.45159999999305, 995.9040000004034 ], - "ScarletMonastery\u2192scarlet_monastery_library": [ + "ScarletMonastery\u2192scarlet_monastery_library@floor222": [ 59.125464150943436, 212.3352754716957, 74.09100000000035, -2662.1046000000283 ], - "Uldaman\u2192uldaman": [ - 63.19322527727629, - -86.87969584730672, - 41.52615397709141, - -41.35400744707431 + "Uldaman\u2192uldaman@floor238": [ + 62.88415904279804, + -78.21449940175133, + 41.43594680607743, + -28.07042326417234 ], - "ZulFarrak\u2192zul_farrak": [ + "ZulFarrak\u2192zul_farrak@floor241": [ 71.87339593345645, -512.6565965671986, 39.668194090909076, -1.3930740909086776 ], - "Maraudon\u2192maraudon": [ - 61.77912121471568, - 25.543185142141738, - 42.19282336665975, - -65.8431254967295 + "Maraudon\u2192maraudon@floor214": [ + 66.7837434402333, + -211.68715102041006, + 41.3733804475854, + -96.69095123674924 ], - "BlackrockDepths\u2192blackrock_depths": [ - 63.390884474140194, - -129.9214250730094, - 43.72115533672626, - -43.96230823056116 + "Maraudon\u2192maraudon@floor215": [ + 56.73022056074778, + 249.97455476635076, + 41.50276494730274, + 12.258980149063428 ], - "BlackrockSpire\u2192lower_blackrock_spire": [ - 70.31609043478278, - -550.6383026087042, - 47.429734477825605, - -521.5857562231853 + "BlackrockDepths\u2192blackrock_depths@floor194": [ + 63.63756840148695, + -162.67121375464484, + 40.4048188308329, + 8.987177030522435 ], - "BlackrockSpire\u2192upper_blackrock_spire": [ - 61.504197773872264, - -76.49282249560493, - 34.005210582010584, - 222.27234962962956 + "BlackrockDepths\u2192blackrock_depths@floor195": [ + 62.94900546673541, + -86.73139102630073, + 46.48759478082394, + -77.53748107315732 ], - "Stratholme\u2192stratholme": [ - 47.28673540151238, - 713.5643322963654, - 42.71814474125836, - -161.87918672865834 + "BlackrockSpire\u2192upper_blackrock_spire@floor251": [ + 61.70100000000002, + -56.735800000000836, + 37.522399999999834, + 88.06320000000551 ], - "Scholomance\u2192scholomance": [ - 68.16995676302486, - -376.1030967834516, - 46.6690874521118, - -292.56897919878884 + "BlackrockSpire\u2192upper_blackrock_spire@floor252": [ + 63.47862546689313, + -192.3194648556922, + 32.72667881548972, + 280.8202697038737 ], - "DireMaul\u2192dire_maul_north": [ + "Stratholme\u2192stratholme@floor234": [ + 41.10740482022913, + 953.3460469379711, + 45.46983390016457, + -394.0354483817887 + ], + "Stratholme\u2192stratholme@floor235": [ + 62.999233525796434, + -128.2447165580294, + 42.25970441767067, + -69.48502811244937 + ], + "Scholomance\u2192scholomance@floor225": [ + 67.03862919012546, + -301.39203984408016, + 44.58635943070333, + -260.60278192621263 + ], + "Scholomance\u2192scholomance@floor226": [ + 68.56349344262266, + -379.79195901637434, + 52.39632279411766, + -445.17640367647107 + ], + "DireMaul\u2192dire_maul_north@floor198": [ 63.69477659517125, -52.97349769615799, 40.323820514843405, -15.287907437179715 ], - "DireMaul\u2192dire_maul_east": [ - 23.186187151976394, - 2032.82655823259, - 72.13990548255808, - -968.0175378916643 + "DireMaul\u2192dire_maul_east@floor203": [ + 6.555779141104249, + 3087.766655214726, + 86.08977339901453, + -1322.4088512315175 ], - "DireMaul\u2192dire_maul_west": [ - 50.567135013423375, - 526.7297255113892, - 37.66845336733329, - 254.15845163333543 + "DireMaul\u2192dire_maul_west@floor199": [ + 11.51677611940289, + 1694.8836776119429, + 48.91311020408154, + -444.9409959183613 ], - "MoltenCore\u2192moltencore": [ + "DireMaul\u2192dire_maul_west@floor201": [ + 63.43969465648849, + -82.18605190839389, + 32.69369302325585, + 460.44843534883603 + ], + "MoltenCore\u2192moltencore@floor309": [ 63.802558332453295, -161.93769244746218, 46.40771496165673, -344.9887211648951 ], - "BlackwingLair\u2192blackwinglair": [ - 56.096746961325906, - 325.5217337016602, - 24.000187425480892, - 738.8363241595489 + "BlackwingLair\u2192blackwinglair@floor310": [ + -87.09831111111109, + 5766.327466666666, + -30.799717647058795, + 3012.748894117646 ], - "Naxxramas60\u2192naxxramas_classic": [ - 54.729314117996196, - 329.7412320416867, - 13.38947624976002, - 1066.3540111552927 + "BlackwingLair\u2192blackwinglair@floor312": [ + 44.53386938775538, + 829.3184653061107, + 49.16421052631577, + -498.62152982456064 + ], + "BlackwingLair\u2192blackwinglair@floor313": [ + 71.16791057401812, + -516.2994392749242, + 43.71123200000003, + -257.80390400000215 + ], + "Naxxramas60\u2192naxxramas_classic@floor138": [ + 63.58405165354333, + -131.6644535433079, + 41.1352763693271, + 1.9000788732382716 + ], + "Naxxramas60\u2192naxxramas_classic@floor139": [ + 66.4364096514745, + -225.34979660410923, + 35.50802017654478, + 110.69960756620367 + ], + "Naxxramas60\u2192naxxramas_classic@floor141": [ + 63.421989155693126, + -63.41635135553042, + 42.14327589424573, + -69.00678071539703 + ], + "Naxxramas60\u2192naxxramas_classic@floor143": [ + -61.489040000000095, + 5753.316880000005, + -40.52355555555556, + 3695.091377777778 ] }, "extras": { "deadmines": [ { "name": "Defias Gunpowder", - "x": 1572.7, - "y": 2343.0, + "x": 1091.3, + "y": 2149.5, "rare": false, + "kg_floor_id": 196, "source": "atlasloot" } ], @@ -168,52 +253,49 @@ "x": 3080.1, "y": 1961.7, "rare": false, + "kg_floor_id": 240, "source": "atlasloot" } ], "shadowfang_keep": [ { "name": "Investigator Fezzen Brasstacks (Love is in the Air)", - "x": 3373.4, - "y": 2654.4, + "x": 3523.7, + "y": 2390.2, "rare": false, + "kg_floor_id": 232, "source": "atlasloot" }, { "name": "Deathstalker Vincent", - "x": 3558.3, - "y": 2408.5, + "x": 3612.8, + "y": 2185.5, "rare": false, + "kg_floor_id": 232, "source": "atlasloot" }, { "name": "Apothecary Trio (Love is in the Air)", - "x": 2448.6, - "y": 2039.6, + "x": 2445.0, + "y": 1958.3, "rare": false, + "kg_floor_id": 227, "source": "atlasloot" }, { "name": "Fel Steed", - "x": 2202.0, - "y": 2326.5, + "x": 2200.9, + "y": 2283.3, "rare": false, + "kg_floor_id": 227, "source": "atlasloot" }, { "name": "Deathsworn Captain (Rare)", - "x": 3681.6, - "y": 2121.6, + "x": 3672.2, + "y": 1946.7, "rare": true, - "source": "atlasloot" - } - ], - "gnomeregan": [ - { - "name": "Clean Room", - "x": 5674.2, - "y": 2664.2, - "rare": false, + "kg_floor_id": 232, "source": "atlasloot" } ], @@ -223,6 +305,7 @@ "x": 4021.7, "y": 2011.3, "rare": false, + "kg_floor_id": 218, "source": "atlasloot" }, { @@ -230,6 +313,7 @@ "x": 753.9, "y": 1272.6, "rare": true, + "kg_floor_id": 218, "source": "atlasloot" } ], @@ -239,6 +323,7 @@ "x": 4212.5, "y": 2099.8, "rare": false, + "kg_floor_id": 220, "source": "atlasloot" }, { @@ -246,6 +331,7 @@ "x": 2384.8, "y": 2196.4, "rare": false, + "kg_floor_id": 220, "source": "atlasloot" }, { @@ -253,6 +339,7 @@ "x": 1775.6, "y": 1971.0, "rare": false, + "kg_floor_id": 220, "source": "atlasloot" }, { @@ -260,6 +347,7 @@ "x": 2080.2, "y": 2904.9, "rare": false, + "kg_floor_id": 220, "source": "atlasloot" }, { @@ -267,6 +355,7 @@ "x": 4770.9, "y": 2647.3, "rare": false, + "kg_floor_id": 220, "source": "atlasloot" }, { @@ -274,6 +363,7 @@ "x": 4567.8, "y": 522.0, "rare": false, + "kg_floor_id": 220, "source": "atlasloot" } ], @@ -283,6 +373,7 @@ "x": 1862.6, "y": 2989.3, "rare": false, + "kg_floor_id": 221, "source": "atlasloot" }, { @@ -290,6 +381,7 @@ "x": 5087.3, "y": 2801.7, "rare": false, + "kg_floor_id": 221, "source": "atlasloot" }, { @@ -297,6 +389,7 @@ "x": 4843.9, "y": 1253.9, "rare": false, + "kg_floor_id": 221, "source": "atlasloot" }, { @@ -304,6 +397,7 @@ "x": 3444.5, "y": 1605.6, "rare": false, + "kg_floor_id": 221, "source": "atlasloot" }, { @@ -311,6 +405,7 @@ "x": 3018.6, "y": 1676.0, "rare": false, + "kg_floor_id": 221, "source": "atlasloot" }, { @@ -318,6 +413,7 @@ "x": 2957.8, "y": 1394.6, "rare": false, + "kg_floor_id": 221, "source": "atlasloot" } ], @@ -327,6 +423,7 @@ "x": 4469.4, "y": 1783.4, "rare": false, + "kg_floor_id": 222, "source": "atlasloot" }, { @@ -334,29 +431,33 @@ "x": 1631.3, "y": 1487.0, "rare": false, + "kg_floor_id": 222, "source": "atlasloot" } ], "uldaman": [ { "name": "Remains of a Paladin", - "x": 3262.4, - "y": 2616.3, + "x": 3254.6, + "y": 2623.8, "rare": false, + "kg_floor_id": 238, "source": "atlasloot" }, { "name": "The Discs of Norgannon (Lower)", - "x": 2440.8, - "y": 332.4, + "x": 2437.2, + "y": 344.9, "rare": false, + "kg_floor_id": 238, "source": "atlasloot" }, { "name": "The Discs of Norgannon (Lower)", - "x": 3072.8, - "y": 1370.5, + "x": 3066.0, + "y": 1380.8, "rare": false, + "kg_floor_id": 238, "source": "atlasloot" } ], @@ -366,459 +467,393 @@ "x": 1284.2, "y": 712.6, "rare": false, + "kg_floor_id": 241, "source": "atlasloot" } ], "maraudon": [ { "name": "Veng ", - "x": 3732.3, - "y": 946.8, + "x": 3795.3, + "y": 896.3, "rare": false, + "kg_floor_id": 214, "source": "atlasloot" }, { "name": "Maraudos ", - "x": 3299.8, - "y": 3056.4, + "x": 3256.7, + "y": 3083.5, "rare": false, + "kg_floor_id": 215, "source": "atlasloot" } ], "blackrock_depths": [ { "name": "Kharan Mighthammer", - "x": 3166.4, - "y": 3541.2, + "x": 3146.5, + "y": 3322.2, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "Commander Gor'shak ", - "x": 3293.2, - "y": 3759.8, + "x": 3273.8, + "y": 3524.2, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "Marshal Windsor", - "x": 3229.8, - "y": 4065.8, + "x": 3210.1, + "y": 3807.0, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "Ring of Law", - "x": 3103.0, - "y": 2623.0, + "x": 3082.8, + "y": 2473.7, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "The Vault", - "x": 3673.5, - "y": 2841.6, + "x": 3655.6, + "y": 2675.7, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "Ring of Law", - "x": 3103.0, - "y": 3847.2, + "x": 3082.8, + "y": 3605.0, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "Shadowforge Lock", - "x": 2532.5, - "y": 3934.7, + "x": 2510.1, + "y": 3685.8, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "The Grim Guzzler", - "x": 3039.6, - "y": 2710.5, + "x": 3019.2, + "y": 2554.5, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "Summoner's Tomb", - "x": 3293.2, - "y": 1049.1, + "x": 3273.8, + "y": 1019.1, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "The Lyceum", - "x": 4117.3, - "y": 480.7, + "x": 4101.0, + "y": 493.8, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "The Black Forge", - "x": 3863.7, - "y": 1049.1, + "x": 3846.5, + "y": 1019.1, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" }, { "name": "Molten Core", - "x": 4180.7, - "y": 1530.0, - "rare": false, - "source": "atlasloot" - } - ], - "lower_blackrock_spire": [ - { - "name": "Mother Smolderweb", - "x": 3949.6, - "y": 2798.5, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Burning Felguard (Rare, Summon)", - "x": 2473.0, - "y": 2039.6, - "rare": true, - "source": "atlasloot" - }, - { - "name": "Vaelan (Upper)", - "x": 3105.8, - "y": 1423.0, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Warosh (Wanders)", - "x": 3738.6, - "y": 1517.9, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Bijou", - "x": 3879.3, - "y": 2134.5, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Roughshod Pike", - "x": 4160.5, - "y": 2229.3, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Spirestone Butcher (Rare)", - "x": 3035.5, - "y": 2229.3, - "rare": true, - "source": "atlasloot" - }, - { - "name": "Human Remains (Lower)", - "x": 2473.0, - "y": 2134.5, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Urok's Tribute Pile", - "x": 2683.9, - "y": 2087.0, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Halycon", - "x": 2121.4, - "y": 3509.9, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Pyroguard Emberseer", - "x": 1629.2, - "y": 759.0, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Solakar Flamewreath", - "x": 2191.7, - "y": 1328.2, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Goraluk Anvilcrack ", - "x": 1769.8, - "y": 759.0, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Warchief Rend Blackhand", - "x": 2894.9, - "y": 759.0, - "rare": false, - "source": "atlasloot" - }, - { - "name": "The Beast", - "x": 3949.6, - "y": 996.2, - "rare": false, - "source": "atlasloot" - }, - { - "name": "General Drakkisath", - "x": 1980.7, - "y": 1849.9, + "x": 4164.7, + "y": 1463.6, "rare": false, + "kg_floor_id": 194, "source": "atlasloot" } ], "upper_blackrock_spire": [ { "name": "War Master Voone", - "x": 3121.7, - "y": 2058.6, + "x": 3108.6, + "y": 2048.1, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Mother Smolderweb", - "x": 3859.8, - "y": 2602.6, + "x": 3870.3, + "y": 2571.7, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Burning Felguard (Rare, Summon)", - "x": 2568.2, - "y": 2058.6, + "x": 2537.3, + "y": 2048.1, "rare": true, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Shadow Hunter Vosh'gajin", - "x": 3367.7, - "y": 2602.6, + "x": 3362.5, + "y": 2571.7, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Vaelan (Upper)", - "x": 3121.7, - "y": 1616.5, + "x": 3151.7, + "y": 1626.5, "rare": false, + "kg_floor_id": 251, "source": "atlasloot" }, { "name": "Warosh (Wanders)", - "x": 3675.3, - "y": 1684.5, + "x": 3679.9, + "y": 1688.1, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Highlord Omokk", - "x": 2322.2, - "y": 2262.6, + "x": 2283.3, + "y": 2244.4, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Urok's Tribute Pile", - "x": 2752.7, - "y": 2092.6, + "x": 2727.7, + "y": 2080.8, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Bannok Grimaxe (Rare)", - "x": 2752.7, - "y": 2432.6, + "x": 2727.7, + "y": 2408.1, "rare": true, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Quartermaster Zigris ", - "x": 3306.2, - "y": 3112.7, + "x": 3299.0, + "y": 3062.6, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Darkstone Tablet", - "x": 1891.6, - "y": 1650.5, + "x": 1917.7, + "y": 1664.0, "rare": false, + "kg_floor_id": 251, "source": "atlasloot" }, { "name": "Overlord Wyrmthalak", - "x": 3490.8, - "y": 2398.6, + "x": 3489.4, + "y": 2375.3, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Jed Runewatcher (Rare)", - "x": 2260.7, - "y": 1038.4, + "x": 2287.9, + "y": 988.6, "rare": true, + "kg_floor_id": 251, "source": "atlasloot" }, { "name": "Goraluk Anvilcrack ", - "x": 1953.1, - "y": 1140.4, + "x": 1979.4, + "y": 1101.2, "rare": false, + "kg_floor_id": 251, "source": "atlasloot" }, { "name": "Awbee", - "x": 2937.2, - "y": 1446.5, + "x": 2918.1, + "y": 1459.0, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" }, { "name": "Blackwing Lair", - "x": 3306.2, - "y": 970.4, + "x": 3299.0, + "y": 1000.8, "rare": false, + "kg_floor_id": 252, "source": "atlasloot" } ], "stratholme": [ { "name": "Crusaders' Square Postbox", - "x": 2415.9, - "y": 1333.3, + "x": 2433.2, + "y": 1197.4, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "Market Row Postbox", - "x": 3976.3, - "y": 1034.2, + "x": 4218.7, + "y": 1113.8, "rare": false, + "kg_floor_id": 235, "source": "atlasloot" }, { "name": "Festival Lane Postbox", - "x": 4496.5, - "y": 1076.9, + "x": 4241.9, + "y": 924.6, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "King's Square Postbox", - "x": 3739.9, - "y": 2102.2, + "x": 3903.7, + "y": 2170.3, "rare": false, + "kg_floor_id": 235, "source": "atlasloot" }, { "name": "Fras Siabi's Postbox", - "x": 3314.3, - "y": 2785.7, + "x": 3336.7, + "y": 2846.4, "rare": false, + "kg_floor_id": 235, "source": "atlasloot" }, { "name": "Atiesh (Summon)", - "x": 4780.2, - "y": 1461.4, + "x": 4488.6, + "y": 1333.8, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "Elder Farwhisper (Lunar Festival)", - "x": 4449.2, - "y": 564.3, + "x": 4200.8, + "y": 379.0, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "Malor the Zealous", - "x": 2132.2, - "y": 1632.3, + "x": 2186.6, + "y": 1515.7, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "Crimson Hammersmith (Summon)", - "x": 1328.3, - "y": 1888.6, + "x": 1487.7, + "y": 1788.5, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "Cannon Master Willey", - "x": 950.0, - "y": 2016.7, + "x": 1158.9, + "y": 1924.9, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "Archivist Galford", - "x": 2037.6, - "y": 2999.3, + "x": 2104.4, + "y": 2970.7, "rare": false, + "kg_floor_id": 234, "source": "atlasloot" }, { "name": "Elders' Square Postbox", - "x": 3881.8, - "y": 3084.7, + "x": 4092.7, + "y": 3142.3, "rare": false, + "kg_floor_id": 235, "source": "atlasloot" }, { "name": "Aurius", - "x": 3929.1, - "y": 2999.3, + "x": 4155.7, + "y": 3057.7, "rare": false, + "kg_floor_id": 235, "source": "atlasloot" }, { "name": "Stonespine (Rare)", - "x": 4023.6, - "y": 2016.7, + "x": 4281.7, + "y": 2085.8, "rare": true, + "kg_floor_id": 235, "source": "atlasloot" } ], "scholomance": [ { "name": "Blood Steward of Kirtonos", - "x": 5213.8, - "y": 1854.2, + "x": 5195.8, + "y": 1790.4, "rare": false, + "kg_floor_id": 225, "source": "atlasloot" }, { "name": "The Deed to Tarren Mill", - "x": 1737.2, - "y": 2367.6, + "x": 1776.8, + "y": 2280.8, "rare": false, + "kg_floor_id": 225, "source": "atlasloot" }, { "name": "Torch Lever", - "x": 2964.2, - "y": 2274.2, + "x": 2983.5, + "y": 2191.6, "rare": false, + "kg_floor_id": 225, "source": "atlasloot" } ], @@ -828,6 +863,7 @@ "x": 1220.9, "y": 3130.0, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -835,6 +871,7 @@ "x": 2074.4, "y": 2142.0, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -842,6 +879,7 @@ "x": 1985.3, "y": 1811.4, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -849,6 +887,7 @@ "x": 2189.1, "y": 2327.5, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -856,6 +895,7 @@ "x": 896.1, "y": 2230.7, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -863,6 +903,7 @@ "x": 3857.9, "y": 593.6, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -870,6 +911,7 @@ "x": 2558.5, "y": 1968.6, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -877,6 +919,7 @@ "x": 2781.4, "y": 1863.8, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" }, { @@ -884,217 +927,231 @@ "x": 3596.7, "y": 1150.1, "rare": false, + "kg_floor_id": 198, "source": "atlasloot" } ], "dire_maul_east": [ - { - "name": "Stomper Kreeg ", - "x": 3447.2, - "y": 3937.5, - "rare": false, - "source": "atlasloot" - }, { "name": "Guard Slip'kik", - "x": 2647.3, - "y": 3201.7, + "x": 3261.5, + "y": 3653.6, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Captain Kromcrush", - "x": 2770.1, - "y": 2740.0, + "x": 3296.2, + "y": 3102.6, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "King Gordok", - "x": 2774.8, - "y": 1030.3, + "x": 3297.6, + "y": 1062.3, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Pylons", - "x": 3655.9, - "y": 2711.1, + "x": 3546.7, + "y": 3068.2, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Pylons", - "x": 2960.3, - "y": 619.1, + "x": 3350.0, + "y": 571.6, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Tendris Warpwood", - "x": 2807.2, - "y": 2891.5, + "x": 3306.7, + "y": 3283.4, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Magister Kalendris", - "x": 2774.8, - "y": 2299.9, + "x": 3297.6, + "y": 2577.5, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Tsu'zee (Rare)", - "x": 3616.4, - "y": 756.1, + "x": 3535.5, + "y": 735.1, "rare": true, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Immol'thar", - "x": 2849.0, - "y": 3223.3, + "x": 3318.5, + "y": 3679.4, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Lord Hel'nurath (Summon)", - "x": 2378.3, - "y": 3050.2, + "x": 3185.4, + "y": 3472.8, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Prince Tortheldrin", - "x": 3456.5, - "y": 121.3, + "x": 3490.3, + "y": -22.5, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" }, { "name": "Pylons", - "x": 3053.0, - "y": 1556.9, - "rare": false, - "source": "atlasloot" - }, - { - "name": "Old Ironbark", - "x": 2960.3, - "y": 3937.5, + "x": 3376.2, + "y": 1690.7, "rare": false, + "kg_floor_id": 203, "source": "atlasloot" } ], "dire_maul_west": [ { "name": "Guard Mol'dar", - "x": 4061.4, - "y": 3117.0, + "x": 4352.2, + "y": 2945.2, "rare": false, + "kg_floor_id": 201, "source": "atlasloot" }, { "name": "Stomper Kreeg ", - "x": 3611.3, - "y": 2815.6, + "x": 3787.6, + "y": 2683.6, "rare": false, + "kg_floor_id": 201, "source": "atlasloot" }, { "name": "Guard Fengus", - "x": 2696.1, - "y": 3177.2, + "x": 2639.4, + "y": 2997.5, "rare": false, + "kg_floor_id": 201, "source": "atlasloot" }, { "name": "Guard Slip'kik", - "x": 1866.8, - "y": 2431.4, + "x": 2000.1, + "y": 2382.2, "rare": false, + "kg_floor_id": 199, "source": "atlasloot" }, { "name": "Captain Kromcrush", - "x": 2134.8, - "y": 2190.3, + "x": 2061.1, + "y": 2069.2, "rare": false, + "kg_floor_id": 199, "source": "atlasloot" }, { "name": "King Gordok", - "x": 2144.9, - "y": 1297.6, + "x": 2063.4, + "y": 910.0, "rare": false, + "kg_floor_id": 199, "source": "atlasloot" }, { "name": "Lord Hel'nurath (Summon)", - "x": 1280.2, - "y": 2352.3, + "x": 1866.5, + "y": 2279.5, "rare": false, + "kg_floor_id": 199, "source": "atlasloot" }, { "name": "Hydrospawn", - "x": 2600.0, - "y": 2107.4, + "x": 2167.1, + "y": 1961.6, "rare": false, + "kg_floor_id": 199, "source": "atlasloot" }, { "name": "Lethtendris", - "x": 2777.0, - "y": 2009.5, + "x": 2207.4, + "y": 1834.4, "rare": false, + "kg_floor_id": 199, "source": "atlasloot" }, { "name": "Alzzin the Wildshaper", - "x": 3424.2, - "y": 1342.8, + "x": 3552.9, + "y": 1405.3, "rare": false, + "kg_floor_id": 201, "source": "atlasloot" } ], "blackwinglair": [ { "name": "Draconic for Dummies (Chapter VII)", - "x": 2120.6, - "y": 1770.8, + "x": 2254.4, + "y": 1615.4, "rare": false, + "kg_floor_id": 312, "source": "atlasloot" }, { "name": "Master Elemental Shaper Krixix", - "x": 2569.4, - "y": 1722.8, + "x": 2610.7, + "y": 1517.1, "rare": false, + "kg_floor_id": 312, "source": "atlasloot" } ], "naxxramas_classic": [ { "name": "|cffcc6666Instructor Razuvious", - "x": 2683.1, - "y": 1682.3, + "x": 2602.4, + "y": 1894.1, "rare": false, + "kg_floor_id": 138, "source": "atlasloot" }, { "name": "|cffcc6666Gothik the Harvester", - "x": 3996.6, - "y": 1869.7, + "x": 4128.5, + "y": 2470.0, "rare": false, + "kg_floor_id": 138, "source": "atlasloot" }, { "name": "|cffcc6666Four Horsemen Chest", - "x": 1971.6, - "y": 2097.3, + "x": 1839.2, + "y": 3176.0, "rare": false, + "kg_floor_id": 141, "source": "atlasloot" } ] diff --git a/tools/atlasloot_extras.py b/tools/atlasloot_extras.py index 9ca20ba..859703f 100644 --- a/tools/atlasloot_extras.py +++ b/tools/atlasloot_extras.py @@ -98,28 +98,26 @@ def parse_js_var(p: Path) -> dict: def get_kg_bosses_per_floor(tile_key: str): - """Return list of (npc_id, name, x_px, y_px, classification) for - boss-like enemies in the dungeon's first floor only — enough to fit - a transform; later floors share the same coord scale anyway.""" + """Return list of dicts per boss-like enemy across ALL floors. + Caller groups by floor_id when fitting per-floor transforms.""" sf = parse_js_var(KG_DIR / tile_key / "split_floors.js") lang = parse_js_var(KG_DIR / tile_key / "lang.js") name_by_id = {n["id"]: n["name"] for n in lang.get("dungeonNpcs", [])} cls_by_id = {n["id"]: n.get("classification_id") for n in lang.get("dungeonNpcs", [])} - # First floor: pick the lowest floor_id present - enemies = sf["dungeon"].get("enemies", []) - if not enemies: - return [] out = [] - for e in enemies: + for e in sf["dungeon"].get("enemies", []): npc_id = e.get("npc_id") name = name_by_id.get(npc_id, "?") cls = cls_by_id.get(npc_id, 0) if cls < 3: - continue # only bosses - # kg coord transform: pixel_x = lng*16, pixel_y = -lat*16 (z=4) - pix_x = e["lng"] * 16 - pix_y = -e["lat"] * 16 - out.append((npc_id, name, pix_x, pix_y, cls, e.get("floor_id"))) + continue + out.append({ + "name": name, + "x": e["lng"] * 16, + "y": -e["lat"] * 16, + "cls": cls, + "floor_id": e.get("floor_id"), + }) return out @@ -192,40 +190,12 @@ def main() -> int: if not al_dungeon: continue al_entries = list(collect_al_entries(al_dungeon)) - # Match AL entries to kg bosses by normalized name - al_by_norm = {norm_name(e[0]): e for e in al_entries if not e[3]} # non-rare bosses for fitting - # For each kg wing, fit a transform from anchors that match + al_by_norm = {norm_name(e[0]): e for e in al_entries if not e[3]} + for kg_key in kg_keys: kg_b = kg_bosses.get(kg_key, []) if not kg_b: continue - kg_by_norm = {norm_name(b[1]): b for b in kg_b} - common_names = set(al_by_norm) & set(kg_by_norm) - if len(common_names) < 2: - summary.append(f"{al_id} → {kg_key}: only {len(common_names)} anchor(s); skipping") - continue - al_pts = [] - kg_pts = [] - for n in sorted(common_names): - al_e = al_by_norm[n] - kg_e = kg_by_norm[n] - al_pts.append((al_e[1], al_e[2])) - kg_pts.append((kg_e[2], kg_e[3])) - tr = fit_transform(al_pts, kg_pts) - if not tr: - summary.append(f"{al_id} → {kg_key}: degenerate fit") - continue - sx, ox, sy, oy = tr - transforms[(al_id, kg_key)] = tr - summary.append( - f"{al_id} → {kg_key}: {len(common_names)} anchors, " - f"scale=({sx:.2f},{sy:.2f}) offset=({ox:.0f},{oy:.0f})" - ) - - # Apply transform to AL entries that don't already exist as kg bosses - kg_existing_norms = {norm_name(b[1]) for b in kg_b} - # Build the set of "this dungeon's bosses pinned to a different - # wing" so we can exclude them here. other_wings = [k for k in kg_keys if k != kg_key] forced_elsewhere = set() for w in other_wings: @@ -233,24 +203,63 @@ def main() -> int: forced_elsewhere.add(needle.lower()) this_wing_pins = {n.lower() for n in WING_FORCE.get(kg_key, [])} + # Group kg bosses by floor_id and fit one transform per floor + # so a boss on floor B doesn't drag the floor-A fit off. + by_floor = defaultdict(list) + for b in kg_b: + by_floor[b["floor_id"]].append(b) + + floor_transforms = {} # floor_id → (sx, ox, sy, oy, anchor_pts) + for fid, fb in by_floor.items(): + kg_by_norm = {norm_name(b["name"]): b for b in fb} + common = set(al_by_norm) & set(kg_by_norm) + if len(common) < 2: + continue + al_pts, kg_pts = [], [] + for n in sorted(common): + al_pts.append((al_by_norm[n][1], al_by_norm[n][2])) + kg_pts.append((kg_by_norm[n]["x"], kg_by_norm[n]["y"])) + tr = fit_transform(al_pts, kg_pts) + if not tr: + continue + floor_transforms[fid] = (*tr, al_pts, kg_pts) + transforms[(al_id, kg_key, fid)] = tr + summary.append( + f"{al_id} → {kg_key} floor={fid}: {len(common)} anchors, " + f"scale=({tr[0]:.2f},{tr[2]:.2f}) offset=({tr[1]:.0f},{tr[3]:.0f})" + ) + + if not floor_transforms: + summary.append(f"{al_id} → {kg_key}: no per-floor transform fit") + continue + + kg_existing = set() + for fb in by_floor.values(): + for b in fb: + kg_existing.add(norm_name(b["name"])) + for e in al_entries: name = e[0] lname = name.lower() - if norm_name(name) in kg_existing_norms: - continue # already in kg - # If this boss is force-pinned to another wing, skip here. + if norm_name(name) in kg_existing: + continue if any(p in lname for p in forced_elsewhere) and \ not any(p in lname for p in this_wing_pins): continue + # Pick the floor whose anchors are nearest the AL coord — + # that's the floor this entry most likely belongs to. + best_fid = None + best_dist = float("inf") + for fid, (sx, ox, sy, oy, al_pts, kg_pts) in floor_transforms.items(): + d = min(((e[1] - a[0]) ** 2 + (e[2] - a[1]) ** 2) ** 0.5 for a in al_pts) + if d < best_dist: + best_dist = d + best_fid = fid + sx, ox, sy, oy, al_pts, kg_pts = floor_transforms[best_fid] px = e[1] * sx + ox py = e[2] * sy + oy - # Reject points outside the kg image bounds (multi-wing - # dungeons: a boss in a wing is OOB on a different wing's - # image). if not (-200 <= px <= 6344 and -200 <= py <= 4296): continue - # Also reject points that are >1.5x the diagonal away from - # all anchors — likely a wrong-wing match. anchor_dists = [ ((px - a[0]) ** 2 + (py - a[1]) ** 2) ** 0.5 for a in kg_pts ] @@ -261,12 +270,13 @@ def main() -> int: "x": round(px, 1), "y": round(py, 1), "rare": e[3], + "kg_floor_id": best_fid, "source": "atlasloot", }) OUT.write_text(json.dumps({ "_comment": "Supplemental rare bosses + interactives lifted from AtlasLootAscension and transformed into keystone.guru pixel space. Generated by tools/atlasloot_extras.py.", - "transforms": {f"{k[0]}→{k[1]}": v for k, v in transforms.items()}, + "transforms": {f"{k[0]}→{k[1]}@floor{k[2]}": v for k, v in transforms.items()}, "extras": dict(extras), }, indent=2)) diff --git a/tools/kg_build_data.py b/tools/kg_build_data.py index 6acd59c..21a6ab5 100644 --- a/tools/kg_build_data.py +++ b/tools/kg_build_data.py @@ -26,6 +26,7 @@ REGISTRY = DATA / "kg_dungeons.json" WEB_ASSETS = ROOT / "web" / "assets" WEB_MAPS = WEB_ASSETS / "maps" EXTRAS_PATH = DATA / "atlasloot_extras.json" +OVERRIDES_PATH = DATA / "ascension_overrides.json" OUT_PATH = WEB_ASSETS / "dungeons.json" # Map kg's mapIconType names → simple labels we render in the UI. @@ -223,6 +224,155 @@ def main() -> int: if EXTRAS_PATH.exists(): extras_db = json.loads(EXTRAS_PATH.read_text()).get("extras", {}) + overrides = [] + dungeon_replacements = {} + map_image_swaps = {} + if OVERRIDES_PATH.exists(): + ov_doc = json.loads(OVERRIDES_PATH.read_text()) + overrides = ov_doc.get("overrides", []) + dungeon_replacements = ov_doc.get("dungeon_replacements", {}) + map_image_swaps = ov_doc.get("map_image_swaps", {}) + + # Load AtlasLoot map data on demand for dungeon replacements. + atlasloot_data = None + al_path = Path("/tmp/atlasloot_maps.json") + if al_path.exists(): + try: + atlasloot_data = json.loads(al_path.read_text()) + except Exception: + atlasloot_data = None + + def replacement_entry(tile_key, repl, registry_entry): + """Build a complete dungeon record from a manual-override 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 = [] + + 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, {}) + 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, + "label": repl.get("label", tile_key), + "kg_floor_id": None, + "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": [map_obj], + "ascension_replaced": True, + "replacement_note": repl.get("note"), + } + + def apply_overrides(tile_key, name, pos, floor_id): + """Return (pos, floor_id) possibly replaced by an Ascension override.""" + for o in overrides: + if o["tile_key"] != tile_key: + continue + if o["name"].lower() not in name.lower(): + continue + new_floor = o.get("kg_floor_id", floor_id) + new_pos = o.get("pos", pos) + return new_pos, new_floor + return pos, floor_id + # Build a global icon-type index from the static.js if present, else # fall back to known IDs. icon_index: dict[int, str] = { @@ -251,6 +401,11 @@ def main() -> int: except Exception: npc_index = {} + # Dungeon replacement: skip kg entirely for this one. + if d["tile_key"] in dungeon_replacements: + dungeons.append(replacement_entry(d["tile_key"], dungeon_replacements[d["tile_key"]], d)) + continue + entry = build_one(d, summary, npc_index, icon_index) if entry: extras = extras_db.get(d["tile_key"], []) @@ -261,9 +416,60 @@ def main() -> int: "pos": [e["x"], e["y"]], "rare": bool(e.get("rare")), "source": e.get("source", "atlasloot"), + "kg_floor_id": e.get("kg_floor_id"), } for e in extras ] + + # Ascension overrides: change pos and/or relocate to a different + # floor. We collect relocations first, then apply them in a + # second pass so iteration semantics stay clean. + relocations = [] # list of (enemy_dict, source_map, target_map) + for m in entry["maps"]: + for e in list(m["enemies"]): + new_pos, new_floor = apply_overrides(d["tile_key"], e["name"], e["pos"], m.get("kg_floor_id")) + if new_pos is e["pos"] and new_floor == m.get("kg_floor_id"): + continue + e["pos"] = list(new_pos) + e["ascension_override"] = True + if new_floor is not None and new_floor != m.get("kg_floor_id"): + target = next((mm for mm in entry["maps"] if mm.get("kg_floor_id") == new_floor), None) + if target: + relocations.append((e, m, target)) + for e, src, tgt in relocations: + src["enemies"].remove(e) + tgt["enemies"].append(e) + + for ex in entry.get("extras", []): + new_pos, new_floor = apply_overrides(d["tile_key"], ex["name"], ex["pos"], ex.get("kg_floor_id")) + if new_pos is not ex["pos"] or new_floor != ex.get("kg_floor_id"): + ex["pos"] = list(new_pos) + ex["kg_floor_id"] = new_floor + ex["ascension_override"] = True + + # Map image swap: rescale every coord from kg's pixel space + # (image dimensions in floor_summary) into the new image space. + swap = map_image_swaps.get(d["tile_key"]) + if swap: + new_w, new_h = swap["width"], swap["height"] + for m in entry["maps"]: + sx = new_w / m["width"] + sy = new_h / m["height"] + m["width"], m["height"] = new_w, new_h + for e in m["enemies"]: + e["pos"] = [round(e["pos"][0] * sx, 1), round(e["pos"][1] * sy, 1)] + for p in m["packs"]: + p["vertices"] = [[round(v[0] * sx, 1), round(v[1] * sy, 1)] for v in p["vertices"]] + for pa in m["patrols"]: + pa["vertices"] = [[round(v[0] * sx, 1), round(v[1] * sy, 1)] for v in pa["vertices"]] + for ic in m["icons"]: + ic["pos"] = [round(ic["pos"][0] * sx, 1), round(ic["pos"][1] * sy, 1)] + # Extras already use the kg pixel space; rescale too. + # Use the first map's pre-swap factor — extras are dungeon-level. + for ex in entry.get("extras", []): + ex["pos"] = [round(ex["pos"][0] * (new_w / 6144), 1), + round(ex["pos"][1] * (new_h / 4096), 1)] + dungeons.append(entry) dungeons.sort(key=lambda d: d["name"]) diff --git a/web/app.js b/web/app.js index 497332d..39002f0 100644 --- a/web/app.js +++ b/web/app.js @@ -194,13 +194,17 @@ function renderOverlay() { } } - // AtlasLoot-derived extras: rare bosses + interactives kg doesn't ship. - // These are dungeon-level (not per-floor) and only render on floor 0 - // unless we get richer data; for single-floor dungeons that's all that - // matters, and for multi-floor we leave them on the first floor by - // default — the user can drag a Note over them on any floor. - if (state.floorIndex === 0 && state.current?.extras) { + // AtlasLoot-derived extras: render only ones that match the current + // floor. Single-floor dungeons have kg_floor_id null on every extra, + // so they all render on floor 0. + if (state.current?.extras) { + const curFloor = m.kg_floor_id; for (const ex of state.current.extras) { + // If the extra has no floor assignment, show only on floor 0. + // If it does, show on the matching floor only. + const fid = ex.kg_floor_id; + const matches = fid == null ? state.floorIndex === 0 : fid === curFloor; + if (!matches) continue; svg.appendChild(makeExtraPin(ex)); } } @@ -254,14 +258,20 @@ function makeNotePin(note, idx) { g.dataset.tooltip = note.text || "(empty)"; // drag-to-move + right-click delete + double-click to edit text + // Click on a pin must NOT bubble to the SVG (which would add a waypoint + // / pull / etc. at the same spot, depending on the active tool). + g.addEventListener("click", (e) => e.stopPropagation()); g.addEventListener("pointerdown", (e) => { e.stopPropagation(); - state.drag = { kind: "note", idx }; + state.drag = { kind: "note", idx, moved: false, downX: e.clientX, downY: e.clientY }; g.classList.add("dragging"); g.setPointerCapture(e.pointerId); }); g.addEventListener("pointermove", (e) => { if (!state.drag || state.drag.kind !== "note" || state.drag.idx !== idx) return; + if (Math.hypot(e.clientX - state.drag.downX, e.clientY - state.drag.downY) > 3) { + state.drag.moved = true; + } const pt = svgPointFromEvent(e); const arr = state.notes[currentKey()]; arr[idx].x = pt.x; arr[idx].y = pt.y; @@ -269,29 +279,40 @@ function makeNotePin(note, idx) { }); g.addEventListener("pointerup", () => { if (!state.drag) return; + const moved = state.drag.moved; state.drag = null; g.classList.remove("dragging"); - pushHistory(); - updateHash(); - }); - g.addEventListener("contextmenu", (e) => { - e.preventDefault(); - removeNote(idx); - }); - g.addEventListener("dblclick", (e) => { - e.preventDefault(); - e.stopPropagation(); - const txt = prompt("Edit note text", note.text || ""); - if (txt !== null) { - state.notes[currentKey()][idx].text = txt; + if (moved) { pushHistory(); - renderOverlay(); updateHash(); } }); + g.addEventListener("contextmenu", (e) => { + e.preventDefault(); + e.stopPropagation(); + removeNote(idx); + }); + // Double-click → edit. Works regardless of active tool because the + // pin captures click + dblclick before the canvas click handler runs. + g.addEventListener("dblclick", (e) => { + e.preventDefault(); + e.stopPropagation(); + editNote(idx); + }); return g; } +function editNote(idx) { + const cur = state.notes[currentKey()]?.[idx]; + if (!cur) return; + const txt = prompt("Edit note text:", cur.text || ""); + if (txt === null) return; + cur.text = txt; + pushHistory(); + renderOverlay(); + updateHash(); +} + function removeNote(idx) { const key = currentKey(); const arr = state.notes[key]; @@ -338,15 +359,21 @@ function makeTextLabel(item, idx) { hit.setAttribute("fill", "transparent"); g.appendChild(hit); - // Drag / right-click delete / dbl-click edit + // Stop click propagating so the canvas's tool handler doesn't fire when + // the user is interacting with this label (otherwise editing in Route + // mode would also drop a waypoint underneath). + g.addEventListener("click", (e) => e.stopPropagation()); g.addEventListener("pointerdown", (e) => { e.stopPropagation(); - state.drag = { kind: "text", idx }; + state.drag = { kind: "text", idx, moved: false, downX: e.clientX, downY: e.clientY }; g.classList.add("dragging"); g.setPointerCapture(e.pointerId); }); g.addEventListener("pointermove", (e) => { if (!state.drag || state.drag.kind !== "text" || state.drag.idx !== idx) return; + if (Math.hypot(e.clientX - state.drag.downX, e.clientY - state.drag.downY) > 3) { + state.drag.moved = true; + } const pt = svgPointFromEvent(e); const arr = state.texts[currentKey()]; arr[idx].x = pt.x; arr[idx].y = pt.y; @@ -354,25 +381,23 @@ function makeTextLabel(item, idx) { }); g.addEventListener("pointerup", () => { if (!state.drag) return; + const moved = state.drag.moved; state.drag = null; g.classList.remove("dragging"); - pushHistory(); - updateHash(); + if (moved) { + pushHistory(); + updateHash(); + } }); g.addEventListener("contextmenu", (e) => { e.preventDefault(); + e.stopPropagation(); removeText(idx); }); g.addEventListener("dblclick", (e) => { e.preventDefault(); e.stopPropagation(); - const txt = prompt("Edit label", item.text || ""); - if (txt !== null) { - state.texts[currentKey()][idx].text = txt; - pushHistory(); - renderOverlay(); - updateHash(); - } + editText(idx); }); return g; } @@ -387,6 +412,17 @@ function removeText(idx) { updateHash(); } +function editText(idx) { + const cur = state.texts[currentKey()]?.[idx]; + if (!cur) return; + const txt = prompt("Edit label:", cur.text || ""); + if (txt === null) return; + cur.text = txt; + pushHistory(); + renderOverlay(); + updateHash(); +} + // kg classification IDs: // 1 = minor (NPCs, ambient mobs) // 2 = standard trash @@ -555,14 +591,18 @@ function makeUserPin(x, y, label, cssClass, kind, idx) { t.textContent = label; g.appendChild(t); + g.addEventListener("click", (e) => e.stopPropagation()); g.addEventListener("pointerdown", (e) => { e.stopPropagation(); - state.drag = { kind, idx }; + state.drag = { kind, idx, moved: false, downX: e.clientX, downY: e.clientY }; g.classList.add("dragging"); g.setPointerCapture(e.pointerId); }); g.addEventListener("pointermove", (e) => { if (!state.drag || state.drag.idx !== idx || state.drag.kind !== kind) return; + if (Math.hypot(e.clientX - state.drag.downX, e.clientY - state.drag.downY) > 3) { + state.drag.moved = true; + } const pt = svgPointFromEvent(e); const arr = kind === "route" ? state.routes[currentKey()] : state.pulls[currentKey()]; arr[idx] = { x: pt.x, y: pt.y }; @@ -579,14 +619,18 @@ function makeUserPin(x, y, label, cssClass, kind, idx) { }); g.addEventListener("pointerup", () => { if (!state.drag) return; + const moved = state.drag.moved; state.drag = null; g.classList.remove("dragging"); - pushHistory(); - renderInfoPane(); - updateHash(); + if (moved) { + pushHistory(); + renderInfoPane(); + updateHash(); + } }); g.addEventListener("contextmenu", (e) => { e.preventDefault(); + e.stopPropagation(); removePoint(kind, idx); }); return g; @@ -1135,6 +1179,16 @@ function hookEvents() { $("export").addEventListener("click", exportJson); const importBtn = $("import"); if (importBtn) importBtn.addEventListener("click", importJson); + // Layer toggles — repaint overlay on change. Persisted in state.show. + for (const layer of ["enemies", "packs", "patrols", "icons"]) { + const cb = $(`layer-${layer}`); + if (!cb) continue; + cb.checked = state.show[layer]; + cb.addEventListener("change", () => { + state.show[layer] = cb.checked; + renderOverlay(); + }); + } $("tool-route").addEventListener("click", () => setTool("route")); $("tool-pull").addEventListener("click", () => setTool("pull")); const noteBtn = $("tool-note"); diff --git a/web/assets/dungeons.json b/web/assets/dungeons.json index a14ac34..517d892 100644 --- a/web/assets/dungeons.json +++ b/web/assets/dungeons.json @@ -1486,21 +1486,6 @@ "pack_id": null, "patrol_id": null }, - { - "id": 29965, - "npc_id": 12902, - "name": "Lorgus Jett", - "pos": [ - 3780.0, - 2561.0 - ], - "classification": 3, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, { "id": 29966, "npc_id": 4807, @@ -4400,6 +4385,22 @@ "kill_priority": null, "pack_id": null, "patrol_id": 1739 + }, + { + "id": 29965, + "npc_id": 12902, + "name": "Lorgus Jett", + "pos": [ + 2893, + 2827 + ], + "classification": 3, + "skippable": false, + "required": false, + "kill_priority": null, + "pack_id": null, + "patrol_id": null, + "ascension_override": true } ], "packs": [ @@ -24986,110 +24987,122 @@ { "name": "Kharan Mighthammer", "pos": [ - 3166.4, - 3541.2 + 3146.5, + 3322.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "Commander Gor'shak ", "pos": [ - 3293.2, - 3759.8 + 3273.8, + 3524.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "Marshal Windsor", "pos": [ - 3229.8, - 4065.8 + 3210.1, + 3807.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "Ring of Law", "pos": [ - 3103.0, - 2623.0 + 3082.8, + 2473.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "The Vault", "pos": [ - 3673.5, - 2841.6 + 3655.6, + 2675.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "Ring of Law", "pos": [ - 3103.0, - 3847.2 + 3082.8, + 3605.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "Shadowforge Lock", "pos": [ - 2532.5, - 3934.7 + 2510.1, + 3685.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "The Grim Guzzler", "pos": [ - 3039.6, - 2710.5 + 3019.2, + 2554.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "Summoner's Tomb", "pos": [ - 3293.2, - 1049.1 + 3273.8, + 1019.1 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "The Lyceum", "pos": [ - 4117.3, - 480.7 + 4101.0, + 493.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "The Black Forge", "pos": [ - 3863.7, - 1049.1 + 3846.5, + 1019.1 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 }, { "name": "Molten Core", "pos": [ - 4180.7, - 1530.0 + 4164.7, + 1463.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 194 } ] }, @@ -27458,20 +27471,22 @@ { "name": "Draconic for Dummies (Chapter VII)", "pos": [ - 2120.6, - 1770.8 + 2254.4, + 1615.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 312 }, { "name": "Master Elemental Shaper Krixix", "pos": [ - 2569.4, - 1722.8 + 2610.7, + 1517.1 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 312 } ] }, @@ -34730,131 +34745,125 @@ } ], "extras": [ - { - "name": "Stomper Kreeg ", - "pos": [ - 3447.2, - 3937.5 - ], - "rare": false, - "source": "atlasloot" - }, { "name": "Guard Slip'kik", "pos": [ - 2647.3, - 3201.7 + 3261.5, + 3653.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Captain Kromcrush", "pos": [ - 2770.1, - 2740.0 + 3296.2, + 3102.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "King Gordok", "pos": [ - 2774.8, - 1030.3 + 3297.6, + 1062.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Pylons", "pos": [ - 3655.9, - 2711.1 + 3546.7, + 3068.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Pylons", "pos": [ - 2960.3, - 619.1 + 3350.0, + 571.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Tendris Warpwood", "pos": [ - 2807.2, - 2891.5 + 3306.7, + 3283.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Magister Kalendris", "pos": [ - 2774.8, - 2299.9 + 3297.6, + 2577.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Tsu'zee (Rare)", "pos": [ - 3616.4, - 756.1 + 3535.5, + 735.1 ], "rare": true, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Immol'thar", "pos": [ - 2849.0, - 3223.3 + 3318.5, + 3679.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Lord Hel'nurath (Summon)", "pos": [ - 2378.3, - 3050.2 + 3185.4, + 3472.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Prince Tortheldrin", "pos": [ - 3456.5, - 121.3 + 3490.3, + -22.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 }, { "name": "Pylons", "pos": [ - 3053.0, - 1556.9 + 3376.2, + 1690.7 ], "rare": false, - "source": "atlasloot" - }, - { - "name": "Old Ironbark", - "pos": [ - 2960.3, - 3937.5 - ], - "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 203 } ] }, @@ -40991,7 +41000,8 @@ 3130.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Tendris Warpwood", @@ -41000,7 +41010,8 @@ 2142.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Magister Kalendris", @@ -41009,7 +41020,8 @@ 1811.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Immol'thar", @@ -41018,7 +41030,8 @@ 2327.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Lord Hel'nurath (Summon)", @@ -41027,7 +41040,8 @@ 2230.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Prince Tortheldrin", @@ -41036,7 +41050,8 @@ 593.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Hydrospawn", @@ -41045,7 +41060,8 @@ 1968.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Lethtendris", @@ -41054,7 +41070,8 @@ 1863.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 }, { "name": "Alzzin the Wildshaper", @@ -41063,7 +41080,8 @@ 1150.1 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 198 } ] }, @@ -46691,92 +46709,102 @@ { "name": "Guard Mol'dar", "pos": [ - 4061.4, - 3117.0 + 4352.2, + 2945.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 201 }, { "name": "Stomper Kreeg ", "pos": [ - 3611.3, - 2815.6 + 3787.6, + 2683.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 201 }, { "name": "Guard Fengus", "pos": [ - 2696.1, - 3177.2 + 2639.4, + 2997.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 201 }, { "name": "Guard Slip'kik", "pos": [ - 1866.8, - 2431.4 + 2000.1, + 2382.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 199 }, { "name": "Captain Kromcrush", "pos": [ - 2134.8, - 2190.3 + 2061.1, + 2069.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 199 }, { "name": "King Gordok", "pos": [ - 2144.9, - 1297.6 + 2063.4, + 910.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 199 }, { "name": "Lord Hel'nurath (Summon)", "pos": [ - 1280.2, - 2352.3 + 1866.5, + 2279.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 199 }, { "name": "Hydrospawn", "pos": [ - 2600.0, - 2107.4 + 2167.1, + 1961.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 199 }, { "name": "Lethtendris", "pos": [ - 2777.0, - 2009.5 + 2207.4, + 1834.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 199 }, { "name": "Alzzin the Wildshaper", "pos": [ - 3424.2, - 1342.8 + 3552.9, + 1405.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 201 } ] }, @@ -54589,17 +54617,6 @@ } ] } - ], - "extras": [ - { - "name": "Clean Room", - "pos": [ - 5674.2, - 2664.2 - ], - "rare": false, - "source": "atlasloot" - } ] }, { @@ -64214,152 +64231,6 @@ "patrols": [], "icons": [] } - ], - "extras": [ - { - "name": "Mother Smolderweb", - "pos": [ - 3949.6, - 2798.5 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Burning Felguard (Rare, Summon)", - "pos": [ - 2473.0, - 2039.6 - ], - "rare": true, - "source": "atlasloot" - }, - { - "name": "Vaelan (Upper)", - "pos": [ - 3105.8, - 1423.0 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Warosh (Wanders)", - "pos": [ - 3738.6, - 1517.9 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Bijou", - "pos": [ - 3879.3, - 2134.5 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Roughshod Pike", - "pos": [ - 4160.5, - 2229.3 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Spirestone Butcher (Rare)", - "pos": [ - 3035.5, - 2229.3 - ], - "rare": true, - "source": "atlasloot" - }, - { - "name": "Human Remains (Lower)", - "pos": [ - 2473.0, - 2134.5 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Urok's Tribute Pile", - "pos": [ - 2683.9, - 2087.0 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Halycon", - "pos": [ - 2121.4, - 3509.9 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Pyroguard Emberseer", - "pos": [ - 1629.2, - 759.0 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Solakar Flamewreath", - "pos": [ - 2191.7, - 1328.2 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Goraluk Anvilcrack ", - "pos": [ - 1769.8, - 759.0 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Warchief Rend Blackhand", - "pos": [ - 2894.9, - 759.0 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "The Beast", - "pos": [ - 3949.6, - 996.2 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "General Drakkisath", - "pos": [ - 1980.7, - 1849.9 - ], - "rare": false, - "source": "atlasloot" - } ] }, { @@ -78110,20 +77981,22 @@ { "name": "Veng ", "pos": [ - 3732.3, - 946.8 + 3795.3, + 896.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 214 }, { "name": "Maraudos ", "pos": [ - 3299.8, - 3056.4 + 3256.7, + 3083.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 215 } ] }, @@ -100268,29 +100141,32 @@ { "name": "|cffcc6666Instructor Razuvious", "pos": [ - 2683.1, - 1682.3 + 2602.4, + 1894.1 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 138 }, { "name": "|cffcc6666Gothik the Harvester", "pos": [ - 3996.6, - 1869.7 + 4128.5, + 2470.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 138 }, { "name": "|cffcc6666Four Horsemen Chest", "pos": [ - 1971.6, - 2097.3 + 1839.2, + 3176.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 141 } ] }, @@ -114583,7 +114459,8 @@ 2011.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 218 }, { "name": "Blind Hunter (Rare)", @@ -114592,7 +114469,8 @@ 1272.6 ], "rare": true, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 218 } ] }, @@ -119053,7 +118931,8 @@ 2099.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 220 }, { "name": "Pumpkin Shrine (Hallow's End)", @@ -119062,7 +118941,8 @@ 2196.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 220 }, { "name": "Bloodmage Thalnos", @@ -119071,7 +118951,8 @@ 1971.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 220 }, { "name": "Houndmaster Loksey", @@ -119080,7 +118961,8 @@ 2904.9 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 220 }, { "name": "Arcanist Doan", @@ -119089,7 +118971,8 @@ 2647.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 220 }, { "name": "Herod ", @@ -119098,7 +118981,8 @@ 522.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 220 } ] }, @@ -121327,7 +121211,8 @@ 2989.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 221 }, { "name": "Arcanist Doan", @@ -121336,7 +121221,8 @@ 2801.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 221 }, { "name": "Herod ", @@ -121345,7 +121231,8 @@ 1253.9 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 221 }, { "name": "High Inquisitor Fairbanks", @@ -121354,7 +121241,8 @@ 1605.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 221 }, { "name": "Scarlet Commander Mograine", @@ -121363,7 +121251,8 @@ 1676.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 221 }, { "name": "High Inquisitor Whitemane", @@ -121372,7 +121261,8 @@ 1394.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 221 } ] }, @@ -123539,7 +123429,8 @@ 1783.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 222 }, { "name": "Bloodmage Thalnos", @@ -123548,7 +123439,8 @@ 1487.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 222 } ] }, @@ -123562,8460 +123454,244 @@ "mapping_id": 219, "maps": [ { - "image": "maps/scholomance_floor1.webp", - "width": 6144, - "height": 4096, - "label": "scholomance_floor1", - "kg_floor_id": 223, + "image": "maps/scholomance.webp", + "width": 2048, + "height": 2048, + "label": "Scholomance", + "kg_floor_id": null, "enemies": [ { - "id": 34398, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 3335.9504, - 2057.9808 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34399, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 3341.1728, - 2402.72 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34400, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 3529.2112, - 2179.8592 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6591, - "patrol_id": null - }, - { - "id": 34401, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 3532.6944, - 2282.584 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6591, - "patrol_id": null - }, - { - "id": 34402, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 3764.2608, - 1436.408 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6597, - "patrol_id": null - }, - { - "id": 34403, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 3819.976, - 1413.7744 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6597, - "patrol_id": null - }, - { - "id": 34404, - "npc_id": 10499, - "name": "Spectral Researcher", - "pos": [ - 3884.3968, - 1417.256 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6597, - "patrol_id": null - }, - { - "id": 34405, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 3947.0768, - 1467.7488 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6597, - "patrol_id": null - }, - { - "id": 34406, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4286.5904, - 1476.4544 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6598, - "patrol_id": null - }, - { - "id": 34407, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 4352.7536, - 1492.1232 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6598, - "patrol_id": null - }, - { - "id": 34408, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 4438.0672, - 1633.1536 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6599, - "patrol_id": null - }, - { - "id": 34409, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4481.5936, - 1683.6448 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6599, - "patrol_id": null - }, - { - "id": 34410, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4817.6272, - 1620.9648 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6600, - "patrol_id": null - }, - { - "id": 34411, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 4852.4496, - 1676.68 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6600, - "patrol_id": null - }, - { - "id": 34412, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 5141.5744, - 1773.5904 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6604, - "patrol_id": null - }, - { - "id": 34413, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 5207.0496, - 1834.472 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6604, - "patrol_id": null - }, - { - "id": 34414, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 5026.704, - 1893.0544 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6603, - "patrol_id": null - }, - { - "id": 34415, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 5026.704, - 1943.5984 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6603, - "patrol_id": null - }, - { - "id": 34416, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 5029.0016, - 2148.0656 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6592, - "patrol_id": null - }, - { - "id": 34417, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 4997.9872, - 2207.7984 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6592, - "patrol_id": null - }, - { - "id": 34418, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 5054.272, - 2221.5824 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6592, - "patrol_id": null - }, - { - "id": 34419, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 4907.1328, - 2363.0016 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6593, - "patrol_id": null - }, - { - "id": 34420, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4938.9632, - 2444.8512 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6593, - "patrol_id": null - }, - { - "id": 34421, - "npc_id": 10499, - "name": "Spectral Researcher", - "pos": [ - 5259.8896, - 2599.504 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6594, - "patrol_id": null - }, - { - "id": 34422, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 5161.1024, - 2536.3264 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6594, - "patrol_id": null - }, - { - "id": 34423, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 5165.696, - 2622.4784 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6594, - "patrol_id": null - }, - { - "id": 34424, - "npc_id": 14861, + "id": null, + "npc_id": null, "name": "Blood Steward of Kirtonos", "pos": [ - 4860.9024, - 2957.1632 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1953 - }, - { - "id": 34425, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4711.96, - 2758.024 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6595, - "patrol_id": null - }, - { - "id": 34426, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4745.2736, - 2816.608 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6595, - "patrol_id": null - }, - { - "id": 34427, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 4419.0432, - 2391.5904 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6602, - "patrol_id": null - }, - { - "id": 34428, - "npc_id": 10499, - "name": "Spectral Researcher", - "pos": [ - 4498.3024, - 2412.2672 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6602, - "patrol_id": null - }, - { - "id": 34429, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4347.8336, - 2819.9904 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6596, - "patrol_id": null - }, - { - "id": 34430, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 4363.9056, - 2880.936 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6596, - "patrol_id": null - }, - { - "id": 34431, - "npc_id": 10499, - "name": "Spectral Researcher", - "pos": [ - 4016.72, - 2218.1632 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34432, - "npc_id": 10499, - "name": "Spectral Researcher", - "pos": [ - 4610.4352, - 2004.008 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6601, - "patrol_id": null - }, - { - "id": 34433, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 4692.432, - 2057.3184 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6601, - "patrol_id": null - }, - { - "id": 34434, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4610.8752, - 2080.2928 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6601, - "patrol_id": null - }, - { - "id": 34435, - "npc_id": 10499, - "name": "Spectral Researcher", - "pos": [ - 5242.6592, - 2342.1952 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1948 - }, - { - "id": 34436, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 3950.5584, - 3012.1056 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1949 - }, - { - "id": 34437, - "npc_id": 10499, - "name": "Spectral Researcher", - "pos": [ - 4602.8336, - 2994.656 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1952 - }, - { - "id": 34438, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 4161.7344, - 2007.9248 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1950 - }, - { - "id": 34439, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 3854.7984, - 2110.2144 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1951 - }, - { - "id": 34440, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 4108.8944, - 1810.3488 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1954 - } - ], - "packs": [ - { - "id": 6591, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3482.2016, - 2134.5904 - ], - [ - 3482.2016, - 2341.7808 - ], - [ - 3593.632, - 2338.2992 - ], - [ - 3591.8912, - 2134.5904 - ] - ], - "enemy_ids": [ - 34400, - 34401 - ] - }, - { - "id": 6592, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4980.7568, - 2115.9024 - ], - [ - 4977.3104, - 2266.3824 - ], - [ - 5082.9904, - 2254.8944 - ], - [ - 5081.8416, - 2113.6048 - ] - ], - "enemy_ids": [ - 34416, - 34417, - 34418 - ] - }, - { - "id": 6593, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4825.2832, - 2334.9616 - ], - [ - 4886.6704, - 2494.112 - ], - [ - 5014.7488, - 2469.8608 - ], - [ - 4957.1504, - 2294.0368 - ] - ], - "enemy_ids": [ - 34419, - 34420 - ] - }, - { - "id": 6594, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 5096.7744, - 2500.7168 - ], - [ - 5093.328, - 2667.2768 - ], - [ - 5303.5408, - 2671.872 - ], - [ - 5287.4592, - 2509.9056 - ] - ], - "enemy_ids": [ - 34421, - 34422, - 34423 - ] - }, - { - "id": 6595, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4684.392, - 2724.712 - ], - [ - 4683.2432, - 2848.7712 - ], - [ - 4780.8832, - 2845.3264 - ], - [ - 4784.5456, - 2721.3408 - ] - ], - "enemy_ids": [ - 34425, - 34426 - ] - }, - { - "id": 6596, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4303.12, - 2793.4656 - ], - [ - 4297.28, - 2982.0208 - ], - [ - 4424.7856, - 2972.832 - ], - [ - 4413.7664, - 2793.4656 - ] - ], - "enemy_ids": [ - 34429, - 34430 - ] - }, - { - "id": 6597, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3743.368, - 1391.1392 - ], - [ - 3741.6256, - 1537.392 - ], - [ - 3978.416, - 1542.616 - ], - [ - 3967.9696, - 1387.6576 - ] - ], - "enemy_ids": [ - 34402, - 34403, - 34404, - 34405 - ] - }, - { - "id": 6598, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4243.064, - 1412.0336 - ], - [ - 4243.064, - 1542.616 - ], - [ - 4406.7264, - 1565.2496 - ], - [ - 4399.7632, - 1405.0688 - ] - ], - "enemy_ids": [ - 34406, - 34407 - ] - }, - { - "id": 6599, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4417.1728, - 1612.2592 - ], - [ - 4415.432, - 1721.9488 - ], - [ - 4516.416, - 1723.6896 - ], - [ - 4509.4512, - 1614.0 - ] - ], - "enemy_ids": [ - 34408, - 34409 - ] - }, - { - "id": 6600, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4777.5808, - 1587.8848 - ], - [ - 4770.6176, - 1728.9136 - ], - [ - 4908.1648, - 1725.432 - ], - [ - 4908.1648, - 1589.6256 - ] - ], - "enemy_ids": [ - 34410, - 34411 - ] - }, - { - "id": 6601, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4573.872, - 1958.7392 - ], - [ - 4573.872, - 2178.1168 - ], - [ - 4761.912, - 2181.6 - ], - [ - 4747.9824, - 1963.9616 - ] - ], - "enemy_ids": [ - 34432, - 34433, - 34434 - ] - }, - { - "id": 6602, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4388.0272, - 2349.088 - ], - [ - 4382.2848, - 2483.4864 - ], - [ - 4549.9936, - 2486.9312 - ], - [ - 4555.7376, - 2342.1952 - ] - ], - "enemy_ids": [ - 34427, - 34428 - ] - }, - { - "id": 6603, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4994.2864, - 1868.12 - ], - [ - 4994.5408, - 1999.8832 - ], - [ - 5073.8, - 1997.5872 - ], - [ - 5066.2832, - 1863.5728 - ] - ], - "enemy_ids": [ - 34414, - 34415 - ] - }, - { - "id": 6604, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 5084.1392, - 1750.616 - ], - [ - 5082.9904, - 1871.2304 - ], - [ - 5284.0128, - 1860.8912 - ], - [ - 5288.608, - 1748.3184 - ] - ], - "enemy_ids": [ - 34412, - 34413 - ] - } - ], - "patrols": [ - { - "id": 1948, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 5073.104, - 2513.816 - ], - [ - 5072.6512, - 2413.416 - ], - [ - 5243.808, - 2397.3328 - ], - [ - 5244.9568, - 2276.72 - ], - [ - 5061.1648, - 2279.0176 - ], - [ - 5058.8672, - 2118.2 - ], - [ - 5243.808, - 2119.3488 - ], - [ - 5247.2544, - 1983.8016 - ], - [ - 5024.4064, - 2058.4672 - ], - [ - 5039.3392, - 2521.3936 - ], - [ - 5128.9376, - 2643.1552 - ], - [ - 5157.2256, - 2628.2528 - ], - [ - 5073.104, - 2513.816 - ] - ] - }, - { - "id": 1949, - "color": "#a330c9", - "weight": 3, - "vertices": [ - [ - 3925.7056, - 3023.096 - ], - [ - 4370.1632, - 2094.544 - ], - [ - 4984.4336, - 1847.6592 - ], - [ - 5046.5776, - 1846.1424 - ], - [ - 4785.4768, - 2562.7456 - ], - [ - 4226.0608, - 2729.3072 - ], - [ - 3983.64, - 3022.552 - ], - [ - 3926.464, - 3023.096 - ] - ] - }, - { - "id": 1950, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 4021.5936, - 2262.936 - ], - [ - 3770.0288, - 2270.976 - ], - [ - 3766.5824, - 2215.8384 - ], - [ - 4018.1472, - 2210.096 - ], - [ - 4169.7744, - 2050.4272 - ], - [ - 4149.0432, - 1479.936 - ], - [ - 4222.1696, - 1478.1952 - ], - [ - 4636.552, - 2284.3248 - ], - [ - 4984.4336, - 2475.1648 - ], - [ - 5043.5472, - 2581.2656 - ], - [ - 5001.864, - 2585.0544 - ], - [ - 4953.3616, - 2497.1424 - ], - [ - 4462.6928, - 2257.192 - ], - [ - 4021.5936, - 2264.0848 - ] - ] - }, - { - "id": 1951, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 4159.1264, - 1617.2688 - ], - [ - 3854.7984, - 1615.7424 - ], - [ - 3872.2096, - 2813.6192 - ], - [ - 4168.1968, - 2815.36 - ], - [ - 4159.4912, - 1617.4832 - ] - ] - }, - { - "id": 1952, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 4653.3776, - 2789.04 - ], - [ - 4826.8304, - 2784.4448 - ], - [ - 4821.0864, - 2995.8048 - ], - [ - 4918.7264, - 2991.2112 - ], - [ - 4909.536, - 2724.712 - ], - [ - 4105.448, - 2728.1584 - ], - [ - 4112.3408, - 3013.0352 - ], - [ - 4309.9168, - 3013.0352 - ], - [ - 4298.4288, - 2792.4864 - ], - [ - 4558.0352, - 2792.4864 - ], - [ - 4561.4816, - 2999.2512 - ], - [ - 4653.3776, - 2999.2512 - ], - [ - 4655.6752, - 2789.04 - ] - ] - }, - { - "id": 1953, - "color": "#abd473", - "weight": 3, - "vertices": [ - [ - 4883.6384, - 2964.7424 - ], - [ - 4841.9568, - 2964.7424 - ], - [ - 4835.136, - 2450.1552 - ], - [ - 5076.8928, - 2450.1552 - ], - [ - 5077.6512, - 2493.3536 - ], - [ - 4876.0608, - 2495.6272 - ], - [ - 4883.6384, - 2964.7424 - ] - ] - }, - { - "id": 1954, - "color": "#abd473", - "weight": 3, - "vertices": [ - [ - 4107.7456, - 1816.0928 - ], - [ - 4092.8128, - 2211.2448 - ], - [ - 3928.0, - 2225.0 - ], - [ - 3928.0, - 2251.0 - ], - [ - 4090.0, - 2246.5008 - ], - [ - 4097.4064, - 2559.2992 - ], - [ - 4648.7024, - 2566.8656 - ], - [ - 4811.8976, - 2478.8912 - ], - [ - 4807.3024, - 1810.3488 - ], - [ - 4108.8944, - 1816.0928 - ] - ] - } - ], - "icons": [ - { - "id": 1298, - "type": "start", - "pos": [ - 2377.7536, - 2660.128 - ], - "comment": null - }, - { - "id": 1299, - "type": "door", - "pos": [ - 3729.4384, - 2239.056 - ], - "comment": "Iron Gate" - } - ] - }, - { - "image": "maps/scholomance_floor2.webp", - "width": 6144, - "height": 4096, - "label": "scholomance_floor2", - "kg_floor_id": 224, - "enemies": [ - { - "id": 34441, - "npc_id": 11582, - "name": "Scholomance Dark Summoner", - "pos": [ - 3322.0208, - 1316.272 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6609, - "patrol_id": null - }, - { - "id": 34442, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 3229.7424, - 1314.5312 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6609, - "patrol_id": null - }, - { - "id": 34443, - "npc_id": 11582, - "name": "Scholomance Dark Summoner", - "pos": [ - 3325.5024, - 814.8352 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6610, - "patrol_id": null - }, - { - "id": 34444, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 3328.9856, - 894.9264 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6610, - "patrol_id": null - }, - { - "id": 34445, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2968.2368, - 922.4048 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6614, - "patrol_id": null - }, - { - "id": 34446, - "npc_id": 11582, - "name": "Scholomance Dark Summoner", - "pos": [ - 2894.72, - 921.256 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6614, - "patrol_id": null - }, - { - "id": 34447, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2846.4752, - 854.632 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6614, - "patrol_id": null - }, - { - "id": 34448, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2581.1248, - 823.616 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6613, - "patrol_id": null - }, - { - "id": 34449, - "npc_id": 11582, - "name": "Scholomance Dark Summoner", - "pos": [ - 2584.5712, - 890.2416 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6613, - "patrol_id": null - }, - { - "id": 34450, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2653.4928, - 933.8912 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6613, - "patrol_id": null - }, - { - "id": 34451, - "npc_id": 11582, - "name": "Scholomance Dark Summoner", - "pos": [ - 2636.2624, - 1236.0 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6612, - "patrol_id": null - }, - { - "id": 34452, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2728.1584, - 1233.7024 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6612, - "patrol_id": null - }, - { - "id": 34453, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2584.5712, - 1315.2592 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6612, - "patrol_id": null - }, - { - "id": 34454, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2907.3552, - 1221.0656 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6611, - "patrol_id": null - }, - { - "id": 34455, - "npc_id": 11582, - "name": "Scholomance Dark Summoner", - "pos": [ - 2983.1696, - 1221.0656 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6611, - "patrol_id": null - }, - { - "id": 34456, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2946.4112, - 1329.0432 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6611, - "patrol_id": null - }, - { - "id": 34457, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 3356.8432, - 1027.2496 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1958 - }, - { - "id": 34458, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 3080.6944, - 1176.1968 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1956 - }, - { - "id": 34459, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 2805.592, - 1188.3216 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1955 - }, - { - "id": 34460, - "npc_id": 11551, - "name": "Necrofiend", - "pos": [ - 2923.0592, - 1048.8752 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1957 - }, - { - "id": 34461, - "npc_id": 10498, - "name": "Spectral Tutor", - "pos": [ - 2204.352, - 868.416 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6615, - "patrol_id": null - }, - { - "id": 34462, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2134.2816, - 963.7584 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6615, - "patrol_id": null - }, - { - "id": 34463, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2275.5712, - 960.312 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6615, - "patrol_id": null - }, - { - "id": 34464, - "npc_id": 10487, - "name": "Risen Protector", - "pos": [ - 2035.4928, - 1071.736 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34465, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2032.048, - 1311.8128 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6616, - "patrol_id": null - }, - { - "id": 34466, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2026.304, - 1414.048 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6616, - "patrol_id": null - }, - { - "id": 34467, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2080.2928, - 1335.936 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6616, - "patrol_id": null - }, - { - "id": 34468, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2331.8576, - 1312.9616 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6617, - "patrol_id": null - }, - { - "id": 34469, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2368.616, - 1357.7616 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6617, - "patrol_id": null - }, - { - "id": 34470, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2373.2112, - 1440.4672 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6617, - "patrol_id": null - }, - { - "id": 34471, - "npc_id": 10498, - "name": "Spectral Tutor", - "pos": [ - 2321.52, - 1406.0064 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6617, - "patrol_id": null - }, - { - "id": 34472, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 1932.1104, - 1672.5056 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6619, - "patrol_id": null - }, - { - "id": 34473, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 1968.8688, - 1715.0064 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6619, - "patrol_id": null - }, - { - "id": 34474, - "npc_id": 10498, - "name": "Spectral Tutor", - "pos": [ - 2014.8176, - 1659.8688 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6619, - "patrol_id": null - }, - { - "id": 34475, - "npc_id": 11551, - "name": "Necrofiend", - "pos": [ - 2053.5008, - 1556.0 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1962 - }, - { - "id": 34476, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2259.4896, - 1754.0624 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6620, - "patrol_id": null - }, - { - "id": 34477, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2342.1952, - 1695.4784 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6620, - "patrol_id": null - }, - { - "id": 34478, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2350.2368, - 1791.9696 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6620, - "patrol_id": null - }, - { - "id": 34479, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2664.9808, - 1621.9616 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6618, - "patrol_id": null - }, - { - "id": 34480, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2607.5456, - 1630.0032 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6618, - "patrol_id": null - }, - { - "id": 34481, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2622.4784, - 1729.9392 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6618, - "patrol_id": null - }, - { - "id": 34482, - "npc_id": 10498, - "name": "Spectral Tutor", - "pos": [ - 1906.84, - 2052.7232 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6608, - "patrol_id": null - }, - { - "id": 34483, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 1980.3552, - 2017.1136 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6608, - "patrol_id": null - }, - { - "id": 34484, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 1967.72, - 2086.0368 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6608, - "patrol_id": null - }, - { - "id": 34485, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 1925.2192, - 2280.1664 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6605, - "patrol_id": null - }, - { - "id": 34486, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 1981.504, - 2338.7504 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6605, - "patrol_id": null - }, - { - "id": 34487, - "npc_id": 10498, - "name": "Spectral Tutor", - "pos": [ - 1882.7168, - 2343.344 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6605, - "patrol_id": null - }, - { - "id": 34488, - "npc_id": 10487, - "name": "Risen Protector", - "pos": [ - 2557.0032, - 2283.6128 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6607, - "patrol_id": null - }, - { - "id": 34489, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2488.08, - 2284.7616 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6607, - "patrol_id": null - }, - { - "id": 34490, - "npc_id": 10498, - "name": "Spectral Tutor", - "pos": [ - 2482.3376, - 2344.4928 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6607, - "patrol_id": null - }, - { - "id": 34491, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2419.1584, - 2344.4928 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6607, - "patrol_id": null - }, - { - "id": 34492, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2409.9696, - 2274.4224 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6607, - "patrol_id": null - }, - { - "id": 34493, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2736.2, - 2197.4592 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6606, - "patrol_id": null - }, - { - "id": 34494, - "npc_id": 10498, - "name": "Spectral Tutor", - "pos": [ - 2770.6608, - 2143.4704 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6606, - "patrol_id": null - }, - { - "id": 34495, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2673.0208, - 2143.4704 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6606, - "patrol_id": null - }, - { - "id": 34496, - "npc_id": 10482, - "name": "Risen Lackey", - "pos": [ - 2109.0096, - 2150.3632 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1959 - }, - { - "id": 34497, - "npc_id": 10487, - "name": "Risen Protector", - "pos": [ - 1999.9888, - 1950.728 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1960 - }, - { - "id": 34498, - "npc_id": 10487, - "name": "Risen Protector", - "pos": [ - 2233.0704, - 1582.9056 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1961 - }, - { - "id": 34499, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2158.4048, - 1503.6464 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1963 - }, - { - "id": 34500, - "npc_id": 10476, - "name": "Scholomance Necrolyte", - "pos": [ - 2288.7328, - 1497.528 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1963 - }, - { - "id": 34501, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2908.504, - 1613.9216 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34502, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2999.2512, - 1620.8128 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34503, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2948.7088, - 1703.52 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34504, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3056.6864, - 1702.3712 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34505, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3107.2288, - 1755.2112 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34506, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3133.6496, - 1661.0176 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34507, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3187.6384, - 1600.1376 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34508, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3332.3744, - 1600.1376 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34509, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3247.3696, - 1672.5056 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34510, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3228.9904, - 1756.36 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34511, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3217.504, - 1860.8912 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34512, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3354.1984, - 1721.8992 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34513, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3382.9168, - 1849.4048 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34514, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3328.928, - 1890.7568 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34515, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3067.024, - 1866.6352 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34516, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2956.7488, - 1888.4608 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34517, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3002.6976, - 1956.2336 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34518, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3078.512, - 1957.3824 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34519, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3033.712, - 2012.52 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34520, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3019.928, - 2175.6352 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34521, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2895.8688, - 2200.9056 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34522, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2947.56, - 2142.3232 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34523, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3032.5632, - 2095.2256 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34524, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 3154.3264, - 1988.3968 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34525, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3121.0128, - 2074.5488 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34526, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3146.2848, - 2197.4592 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34527, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3206.0176, - 2128.5376 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34528, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3307.1024, - 2190.568 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34529, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 3335.8208, - 2106.712 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34530, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3253.1136, - 2035.4928 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34531, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3297.9136, - 1972.3152 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34533, - "npc_id": 11551, - "name": "Necrofiend", - "pos": [ - 2854.5152, - 1916.0288 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1964 - }, - { - "id": 34597, - "npc_id": 11257, - "name": "Scholomance Handler", - "pos": [ - 2247.7616, - 2568.1248 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6633, - "patrol_id": null - }, - { - "id": 34598, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2297.3968, - 2517.9472 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6633, - "patrol_id": null - }, - { - "id": 34599, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2212.3936, - 2515.6496 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6633, - "patrol_id": null - }, - { - "id": 34600, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2212.3936, - 2615.5856 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6633, - "patrol_id": null - }, - { - "id": 34601, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2292.8016, - 2614.4368 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6633, - "patrol_id": null - }, - { - "id": 34602, - "npc_id": 11257, - "name": "Scholomance Handler", - "pos": [ - 2022.8576, - 2867.1504 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6632, - "patrol_id": null - }, - { - "id": 34603, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1981.504, - 2813.1616 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6632, - "patrol_id": null - }, - { - "id": 34604, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2067.6576, - 2815.4592 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6632, - "patrol_id": null - }, - { - "id": 34605, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2068.8064, - 2914.248 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6632, - "patrol_id": null - }, - { - "id": 34606, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1966.5712, - 2922.288 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6632, - "patrol_id": null - }, - { - "id": 34607, - "npc_id": 11257, - "name": "Scholomance Handler", - "pos": [ - 1810.3488, - 2584.5712 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6631, - "patrol_id": null - }, - { - "id": 34608, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1759.8064, - 2536.3264 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6631, - "patrol_id": null - }, - { - "id": 34609, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1864.3376, - 2538.624 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6631, - "patrol_id": null - }, - { - "id": 34610, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1860.8912, - 2642.0064 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6631, - "patrol_id": null - }, - { - "id": 34611, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1755.2112, - 2636.2624 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6631, - "patrol_id": null - }, - { - "id": 34612, - "npc_id": 11257, - "name": "Scholomance Handler", - "pos": [ - 1782.7792, - 3222.0992 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6635, - "patrol_id": null - }, - { - "id": 34613, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1723.6224, - 3203.72 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6635, - "patrol_id": null - }, - { - "id": 34614, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1844.2352, - 3177.2992 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6635, - "patrol_id": null - }, - { - "id": 34615, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1844.2352, - 3265.1744 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6635, - "patrol_id": null - }, - { - "id": 34616, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1742.576, - 3282.9792 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6635, - "patrol_id": null - }, - { - "id": 34617, - "npc_id": 11257, - "name": "Scholomance Handler", - "pos": [ - 2231.9216, - 3225.5456 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6634, - "patrol_id": null - }, - { - "id": 34618, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2285.9104, - 3171.5568 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6634, - "patrol_id": null - }, - { - "id": 34619, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2215.8384, - 3152.0288 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6634, - "patrol_id": null - }, - { - "id": 34620, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2166.4448, - 3215.2064 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6634, - "patrol_id": null - }, - { - "id": 34621, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2196.312, - 3291.0208 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6634, - "patrol_id": null - }, - { - "id": 34622, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 2288.2064, - 3273.7904 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6634, - "patrol_id": null - }, - { - "id": 34623, - "npc_id": 10678, - "name": "Plagued Hatchling", - "pos": [ - 1773.5904, - 3152.0288 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6635, - "patrol_id": null - }, - { - "id": 34637, - "npc_id": 10433, - "name": "Marduk Blackpool", - "pos": [ - 2752.6816, - 2590.7584 + 1046, + 637 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34638, - "npc_id": 10432, - "name": "Vectus", - "pos": [ - 2977.2832, - 2677.8128 - ], - "classification": 3, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34639, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3374.6416, - 2658.1488 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6646, - "patrol_id": null - }, - { - "id": 34640, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3420.1648, - 2696.4144 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6646, - "patrol_id": null - }, - { - "id": 34641, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3370.024, - 2712.248 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6646, - "patrol_id": null - }, - { - "id": 34642, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3395.1472, - 3165.3216 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6642, - "patrol_id": null - }, - { - "id": 34643, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3463.0496, - 3212.3312 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6642, - "patrol_id": null - }, - { - "id": 34644, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3374.2544, - 3257.6 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6642, - "patrol_id": null - }, - { - "id": 34645, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3259.3408, - 3424.7456 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6636, - "patrol_id": null - }, - { - "id": 34646, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3210.5904, - 3369.0304 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6636, - "patrol_id": null - }, - { - "id": 34647, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3182.7328, - 3436.9344 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6636, - "patrol_id": null - }, - { - "id": 34648, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3006.8816, - 3367.2896 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6637, - "patrol_id": null - }, - { - "id": 34649, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3067.8208, - 3367.2896 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6637, - "patrol_id": null - }, - { - "id": 34650, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3031.2576, - 3301.128 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6637, - "patrol_id": null - }, - { - "id": 34651, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3168.7984, - 3233.4544 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6641, - "patrol_id": null - }, - { - "id": 34652, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3219.6, - 3239.392 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6641, - "patrol_id": null - }, - { - "id": 34653, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3195.848, - 3189.2512 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6641, - "patrol_id": null - }, - { - "id": 34654, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2893.0208, - 3239.392 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6638, - "patrol_id": null - }, - { - "id": 34655, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2942.4608, - 3241.9296 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6638, - "patrol_id": null - }, - { - "id": 34656, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2827.5488, - 3327.2448 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6639, - "patrol_id": null - }, - { - "id": 34657, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2787.5024, - 3275.0112 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6639, - "patrol_id": null - }, - { - "id": 34658, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2757.904, - 3330.7264 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6639, - "patrol_id": null - }, - { - "id": 34659, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2723.0816, - 3097.4192 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6640, - "patrol_id": null - }, - { - "id": 34660, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2827.5488, - 3093.936 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6640, - "patrol_id": null - }, - { - "id": 34661, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3011.0, - 3073.0 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6643, - "patrol_id": null - }, - { - "id": 34662, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 2982.5056, - 3027.7744 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6643, - "patrol_id": null - }, - { - "id": 34663, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3040, - 3019.0 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6643, - "patrol_id": null - }, - { - "id": 34664, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3302.728, - 2979.4496 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6644, - "patrol_id": null - }, - { - "id": 34665, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3266.4416, - 2950.4192 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6644, - "patrol_id": null - }, - { - "id": 34666, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3145.7072, - 2802.6352 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6645, - "patrol_id": null - }, - { - "id": 34667, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3143.728, - 2856.7344 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6645, - "patrol_id": null - }, - { - "id": 34668, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3196.6624, - 2820.584 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6645, - "patrol_id": null - }, - { - "id": 34669, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3424, - 3024 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1971 - }, - { - "id": 34670, - "npc_id": 10475, - "name": "Scholomance Student", - "pos": [ - 3191.8896, - 2680.5808 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1972 - }, - { - "id": 34742, - "npc_id": 10506, + "id": null, + "npc_id": null, "name": "Kirtonos the Herald", "pos": [ - 3058.6192, - 358.9056 + 555, + 264 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null - } - ], - "packs": [ - { - "id": 6605, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1857.4448, - 2235.3664 - ], - [ - 1848.256, - 2361.7232 - ], - [ - 2026.304, - 2355.9808 - ], - [ - 2014.8176, - 2227.3264 - ] - ], - "enemy_ids": [ - 34485, - 34486, - 34487 - ] - }, - { - "id": 6606, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2627.0736, - 2095.2256 - ], - [ - 2646.6016, - 2225.0288 - ], - [ - 2824.6496, - 2226.1776 - ], - [ - 2816.608, - 2090.6304 - ] - ], - "enemy_ids": [ - 34493, - 34494, - 34495 - ] - }, - { - "id": 6607, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2354.832, - 2213.5424 - ], - [ - 2359.4272, - 2383.5488 - ], - [ - 2596.0576, - 2362.872 - ], - [ - 2597.2064, - 2234.2176 - ] - ], - "enemy_ids": [ - 34488, - 34489, - 34490, - 34491, - 34492 - ] - }, - { - "id": 6608, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1864.3376, - 1997.5872 - ], - [ - 1870.0816, - 2135.4304 - ], - [ - 2010.2224, - 2127.3888 - ], - [ - 2009.0736, - 1995.2896 - ] - ], - "enemy_ids": [ - 34482, - 34483, - 34484 - ] - }, - { - "id": 6609, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3192.232, - 1249.784 - ], - [ - 3192.232, - 1368.0992 - ], - [ - 3367.984, - 1372.6944 - ], - [ - 3362.24, - 1255.528 - ] - ], - "enemy_ids": [ - 34441, - 34442 - ] - }, - { - "id": 6610, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3282.9792, - 752.3968 - ], - [ - 3282.9792, - 933.8912 - ], - [ - 3396.7008, - 930.4464 - ], - [ - 3359.9424, - 735.1664 - ] - ], - "enemy_ids": [ - 34443, - 34444 - ] - }, - { - "id": 6611, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2860.2592, - 1154.4416 - ], - [ - 2869.448, - 1395.6688 - ], - [ - 3002.6976, - 1372.6944 - ], - [ - 3017.6304, - 1152.144 - ] - ], - "enemy_ids": [ - 34454, - 34455, - 34456 - ] - }, - { - "id": 6612, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2553.5568, - 1141.8064 - ], - [ - 2554.7056, - 1409.4528 - ], - [ - 2752.2816, - 1388.776 - ], - [ - 2759.1728, - 1155.5904 - ] - ], - "enemy_ids": [ - 34451, - 34452, - 34453 - ] - }, - { - "id": 6613, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2534.0288, - 766.1824 - ], - [ - 2539.7728, - 983.2864 - ], - [ - 2690.2512, - 980.9888 - ], - [ - 2691.4, - 762.736 - ] - ], - "enemy_ids": [ - 34448, - 34449, - 34450 - ] - }, - { - "id": 6614, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2812.0128, - 792.6016 - ], - [ - 2810.8656, - 967.2048 - ], - [ - 3015.3328, - 963.7584 - ], - [ - 3000.4, - 784.5616 - ] - ], - "enemy_ids": [ - 34445, - 34446, - 34447 - ] - }, - { - "id": 6615, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2080.2928, - 810.9808 - ], - [ - 2081.4416, - 1021.1936 - ], - [ - 2333.0064, - 1015.4496 - ], - [ - 2299.6944, - 800.6432 - ] - ], - "enemy_ids": [ - 34461, - 34462, - 34463, - 34556 - ] - }, - { - "id": 6616, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1984.9504, - 1262.4192 - ], - [ - 1999.8832, - 1468.0368 - ], - [ - 2119.3488, - 1406.0064 - ], - [ - 2112.456, - 1242.8912 - ] - ], - "enemy_ids": [ - 34465, - 34466, - 34467 - ] - }, - { - "id": 6617, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2293.9504, - 1258.9728 - ], - [ - 2295.0992, - 1457.6976 - ], - [ - 2395.0368, - 1473.7792 - ], - [ - 2397.3328, - 1295.7312 - ] - ], - "enemy_ids": [ - 34468, - 34469, - 34470, - 34471 - ] - }, - { - "id": 6618, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2576.5312, - 1555.3376 - ], - [ - 2568.4896, - 1768.9952 - ], - [ - 2667.2768, - 1778.1856 - ], - [ - 2704.0352, - 1555.3376 - ] - ], - "enemy_ids": [ - 34479, - 34480, - 34481 - ] - }, - { - "id": 6619, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1887.312, - 1743.7248 - ], - [ - 2064.2112, - 1747.1696 - ], - [ - 2061.9136, - 1617.368 - ], - [ - 1844.8096, - 1621.9616 - ] - ], - "enemy_ids": [ - 34472, - 34473, - 34474 - ] - }, - { - "id": 6620, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2225.0288, - 1635.7472 - ], - [ - 2214.6912, - 1832.1744 - ], - [ - 2408.8208, - 1819.5376 - ], - [ - 2422.6048, - 1644.936 - ] - ], - "enemy_ids": [ - 34476, - 34477, - 34478 - ] - }, - { - "id": 6631, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1680.1632, - 2458.4352 - ], - [ - 1716.7264, - 2677.8128 - ], - [ - 1908.2464, - 2684.7776 - ], - [ - 1920.4352, - 2481.0688 - ] - ], - "enemy_ids": [ - 34607, - 34608, - 34609, - 34610, - 34611 - ] - }, - { - "id": 6632, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1915.2112, - 2731.7872 - ], - [ - 1916.952, - 2994.6944 - ], - [ - 2138.072, - 2958.1312 - ], - [ - 2118.92, - 2737.0112 - ] - ], - "enemy_ids": [ - 34602, - 34603, - 34604, - 34605, - 34606 - ] - }, - { - "id": 6633, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2157.224, - 2460.176 - ], - [ - 2178.1168, - 2665.6256 - ], - [ - 2343.5216, - 2665.6256 - ], - [ - 2345.264, - 2449.7296 - ] - ], - "enemy_ids": [ - 34597, - 34598, - 34599, - 34600, - 34601 - ] - }, - { - "id": 6634, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2101.5088, - 3086.9728 - ], - [ - 2115.4384, - 3355.1024 - ], - [ - 2327.8528, - 3316.7984 - ], - [ - 2338.2992, - 3090.4544 - ] - ], - "enemy_ids": [ - 34617, - 34618, - 34619, - 34620, - 34621, - 34622 - ] - }, - { - "id": 6635, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1904.7648, - 3071.3024 - ], - [ - 1901.2832, - 3320.28 - ], - [ - 1662.752, - 3322.0208 - ], - [ - 1664.4928, - 3059.1152 - ] - ], - "enemy_ids": [ - 34612, - 34613, - 34614, - 34615, - 34616, - 34623 - ] - }, - { - "id": 6636, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3135.0, - 3337.0 - ], - [ - 3162.0, - 3487.0 - ], - [ - 3314.0, - 3457.0 - ], - [ - 3265.0, - 3312 - ] - ], - "enemy_ids": [ - 34645, - 34646, - 34647 - ] - }, - { - "id": 6637, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2978.0, - 3261.0 - ], - [ - 2982.0, - 3413.0 - ], - [ - 3098.0, - 3405.0 - ], - [ - 3068.0, - 3243.0 - ] - ], - "enemy_ids": [ - 34648, - 34649, - 34650 - ] - }, - { - "id": 6638, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2842.0, - 3211.0 - ], - [ - 2845.0, - 3268.0 - ], - [ - 2975.0, - 3275.0 - ], - [ - 2964.0, - 3196.0 - ] - ], - "enemy_ids": [ - 34654, - 34655 - ] - }, - { - "id": 6639, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2724.0, - 3248 - ], - [ - 2736, - 3374.0 - ], - [ - 2875.0, - 3354.0 - ], - [ - 2808.0, - 3229.0 - ] - ], - "enemy_ids": [ - 34656, - 34657, - 34658 - ] - }, - { - "id": 6640, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2685.0, - 3055.0 - ], - [ - 2700.0, - 3153.0 - ], - [ - 2880, - 3128.0 - ], - [ - 2861.0, - 3058.0 - ] - ], - "enemy_ids": [ - 34659, - 34660 - ] - }, - { - "id": 6641, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3111.0, - 3165.0 - ], - [ - 3126.0, - 3301.0 - ], - [ - 3277.0, - 3294.0 - ], - [ - 3227.0, - 3159.0 - ] - ], - "enemy_ids": [ - 34651, - 34652, - 34653 - ] - }, - { - "id": 6642, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3320.0, - 3129.0 - ], - [ - 3336.0, - 3301.0 - ], - [ - 3491.0, - 3274.0 - ], - [ - 3496.0, - 3151.0 - ] - ], - "enemy_ids": [ - 34642, - 34643, - 34644 - ] - }, - { - "id": 6643, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2923.0, - 2959.0 - ], - [ - 2913.0, - 3125.0 - ], - [ - 3090.0, - 3121.0 - ], - [ - 3082.0, - 2987.0 - ] - ], - "enemy_ids": [ - 34661, - 34662, - 34663 - ] - }, - { - "id": 6644, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3210.0, - 2891.0 - ], - [ - 3226.0, - 3026.0 - ], - [ - 3368.0, - 3031.0 - ], - [ - 3344, - 2869.0 - ] - ], - "enemy_ids": [ - 34664, - 34665 - ] - }, - { - "id": 6645, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3087.0, - 2748.0 - ], - [ - 3108.0, - 2913.0 - ], - [ - 3254.0, - 2840.0 - ], - [ - 3213.0, - 2737.0 - ] - ], - "enemy_ids": [ - 34666, - 34667, - 34668 - ] - }, - { - "id": 6646, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 3299.0, - 2612.0 - ], - [ - 3320.0, - 2826.0 - ], - [ - 3457.0, - 2775.0 - ], - [ - 3449.0, - 2611.0 - ] - ], - "enemy_ids": [ - 34639, - 34640, - 34641 - ] - } - ], - "patrols": [ - { - "id": 1955, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 3071.6, - 1327.768 - ], - [ - 3064.7792, - 753.3104 - ], - [ - 2779.824, - 754.8272 - ], - [ - 2783.6128, - 1328.5248 - ], - [ - 2504.7216, - 1333.8304 - ], - [ - 2505.4448, - 1368.5056 - ], - [ - 2807.0, - 1361.0 - ], - [ - 2799.528, - 784.384 - ], - [ - 3045.0752, - 784.384 - ], - [ - 3048.5008, - 1359.5008 - ], - [ - 3372.5008, - 1356.0 - ], - [ - 3371.0, - 1323.0 - ], - [ - 3071.5008, - 1328 - ] - ] - }, - { - "id": 1956, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 2758.6048, - 1080.7056 - ], - [ - 2757.088, - 754.0688 - ], - [ - 2540.3408, - 756.3424 - ], - [ - 2539.5824, - 785.8992 - ], - [ - 2737.0, - 785.5008 - ], - [ - 2742.6896, - 1355.0512 - ], - [ - 3114.0, - 1350.5008 - ], - [ - 3110.2512, - 786.6576 - ], - [ - 3367.1648, - 785.1408 - ], - [ - 3363.3744, - 748.7632 - ], - [ - 3085.9984, - 753.3104 - ], - [ - 3093.0, - 1314.5008 - ], - [ - 2761.5008, - 1320.5008 - ], - [ - 2757.088, - 1069.3376 - ] - ] - }, - { - "id": 1957, - "color": "#abd473", - "weight": 3, - "vertices": [ - [ - 3059.0, - 1337.5008 - ], - [ - 2749.5104, - 1342.9248 - ], - [ - 2747.9936, - 1050.392 - ], - [ - 3098.1248, - 1049.6336 - ], - [ - 3096.6096, - 759.3744 - ], - [ - 3351.2496, - 758.616 - ], - [ - 3349.7344, - 1068.5808 - ], - [ - 2767.6992, - 1066.3072 - ], - [ - 2767.6992, - 759.3744 - ], - [ - 2509.2688, - 762.4048 - ], - [ - 2509.2688, - 1029.9296 - ], - [ - 3057.9584, - 1026.8976 - ], - [ - 3059.5008, - 1338.0 - ] - ] - }, - { - "id": 1958, - "color": "#a330c9", - "weight": 3, - "vertices": [ - [ - 3389.8096, - 1018.896 - ], - [ - 3390.9568, - 1085.52 - ], - [ - 2470.8496, - 1095.8576 - ], - [ - 2469.7008, - 1030.3824 - ], - [ - 3390.0, - 1019.0 - ] - ] - }, - { - "id": 1959, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 2615.5856, - 2227.3264 - ], - [ - 2576.5312, - 2185.9728 - ], - [ - 1872.3776, - 2192.8656 - ], - [ - 1871.0, - 2152.5008 - ], - [ - 2581.1248, - 2141.1744 - ], - [ - 2646.6016, - 2222.7312 - ], - [ - 2605.248, - 2226.1776 - ] - ] - }, - { - "id": 1960, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 1873.5264, - 1898.7984 - ], - [ - 1873.4256, - 1956.7904 - ], - [ - 2565.3504, - 1949.2112 - ], - [ - 2565.3504, - 1896.1616 - ], - [ - 1872.6672, - 1899.1936 - ] - ] - }, - { - "id": 1961, - "color": "#a330c9", - "weight": 3, - "vertices": [ - [ - 2239.9616, - 2339.8992 - ], - [ - 2226.5872, - 1093.5888 - ], - [ - 2202.0, - 1093.5008 - ], - [ - 2210.0, - 2339.5008 - ], - [ - 2240, - 2340.0 - ] - ] - }, - { - "id": 1962, - "color": "#abd473", - "weight": 3, - "vertices": [ - [ - 2057.0, - 1560.0 - ], - [ - 2104.416, - 1600.1376 - ], - [ - 2109.0096, - 1921.7728 - ], - [ - 2033.1968, - 2131.984 - ], - [ - 2546.4032, - 2128.0656 - ], - [ - 2501.8656, - 1916.0288 - ], - [ - 2549.5008, - 1557.5008 - ], - [ - 2056.5008, - 1559.5008 - ] - ] - }, - { - "id": 1963, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 2189.5008, - 1484.0 - ], - [ - 2078.048, - 1849.1744 - ], - [ - 2073.5008, - 2108.3616 - ], - [ - 2156.1072, - 2273.5744 - ], - [ - 2129.5824, - 2286.4592 - ], - [ - 2046.976, - 2114.424 - ], - [ - 2054.5536, - 1845.3856 - ], - [ - 2170.5056, - 1477.824 - ], - [ - 2162.928, - 1044.328 - ], - [ - 2702.0, - 1044.5008 - ], - [ - 2705.0, - 1084.0 - ], - [ - 2269.5008, - 1089.5008 - ], - [ - 2278.5008, - 1477.5008 - ], - [ - 2485.0176, - 1843.112 - ], - [ - 2296.248, - 2283.6128 - ], - [ - 2268.2704, - 2270.544 - ], - [ - 2459.2496, - 1843.8688 - ], - [ - 2257.0, - 1484.5008 - ], - [ - 2246.0, - 1076.5008 - ], - [ - 2686.0, - 1073.0 - ], - [ - 2685.0912, - 1056.4544 - ], - [ - 2180.3584, - 1058.728 - ], - [ - 2189.4528, - 1484.6448 - ] - ] - }, - { - "id": 1964, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 3387.512, - 1911.4336 - ], - [ - 3142.8384, - 1581.7584 - ], - [ - 3017.6304, - 1795.416 - ], - [ - 2846.4752, - 1917.1776 - ], - [ - 3024.5232, - 2009.0736 - ], - [ - 3036.0096, - 2185.9728 - ], - [ - 3386.8688, - 1911.3184 - ] - ] - }, - { - "id": 1971, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 2669.0, - 3404.0 - ], - [ - 2874.0, - 3393.0 - ], - [ - 2972.0, - 3333.0 - ], - [ - 2977.0, - 3253.0 - ], - [ - 3263.0, - 3062.0 - ], - [ - 3425.0, - 3048.0 - ], - [ - 3419.0, - 2896 - ], - [ - 3078.0, - 2817.0 - ], - [ - 3077.0, - 3117.0 - ], - [ - 2654.0, - 3132.0 - ], - [ - 2666.0, - 3395.0 - ] - ] - }, - { - "id": 1972, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 2890.0, - 3075.0 - ], - [ - 2894.0, - 2900.0 - ], - [ - 3095.0, - 2933.0 - ], - [ - 3180.0, - 3011.0 - ], - [ - 3398.0, - 3019.0 - ], - [ - 3381.0, - 2875.0 - ], - [ - 3162.0, - 2650.0 - ], - [ - 3268.0, - 2593.0 - ], - [ - 3431.0, - 2844.0 - ], - [ - 3322.0, - 3216 - ], - [ - 3263.0, - 3277.0 - ], - [ - 3087.0, - 3277.0 - ], - [ - 2869.2704, - 3291.512 - ], - [ - 2887.0, - 3087.0 - ] - ] - } - ], - "icons": [ - { - "id": 1300, - "type": "unknown", - "pos": [ - 3051.896, - 184.9168 - ], - "comment": "Brazier of the Herald: Requires Blood of Innocents." - }, - { - "id": 1301, - "type": "door", - "pos": [ - 3446.0944, - 1056.8032 - ], - "comment": "Iron Gate" - }, - { - "id": 1302, - "type": "door", - "pos": [ - 2431.7952, - 1068.2896 - ], - "comment": "Iron Gate: As soon as opened, patrols come in the previous room." - }, - { - "id": 1303, - "type": "door_locked", - "pos": [ - 2959.0464, - 2284.7616 - ], - "comment": null - }, - { - "id": 1304, - "type": "unknown", - "pos": [ - 2962.4928, - 2350.2368 - ], - "comment": "Old Treasure Chest" - }, - { - "id": 1305, - "type": "door_locked", - "pos": [ - 3310.5488, - 2280.1664 - ], - "comment": "Viewing Room Roor: Requires Viewing Room Key which drops from Rattlegore." - }, - { - "id": 1306, - "type": "door", - "pos": [ - 2639.7088, - 1919.4752 - ], - "comment": "Iron Gate" - }, - { - "id": 1307, - "type": "comment", - "pos": [ - 3515.2832, - 1908.2464 - ], - "comment": "When Rattlegore is defeated, many enemies in this room will despawn." - }, - { - "id": 1308, - "type": "door", - "pos": [ - 3543.1408, - 2815.36 - ], - "comment": "Iron Gate" - }, - { - "id": 1309, - "type": "door", - "pos": [ - 2944.2016, - 3449.1216 - ], - "comment": "Iron Gate" - } - ] - }, - { - "image": "maps/scholomance_floor3.webp", - "width": 6144, - "height": 4096, - "label": "scholomance_floor3", - "kg_floor_id": 225, - "enemies": [ - { - "id": 34534, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 1795.416, - 476.7104 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6621, - "patrol_id": null - }, - { - "id": 34535, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 1810.3488, - 590.4304 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6621, - "patrol_id": null - }, - { - "id": 34536, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 1860.8912, - 536.4416 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6621, - "patrol_id": null - }, - { - "id": 34537, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 1878.1216, - 485.8992 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6621, - "patrol_id": null - }, - { - "id": 34538, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 1934.408, - 510.0224 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6621, - "patrol_id": null - }, - { - "id": 34539, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 1920.624, - 588.1328 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6621, - "patrol_id": null - }, - { - "id": 34540, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2239.9616, - 1009.7056 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6622, - "patrol_id": null - }, - { - "id": 34541, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2313.4784, - 1007.408 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6622, - "patrol_id": null - }, - { - "id": 34542, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2375.5088, - 1007.408 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6622, - "patrol_id": null - }, - { - "id": 34543, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2265.2336, - 1078.6272 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6622, - "patrol_id": null - }, - { - "id": 34544, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2336.4528, - 1075.1824 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6622, - "patrol_id": null - }, - { - "id": 34545, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2377.8048, - 1103.8992 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6622, - "patrol_id": null - }, - { - "id": 34546, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2282.6688, - 435.768 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6624, - "patrol_id": null - }, - { - "id": 34547, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2377.4016, - 490.3344 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6624, - "patrol_id": null - }, - { - "id": 34548, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2223.5568, - 542.6272 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6624, - "patrol_id": null - }, - { - "id": 34549, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2207.6416, - 493.3664 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6624, - "patrol_id": null - }, - { - "id": 34550, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2278.88, - 507.7648 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6624, - "patrol_id": null - }, - { - "id": 34551, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2340.0, - 647.0 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1965 - }, - { - "id": 34552, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 1921.7728, - 763.8848 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1966 - }, - { - "id": 34553, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 1885.0144, - 862.672 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1967 - }, - { - "id": 34554, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2468.344, - 437.2848 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1968 - }, - { - "id": 34555, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2013.6688, - 961.4608 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1969 - }, - { - "id": 34556, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2291.6528, - 927.0 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6615, - "patrol_id": 1970 - }, - { - "id": 34557, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 1895.352, - 1046.464 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1967 - }, - { - "id": 34558, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2259.176, - 701.776 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6623, - "patrol_id": null - }, - { - "id": 34559, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2297.8256, - 704.0496 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6623, - "patrol_id": null - }, - { - "id": 34560, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2215.9776, - 772.2576 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6623, - "patrol_id": null - }, - { - "id": 34561, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2313.7408, - 776.8048 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6623, - "patrol_id": null - }, - { - "id": 34562, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2268.2704, - 798.7824 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6623, - "patrol_id": null - }, - { - "id": 34563, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2675.9968, - 410.7584 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6625, - "patrol_id": null - }, - { - "id": 34564, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2596.4224, - 428.9472 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6625, - "patrol_id": null - }, - { - "id": 34565, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2657.0512, - 477.4512 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6625, - "patrol_id": null - }, - { - "id": 34566, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2592.6336, - 516.8592 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6625, - "patrol_id": null - }, - { - "id": 34567, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2670.6928, - 526.712 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6625, - "patrol_id": null - }, - { - "id": 34568, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2578.992, - 694.9568 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6626, - "patrol_id": null - }, - { - "id": 34569, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2651.7456, - 696.472 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6626, - "patrol_id": null - }, - { - "id": 34570, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2735.1104, - 785.8992 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6626, - "patrol_id": null - }, - { - "id": 34571, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2644.9248, - 756.3424 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6626, - "patrol_id": null - }, - { - "id": 34572, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2604.7584, - 798.7824 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6626, - "patrol_id": null - }, - { - "id": 34573, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2671.4512, - 976.88 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6627, - "patrol_id": null - }, - { - "id": 34574, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2600.2112, - 1026.1408 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6627, - "patrol_id": null - }, - { - "id": 34575, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2658.5664, - 1103.4416 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6627, - "patrol_id": null - }, - { - "id": 34576, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2657.8096, - 1042.0544 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6627, - "patrol_id": null - }, - { - "id": 34577, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2731.3216, - 1001.888 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6627, - "patrol_id": null - }, - { - "id": 34578, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2750.2672, - 1110.2624 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6627, - "patrol_id": null - }, - { - "id": 34579, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3043.5584, - 1117.8416 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6628, - "patrol_id": null - }, - { - "id": 34580, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2962.4688, - 1010.9824 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6628, - "patrol_id": null - }, - { - "id": 34581, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3001.1184, - 963.2384 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6628, - "patrol_id": null - }, - { - "id": 34582, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 3035.9808, - 1007.952 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6628, - "patrol_id": null - }, - { - "id": 34583, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3147.3856, - 1081.464 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6628, - "patrol_id": null - }, - { - "id": 34584, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2987.4768, - 821.5184 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6629, - "patrol_id": null - }, - { - "id": 34585, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2941.248, - 782.1104 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6629, - "patrol_id": null - }, - { - "id": 34586, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2982.1728, - 733.6064 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6629, - "patrol_id": null - }, - { - "id": 34587, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 3023.8544, - 774.5312 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6629, - "patrol_id": null - }, - { - "id": 34588, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 3070.8416, - 814.6976 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6629, - "patrol_id": null - }, - { - "id": 34589, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 3123.1344, - 751.0368 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6629, - "patrol_id": null - }, - { - "id": 34590, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3161.0272, - 593.4032 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6630, - "patrol_id": null - }, - { - "id": 34591, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 3110.2496, - 481.24 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6630, - "patrol_id": null - }, - { - "id": 34592, - "npc_id": 10485, - "name": "Risen Aberration", - "pos": [ - 2979.1408, - 616.896 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6630, - "patrol_id": null - }, - { - "id": 34593, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 3029.9168, - 535.8064 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6630, - "patrol_id": null - }, - { - "id": 34594, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 2966.2576, - 472.1456 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6630, - "patrol_id": null - }, - { - "id": 34595, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 2926.0912, - 569.152 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6630, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34596, - "npc_id": 10503, - "name": "Jandice Barov", + "id": null, + "npc_id": null, + "name": "Vectus", "pos": [ - 3390.6576, - 594.1616 + 327, + 746 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34624, - "npc_id": 10488, - "name": "Risen Construct", + "id": null, + "npc_id": null, + "name": "Marduk Blackpool", "pos": [ - 1448.5968, - 2999.9168 + 391, + 928 ], - "classification": 2, + "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34625, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 1453.8192, - 2782.28 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34626, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 1464.2656, - 2554.1952 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34627, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 1462.5248, - 2266.9136 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34628, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 2441.024, - 2989.4704 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34629, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 2430.5776, - 2764.8688 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34630, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 2421.872, - 2540.2672 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34631, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 2411.4256, - 2266.9136 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34632, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 1810.7456, - 2423.6128 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34633, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 2094.544, - 2418.3888 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34634, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 2091.0624, - 2876.2992 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34635, - "npc_id": 10488, - "name": "Risen Construct", - "pos": [ - 1815.968, - 2858.888 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34636, - "npc_id": 11622, + "id": null, + "npc_id": null, "name": "Rattlegore", "pos": [ - 1947.5936, - 2649.5712 + 564, + 974 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34681, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4337.0832, - 1223.9936 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34682, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4418.9152, - 1227.4768 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34683, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4507.7104, - 1222.2528 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34684, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 4580.8368, - 1175.2432 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34685, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4507.7104, - 1128.2336 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34686, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4418.9152, - 1131.7152 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34687, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 4319.672, - 1147.3856 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34688, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4274.4032, - 1048.1424 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34689, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4361.4576, - 1028.9904 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34690, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4460.7008, - 1011.5792 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34691, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4559.944, - 1015.0624 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34692, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4539.0512, - 915.8192 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34693, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 4434.584, - 919.3008 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34694, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4356.2352, - 917.56 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34695, - "npc_id": 10901, + "id": null, + "npc_id": null, "name": "Lorekeeper Polkelt", "pos": [ - 4429.3616, - 541.4832 + 928, + 1174 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34696, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4272.0096, - 838.5504 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34697, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4371.9456, - 832.8064 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34698, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4458.0976, - 831.6576 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34699, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4552.2912, - 823.616 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34700, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4594.7936, - 754.6944 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34701, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4512.0864, - 723.68 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34702, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4406.4064, - 729.424 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34703, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4280.0496, - 748.952 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34704, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 4292.6864, - 649.0144 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34705, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4389.176, - 644.4192 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34706, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4489.1136, - 643.2704 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34707, - "npc_id": 10481, - "name": "Reanimated Corpse", - "pos": [ - 4587.9008, - 646.7168 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34708, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4543.1024, - 573.2 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34709, - "npc_id": 10480, - "name": "Unstable Corpse", - "pos": [ - 4322.552, - 569.7536 - ], - "classification": 1, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34710, - "npc_id": 11261, + "id": null, + "npc_id": null, "name": "Doctor Theolen Krastinov", "pos": [ - 5842.28, - 1871.2304 + 1328, + 1456 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34711, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 5557.4032, - 1732.2368 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34712, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 5556.2544, - 1863.1888 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34713, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 5548.2128, - 2011.3712 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34714, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 5710.1792, - 2012.52 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34715, - "npc_id": 10495, - "name": "Diseased Ghoul", - "pos": [ - 5706.7328, - 1873.5264 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34716, - "npc_id": 10472, - "name": "Scholomance Occultist", - "pos": [ - 4401.8128, - 2682.2112 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6652, - "patrol_id": null - }, - { - "id": 34717, - "npc_id": 10472, - "name": "Scholomance Occultist", - "pos": [ - 4362.7568, - 2643.1552 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6652, - "patrol_id": null - }, - { - "id": 34718, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 4359.3104, - 2704.0352 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6652, - "patrol_id": null - }, - { - "id": 34719, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 4525.872, - 2831.5408 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6651, - "patrol_id": null - }, - { - "id": 34720, - "npc_id": 10472, - "name": "Scholomance Occultist", - "pos": [ - 4568.3728, - 2797.08 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6651, - "patrol_id": null - }, - { - "id": 34721, - "npc_id": 10472, - "name": "Scholomance Occultist", - "pos": [ - 4578.712, - 2872.8944 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6651, - "patrol_id": null - }, - { - "id": 34722, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 4354.7152, - 2992.36 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6650, - "patrol_id": null - }, - { - "id": 34723, - "npc_id": 10472, - "name": "Scholomance Occultist", - "pos": [ - 4301.8752, - 3016.4816 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6650, - "patrol_id": null - }, - { - "id": 34724, - "npc_id": 10505, - "name": "Instructor Malicia", - "pos": [ - 4469.5856, - 3250.816 - ], - "classification": 3, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - } - ], - "packs": [ - { - "id": 6621, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 1750.616, - 428.464 - ], - [ - 1763.2512, - 614.5536 - ], - [ - 1965.4224, - 627.1888 - ], - [ - 1975.7616, - 426.1664 - ] - ], - "enemy_ids": [ - 34534, - 34535, - 34536, - 34537, - 34538, - 34539 - ] - }, - { - "id": 6622, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2180.2288, - 960.312 - ], - [ - 2195.1632, - 1137.2112 - ], - [ - 2424.9024, - 1141.8064 - ], - [ - 2420.3072, - 948.8256 - ] - ], - "enemy_ids": [ - 34540, - 34541, - 34542, - 34543, - 34544, - 34545 - ] - }, - { - "id": 6623, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2179.6, - 670.704 - ], - [ - 2184.1472, - 848.0432 - ], - [ - 2344.056, - 829.0976 - ], - [ - 2342.5392, - 679.7984 - ] - ], - "enemy_ids": [ - 34558, - 34559, - 34560, - 34561, - 34562 - ] - }, - { - "id": 6624, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2168.9904, - 374.3824 - ], - [ - 2182.632, - 572.9408 - ], - [ - 2402.4112, - 566.12 - ], - [ - 2404.6848, - 386.5072 - ] - ], - "enemy_ids": [ - 34546, - 34547, - 34548, - 34549, - 34550 - ] - }, - { - "id": 6625, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2555.4976, - 383.4768 - ], - [ - 2565.3504, - 553.9952 - ], - [ - 2712.3744, - 557.0256 - ], - [ - 2705.5536, - 375.8976 - ] - ], - "enemy_ids": [ - 34563, - 34564, - 34565, - 34566, - 34567 - ] - }, - { - "id": 6626, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2551.7088, - 651.0 - ], - [ - 2560.0448, - 850.3168 - ], - [ - 2784.3712, - 820.0032 - ], - [ - 2776.792, - 657.0624 - ] - ], - "enemy_ids": [ - 34568, - 34569, - 34570, - 34571, - 34572 - ] - }, - { - "id": 6627, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2565.3504, - 948.08 - ], - [ - 2562.3184, - 1130.7248 - ], - [ - 2792.7072, - 1136.7872 - ], - [ - 2763.9088, - 935.9552 - ] - ], - "enemy_ids": [ - 34573, - 34574, - 34575, - 34576, - 34577, - 34578 - ] - }, - { - "id": 6628, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2918.512, - 930.6496 - ], - [ - 2945.7952, - 1155.7344 - ], - [ - 3224.6864, - 1139.8192 - ], - [ - 3165.5744, - 925.3456 - ] - ], - "enemy_ids": [ - 34579, - 34580, - 34581, - 34582, - 34583 - ] - }, - { - "id": 6629, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2902.5968, - 702.5344 - ], - [ - 2911.6912, - 847.2848 - ], - [ - 3135.2592, - 849.5584 - ], - [ - 3161.784, - 694.1984 - ] - ], - "enemy_ids": [ - 34584, - 34585, - 34586, - 34587, - 34588, - 34589 - ] - }, - { - "id": 6630, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2899.5664, - 394.8448 - ], - [ - 2895.776, - 640.3904 - ], - [ - 3201.952, - 638.1168 - ], - [ - 3169.3632, - 410.7584 - ] - ], - "enemy_ids": [ - 34590, - 34591, - 34592, - 34593, - 34594, - 34595 - ] - }, - { - "id": 6650, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4281.1984, - 2938.3712 - ], - [ - 4262.8192, - 3068.1728 - ], - [ - 4390.3248, - 3060.1328 - ], - [ - 4398.3664, - 2949.8576 - ] - ], - "enemy_ids": [ - 34722, - 34723 - ] - }, - { - "id": 6651, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4489.1136, - 2748.8352 - ], - [ - 4510.9392, - 2880.936 - ], - [ - 4618.9168, - 2940.6672 - ], - [ - 4630.4032, - 2784.4448 - ] - ], - "enemy_ids": [ - 34719, - 34720, - 34721 - ] - }, - { - "id": 6652, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4315.6592, - 2588.0176 - ], - [ - 4329.4448, - 2754.5792 - ], - [ - 4464.9904, - 2762.6192 - ], - [ - 4460.3952, - 2608.6944 - ] - ], - "enemy_ids": [ - 34716, - 34717, - 34718 - ] - } - ], - "patrols": [ - { - "id": 1965, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 2384.5008, - 528.5008 - ], - [ - 2166.5008, - 531.5008 - ], - [ - 2416.8608, - 1109.6432 - ], - [ - 2169.8912, - 1105.048 - ], - [ - 2384.6976, - 528.4016 - ] - ] - }, - { - "id": 1966, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 1914.88, - 449.1408 - ], - [ - 1926.4752, - 1142.8496 - ], - [ - 2586.5696, - 1147.3968 - ], - [ - 2569.6384, - 450.2896 - ], - [ - 3007.2928, - 450.2896 - ], - [ - 3021.0768, - 1160.1856 - ], - [ - 2206.8832, - 1167.1024 - ], - [ - 2189.4192, - 438.8032 - ], - [ - 1913.7312, - 441.1008 - ] - ] - }, - { - "id": 1967, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 1872.3776, - 414.68 - ], - [ - 1899.9472, - 1182.0112 - ], - [ - 3058.984, - 1176.2672 - ], - [ - 3041.7536, - 427.3152 - ], - [ - 1872.5008, - 414.0 - ] - ] - }, - { - "id": 1968, - "color": "#abd473", - "weight": 3, - "vertices": [ - [ - 2309.1936, - 437.2848 - ], - [ - 2661.5984, - 436.5264 - ], - [ - 2759.3616, - 581.2768 - ], - [ - 2783.6128, - 1077.6752 - ], - [ - 2581.2656, - 1189.8368 - ], - [ - 2376.6432, - 1190.5952 - ], - [ - 2186.4208, - 949.5968 - ], - [ - 2165.9584, - 512.312 - ], - [ - 2314.4992, - 436.5264 - ] - ] - }, - { - "id": 1969, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 2018.2624, - 1122.2784 - ], - [ - 2006.776, - 454.8848 - ], - [ - 2905.0576, - 466.3712 - ], - [ - 2917.6944, - 1134.9136 - ], - [ - 2022.8576, - 1126.8736 - ] - ] - }, - { - "id": 1970, - "color": "#a330c9", - "weight": 3, - "vertices": [ - [ - 2246.8544, - 848.888 - ], - [ - 2420.3072, - 1153.2928 - ], - [ - 2535.1776, - 1150.9952 - ], - [ - 2671.872, - 796.048 - ], - [ - 2669.5744, - 549.0784 - ], - [ - 2528.2848, - 439.952 - ], - [ - 2321.52, - 442.2496 - ], - [ - 2259.4896, - 551.376 - ], - [ - 2251.448, - 855.7808 - ] - ] - } - ], - "icons": [ - { - "id": 1297, - "type": "unknown", - "pos": [ - 3452.0448, - 598.7088 - ], - "comment": "Tailoring pattern: Felcloth Bag." - } - ] - }, - { - "image": "maps/scholomance_floor4.webp", - "width": 6144, - "height": 4096, - "label": "scholomance_floor4", - "kg_floor_id": 226, - "enemies": [ - { - "id": 34671, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2366.1568, - 2841.4768 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6649, - "patrol_id": null - }, - { - "id": 34672, - "npc_id": 10500, - "name": "Spectral Teacher", - "pos": [ - 2320.888, - 2885.0048 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6649, - "patrol_id": null - }, - { - "id": 34673, - "npc_id": 10471, - "name": "Scholomance Acolyte", - "pos": [ - 2313.9232, - 2947.6848 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6649, - "patrol_id": null - }, - { - "id": 34674, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 2348.7456, - 3128.7584 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6647, - "patrol_id": null - }, - { - "id": 34675, - "npc_id": 10500, - "name": "Spectral Teacher", - "pos": [ - 2312.1824, - 3182.7328 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6647, - "patrol_id": null - }, - { - "id": 34676, - "npc_id": 10469, - "name": "Scholomance Adept", - "pos": [ - 2336.5584, - 3238.448 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6647, - "patrol_id": null - }, - { - "id": 34677, - "npc_id": 10477, - "name": "Scholomance Necromancer", - "pos": [ - 2636.0272, - 2881.5216 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6648, - "patrol_id": null - }, - { - "id": 34678, - "npc_id": 10500, - "name": "Spectral Teacher", - "pos": [ - 2583.7936, - 2912.8624 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6648, - "patrol_id": null - }, - { - "id": 34679, - "npc_id": 10470, - "name": "Scholomance Neophyte", - "pos": [ - 2601.2048, - 2972.0592 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6648, - "patrol_id": null - }, - { - "id": 34680, - "npc_id": 10508, + "id": null, + "npc_id": null, "name": "Ras Frostwhisper", "pos": [ - 2502.5008, - 3822.0 + 937, + 1729 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": 1973 + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34725, - "npc_id": 10507, - "name": "The Ravenian", - "pos": [ - 4155.9904, - 2103.2672 - ], - "classification": 3, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34726, - "npc_id": 10478, - "name": "Splintered Skeleton", - "pos": [ - 4028.4848, - 1774.7392 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34727, - "npc_id": 10478, - "name": "Splintered Skeleton", - "pos": [ - 4150.2464, - 1768.9952 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34728, - "npc_id": 10478, - "name": "Splintered Skeleton", - "pos": [ - 4273.1584, - 1767.8464 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34729, - "npc_id": 10478, - "name": "Splintered Skeleton", - "pos": [ - 4083.6224, - 1859.7424 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34730, - "npc_id": 10478, - "name": "Splintered Skeleton", - "pos": [ - 4213.4256, - 1855.1472 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": null - }, - { - "id": 34731, - "npc_id": 10486, - "name": "Risen Warrior", - "pos": [ - 4961.2288, - 1184.3088 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6653, - "patrol_id": null - }, - { - "id": 34732, - "npc_id": 10486, - "name": "Risen Warrior", - "pos": [ - 4963.5248, - 1265.8656 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6653, - "patrol_id": null - }, - { - "id": 34733, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 5126.64, - 1167.0768 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6654, - "patrol_id": null - }, - { - "id": 34734, - "npc_id": 10489, - "name": "Risen Guard", - "pos": [ - 5124.344, - 1257.824 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": 6654, - "patrol_id": null - }, - { - "id": 34735, - "npc_id": 10504, + "id": null, + "npc_id": null, "name": "Lord Alexei Barov", "pos": [ - 5190.968, - 1209.5792 + 1483, + 1702 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, - "pack_id": 6654, - "patrol_id": null - }, - { - "id": 34736, - "npc_id": 10491, - "name": "Risen Bonewarder", - "pos": [ - 4147.0, - 764.5008 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, "pack_id": null, - "patrol_id": 1974 + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34737, - "npc_id": 10491, - "name": "Risen Bonewarder", - "pos": [ - 4026.5008, - 578.0 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1975 - }, - { - "id": 34738, - "npc_id": 10491, - "name": "Risen Bonewarder", - "pos": [ - 4092.5008, - 513.0 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1976 - }, - { - "id": 34739, - "npc_id": 10491, - "name": "Risen Bonewarder", - "pos": [ - 4175.0, - 443.0 - ], - "classification": 2, - "skippable": false, - "required": false, - "kill_priority": null, - "pack_id": null, - "patrol_id": 1977 - }, - { - "id": 34740, - "npc_id": 10502, + "id": null, + "npc_id": null, "name": "Lady Illucia Barov", "pos": [ - 4124.0, - 258.5008 + 1856, + 1456 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true }, { - "id": 34741, - "npc_id": 1853, + "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, + "skippable": false, + "required": false, + "kill_priority": null, + "pack_id": null, + "patrol_id": null, + "ascension_pinned": true + }, + { + "id": null, + "npc_id": null, + "name": "Instructor Malicia", + "pos": [ + 391, + 1401 + ], + "classification": 3, + "skippable": false, + "required": false, + "kill_priority": null, + "pack_id": null, + "patrol_id": null, + "ascension_pinned": true + }, + { + "id": null, + "npc_id": null, "name": "Darkmaster Gandling", "pos": [ - 4136.4624, - 1226.8096 + 1529, + 1456 ], - "classification": 3, + "classification": 4, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_pinned": true } ], - "packs": [ - { - "id": 6647, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2252.5968, - 3060.1328 - ], - [ - 2266.3824, - 3277.2368 - ], - [ - 2396.184, - 3289.872 - ], - [ - 2405.3744, - 3071.6192 - ] - ], - "enemy_ids": [ - 34674, - 34675, - 34676 - ] - }, - { - "id": 6648, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2538.624, - 2820.0544 - ], - [ - 2548.9616, - 3025.672 - ], - [ - 2698.2928, - 3013.0352 - ], - [ - 2663.832, - 2817.7568 - ] - ], - "enemy_ids": [ - 34677, - 34678, - 34679 - ] - }, - { - "id": 6649, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 2264.0848, - 2795.9312 - ], - [ - 2268.68, - 2998.1024 - ], - [ - 2380.1024, - 2988.9136 - ], - [ - 2398.4816, - 2802.824 - ] - ], - "enemy_ids": [ - 34671, - 34672, - 34673 - ] - }, - { - "id": 6653, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 4899.1984, - 1110.792 - ], - [ - 4907.24, - 1326.7472 - ], - [ - 5016.3664, - 1326.7472 - ], - [ - 5019.8112, - 1107.3456 - ] - ], - "enemy_ids": [ - 34731, - 34732 - ] - }, - { - "id": 6654, - "color": "#5993D2", - "label": "Enemy pack", - "vertices": [ - [ - 5085.288, - 1111.9408 - ], - [ - 5088.7344, - 1316.408 - ], - [ - 5258.7408, - 1278.5008 - ], - [ - 5238.064, - 1098.1552 - ] - ], - "enemy_ids": [ - 34733, - 34734, - 34735 - ] - } - ], - "patrols": [ - { - "id": 1973, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 2504.0, - 3821.0 - ], - [ - 2604.0992, - 3819.4224 - ], - [ - 2596.0576, - 3680.4288 - ], - [ - 2405.3744, - 3682.7264 - ], - [ - 2406.5232, - 3821.72 - ], - [ - 2504.0, - 3821.0 - ] - ] - }, - { - "id": 1974, - "color": "#c41f3b", - "weight": 3, - "vertices": [ - [ - 4114.0, - 271.5008 - ], - [ - 4119.232, - 884.4976 - ], - [ - 4149.0992, - 883.3488 - ], - [ - 4139.5008, - 271.0 - ], - [ - 4113.5008, - 272 - ] - ] - }, - { - "id": 1975, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 3972.6928, - 579.7616 - ], - [ - 4287.2048, - 579.7616 - ], - [ - 4286.5008, - 552.0 - ], - [ - 3972.5008, - 554.5008 - ], - [ - 3972.5008, - 580.0 - ] - ] - }, - { - "id": 1976, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 3972.0, - 514.0 - ], - [ - 4285.5008, - 512.5008 - ], - [ - 4283.5008, - 482.0 - ], - [ - 3973.0, - 487.0 - ], - [ - 3972.0, - 513.5008 - ] - ] - }, - { - "id": 1977, - "color": "#003280", - "weight": 3, - "vertices": [ - [ - 3973.5008, - 418.5008 - ], - [ - 3973.5008, - 446.0 - ], - [ - 4280.0, - 443.0 - ], - [ - 4280.5008, - 414.5008 - ], - [ - 3973.0, - 418.0 - ] - ] - } - ], - "icons": [ - { - "id": 1296, - "type": "comment", - "pos": [ - 3797.3408, - 1340.648 - ], - "comment": "Darkmaster Gandling spawns when ALL enemies in all 6 rooms have been defeated." - } - ] + "packs": [], + "patrols": [], + "icons": [] } ], - "extras": [ - { - "name": "Blood Steward of Kirtonos", - "pos": [ - 5213.8, - 1854.2 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "The Deed to Tarren Mill", - "pos": [ - 1737.2, - 2367.6 - ], - "rare": false, - "source": "atlasloot" - }, - { - "name": "Torch Lever", - "pos": [ - 2964.2, - 2274.2 - ], - "rare": false, - "source": "atlasloot" - } - ] + "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." }, { "id": "shadowfang_keep", @@ -135675,47 +127351,52 @@ { "name": "Investigator Fezzen Brasstacks (Love is in the Air)", "pos": [ - 3373.4, - 2654.4 + 3523.7, + 2390.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 232 }, { "name": "Deathstalker Vincent", "pos": [ - 3558.3, - 2408.5 + 3612.8, + 2185.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 232 }, { "name": "Apothecary Trio (Love is in the Air)", "pos": [ - 2448.6, - 2039.6 + 2445.0, + 1958.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 227 }, { "name": "Fel Steed", "pos": [ - 2202.0, - 2326.5 + 2200.9, + 2283.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 227 }, { "name": "Deathsworn Captain (Rare)", "pos": [ - 3681.6, - 2121.6 + 3672.2, + 1946.7 ], "rare": true, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 232 } ] }, @@ -141403,15 +133084,16 @@ "npc_id": 10435, "name": "Magistrate Barthilas", "pos": [ - 3497.7872, - 615.7024 + 3498, + 3300 ], "classification": 3, "skippable": false, "required": false, "kill_priority": null, "pack_id": null, - "patrol_id": null + "patrol_id": null, + "ascension_override": true }, { "id": 33074, @@ -145174,128 +136856,142 @@ { "name": "Crusaders' Square Postbox", "pos": [ - 2415.9, - 1333.3 + 2433.2, + 1197.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "Market Row Postbox", "pos": [ - 3976.3, - 1034.2 + 4218.7, + 1113.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 235 }, { "name": "Festival Lane Postbox", "pos": [ - 4496.5, - 1076.9 + 4241.9, + 924.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "King's Square Postbox", "pos": [ - 3739.9, - 2102.2 + 3903.7, + 2170.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 235 }, { "name": "Fras Siabi's Postbox", "pos": [ - 3314.3, - 2785.7 + 3336.7, + 2846.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 235 }, { "name": "Atiesh (Summon)", "pos": [ - 4780.2, - 1461.4 + 4488.6, + 1333.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "Elder Farwhisper (Lunar Festival)", "pos": [ - 4449.2, - 564.3 + 4200.8, + 379.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "Malor the Zealous", "pos": [ - 2132.2, - 1632.3 + 2186.6, + 1515.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "Crimson Hammersmith (Summon)", "pos": [ - 1328.3, - 1888.6 + 1487.7, + 1788.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "Cannon Master Willey", "pos": [ - 950.0, - 2016.7 + 1158.9, + 1924.9 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "Archivist Galford", "pos": [ - 2037.6, - 2999.3 + 2104.4, + 2970.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 234 }, { "name": "Elders' Square Postbox", "pos": [ - 3881.8, - 3084.7 + 4092.7, + 3142.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 235 }, { "name": "Aurius", "pos": [ - 3929.1, - 2999.3 + 4155.7, + 3057.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 235 }, { "name": "Stonespine (Rare)", "pos": [ - 4023.6, - 2016.7 + 4281.7, + 2085.8 ], "rare": true, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 235 } ] }, @@ -150838,11 +142534,12 @@ { "name": "Defias Gunpowder", "pos": [ - 1572.7, - 2343.0 + 1091.3, + 2149.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 196 } ] }, @@ -158803,29 +150500,32 @@ { "name": "Remains of a Paladin", "pos": [ - 3262.4, - 2616.3 + 3254.6, + 2623.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 238 }, { "name": "The Discs of Norgannon (Lower)", "pos": [ - 2440.8, - 332.4 + 2437.2, + 344.9 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 238 }, { "name": "The Discs of Norgannon (Lower)", "pos": [ - 3072.8, - 1370.5 + 3066.0, + 1380.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 238 } ] }, @@ -164357,146 +156057,162 @@ { "name": "War Master Voone", "pos": [ - 3121.7, - 2058.6 + 3108.6, + 2048.1 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Mother Smolderweb", "pos": [ - 3859.8, - 2602.6 + 3870.3, + 2571.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Burning Felguard (Rare, Summon)", "pos": [ - 2568.2, - 2058.6 + 2537.3, + 2048.1 ], "rare": true, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Shadow Hunter Vosh'gajin", "pos": [ - 3367.7, - 2602.6 + 3362.5, + 2571.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Vaelan (Upper)", "pos": [ - 3121.7, - 1616.5 + 3151.7, + 1626.5 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 251 }, { "name": "Warosh (Wanders)", "pos": [ - 3675.3, - 1684.5 + 3679.9, + 1688.1 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Highlord Omokk", "pos": [ - 2322.2, - 2262.6 + 2283.3, + 2244.4 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Urok's Tribute Pile", "pos": [ - 2752.7, - 2092.6 + 2727.7, + 2080.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Bannok Grimaxe (Rare)", "pos": [ - 2752.7, - 2432.6 + 2727.7, + 2408.1 ], "rare": true, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Quartermaster Zigris ", "pos": [ - 3306.2, - 3112.7 + 3299.0, + 3062.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Darkstone Tablet", "pos": [ - 1891.6, - 1650.5 + 1917.7, + 1664.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 251 }, { "name": "Overlord Wyrmthalak", "pos": [ - 3490.8, - 2398.6 + 3489.4, + 2375.3 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Jed Runewatcher (Rare)", "pos": [ - 2260.7, - 1038.4 + 2287.9, + 988.6 ], "rare": true, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 251 }, { "name": "Goraluk Anvilcrack ", "pos": [ - 1953.1, - 1140.4 + 1979.4, + 1101.2 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 251 }, { "name": "Awbee", "pos": [ - 2937.2, - 1446.5 + 2918.1, + 1459.0 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 }, { "name": "Blackwing Lair", "pos": [ - 3306.2, - 970.4 + 3299.0, + 1000.8 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 252 } ] }, @@ -172276,7 +163992,8 @@ 1961.7 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 240 } ] }, @@ -179000,7 +170717,8 @@ 712.6 ], "rare": false, - "source": "atlasloot" + "source": "atlasloot", + "kg_floor_id": 241 } ] }, diff --git a/web/assets/maps/blackfathom_deeps_floor1.webp b/web/assets/maps/blackfathom_deeps_floor1.webp new file mode 100644 index 0000000..7aa3086 Binary files /dev/null and b/web/assets/maps/blackfathom_deeps_floor1.webp differ diff --git a/web/assets/maps/blackfathom_deeps_floor2.webp b/web/assets/maps/blackfathom_deeps_floor2.webp new file mode 100644 index 0000000..388049d Binary files /dev/null and b/web/assets/maps/blackfathom_deeps_floor2.webp differ diff --git a/web/assets/maps/blackfathom_deeps_floor3.webp b/web/assets/maps/blackfathom_deeps_floor3.webp new file mode 100644 index 0000000..48fbd2a Binary files /dev/null and b/web/assets/maps/blackfathom_deeps_floor3.webp differ diff --git a/web/assets/maps/blackrock_depths_floor1.webp b/web/assets/maps/blackrock_depths_floor1.webp new file mode 100644 index 0000000..378128b Binary files /dev/null and b/web/assets/maps/blackrock_depths_floor1.webp differ diff --git a/web/assets/maps/blackrock_depths_floor2.webp b/web/assets/maps/blackrock_depths_floor2.webp new file mode 100644 index 0000000..c7e131b Binary files /dev/null and b/web/assets/maps/blackrock_depths_floor2.webp differ diff --git a/web/assets/maps/blackwinglair_floor1.webp b/web/assets/maps/blackwinglair_floor1.webp new file mode 100644 index 0000000..fdd755b Binary files /dev/null and b/web/assets/maps/blackwinglair_floor1.webp differ diff --git a/web/assets/maps/blackwinglair_floor2.webp b/web/assets/maps/blackwinglair_floor2.webp new file mode 100644 index 0000000..95b7ece Binary files /dev/null and b/web/assets/maps/blackwinglair_floor2.webp differ diff --git a/web/assets/maps/blackwinglair_floor3.webp b/web/assets/maps/blackwinglair_floor3.webp new file mode 100644 index 0000000..72bf236 Binary files /dev/null and b/web/assets/maps/blackwinglair_floor3.webp differ diff --git a/web/assets/maps/blackwinglair_floor4.webp b/web/assets/maps/blackwinglair_floor4.webp new file mode 100644 index 0000000..f8f42b7 Binary files /dev/null and b/web/assets/maps/blackwinglair_floor4.webp differ diff --git a/web/assets/maps/deadmines_floor1.webp b/web/assets/maps/deadmines_floor1.webp new file mode 100644 index 0000000..a49e8f0 Binary files /dev/null and b/web/assets/maps/deadmines_floor1.webp differ diff --git a/web/assets/maps/deadmines_floor2.webp b/web/assets/maps/deadmines_floor2.webp new file mode 100644 index 0000000..c92c6c8 Binary files /dev/null and b/web/assets/maps/deadmines_floor2.webp differ diff --git a/web/assets/maps/dire_maul_east_floor1.webp b/web/assets/maps/dire_maul_east_floor1.webp new file mode 100644 index 0000000..e34dbc7 Binary files /dev/null and b/web/assets/maps/dire_maul_east_floor1.webp differ diff --git a/web/assets/maps/dire_maul_east_floor2.webp b/web/assets/maps/dire_maul_east_floor2.webp new file mode 100644 index 0000000..3ab1f41 Binary files /dev/null and b/web/assets/maps/dire_maul_east_floor2.webp differ diff --git a/web/assets/maps/dire_maul_north.webp b/web/assets/maps/dire_maul_north.webp new file mode 100644 index 0000000..d1bec77 Binary files /dev/null and b/web/assets/maps/dire_maul_north.webp differ diff --git a/web/assets/maps/dire_maul_west_floor1.webp b/web/assets/maps/dire_maul_west_floor1.webp new file mode 100644 index 0000000..3bb1c72 Binary files /dev/null and b/web/assets/maps/dire_maul_west_floor1.webp differ diff --git a/web/assets/maps/dire_maul_west_floor2.webp b/web/assets/maps/dire_maul_west_floor2.webp new file mode 100644 index 0000000..75002f4 Binary files /dev/null and b/web/assets/maps/dire_maul_west_floor2.webp differ diff --git a/web/assets/maps/dire_maul_west_floor3.webp b/web/assets/maps/dire_maul_west_floor3.webp new file mode 100644 index 0000000..e4c7834 Binary files /dev/null and b/web/assets/maps/dire_maul_west_floor3.webp differ diff --git a/web/assets/maps/gnomeregan_floor1.webp b/web/assets/maps/gnomeregan_floor1.webp new file mode 100644 index 0000000..87839d7 Binary files /dev/null and b/web/assets/maps/gnomeregan_floor1.webp differ diff --git a/web/assets/maps/gnomeregan_floor2.webp b/web/assets/maps/gnomeregan_floor2.webp new file mode 100644 index 0000000..d2133e3 Binary files /dev/null and b/web/assets/maps/gnomeregan_floor2.webp differ diff --git a/web/assets/maps/gnomeregan_floor3.webp b/web/assets/maps/gnomeregan_floor3.webp new file mode 100644 index 0000000..ab2179d Binary files /dev/null and b/web/assets/maps/gnomeregan_floor3.webp differ diff --git a/web/assets/maps/gnomeregan_floor4.webp b/web/assets/maps/gnomeregan_floor4.webp new file mode 100644 index 0000000..927f574 Binary files /dev/null and b/web/assets/maps/gnomeregan_floor4.webp differ diff --git a/web/assets/maps/lower_blackrock_spire_floor1.webp b/web/assets/maps/lower_blackrock_spire_floor1.webp new file mode 100644 index 0000000..48a851f Binary files /dev/null and b/web/assets/maps/lower_blackrock_spire_floor1.webp differ diff --git a/web/assets/maps/lower_blackrock_spire_floor2.webp b/web/assets/maps/lower_blackrock_spire_floor2.webp new file mode 100644 index 0000000..d1a0975 Binary files /dev/null and b/web/assets/maps/lower_blackrock_spire_floor2.webp differ diff --git a/web/assets/maps/lower_blackrock_spire_floor3.webp b/web/assets/maps/lower_blackrock_spire_floor3.webp new file mode 100644 index 0000000..2faec7c Binary files /dev/null and b/web/assets/maps/lower_blackrock_spire_floor3.webp differ diff --git a/web/assets/maps/lower_blackrock_spire_floor4.webp b/web/assets/maps/lower_blackrock_spire_floor4.webp new file mode 100644 index 0000000..9087c5b Binary files /dev/null and b/web/assets/maps/lower_blackrock_spire_floor4.webp differ diff --git a/web/assets/maps/lower_blackrock_spire_floor5.webp b/web/assets/maps/lower_blackrock_spire_floor5.webp new file mode 100644 index 0000000..0aaad4b Binary files /dev/null and b/web/assets/maps/lower_blackrock_spire_floor5.webp differ diff --git a/web/assets/maps/lower_blackrock_spire_floor6.webp b/web/assets/maps/lower_blackrock_spire_floor6.webp new file mode 100644 index 0000000..4e90245 Binary files /dev/null and b/web/assets/maps/lower_blackrock_spire_floor6.webp differ diff --git a/web/assets/maps/lower_blackrock_spire_floor7.webp b/web/assets/maps/lower_blackrock_spire_floor7.webp new file mode 100644 index 0000000..ae25f6b Binary files /dev/null and b/web/assets/maps/lower_blackrock_spire_floor7.webp differ diff --git a/web/assets/maps/mageclassshrine_floor1.webp b/web/assets/maps/mageclassshrine_floor1.webp new file mode 100644 index 0000000..8ba7ea2 Binary files /dev/null and b/web/assets/maps/mageclassshrine_floor1.webp differ diff --git a/web/assets/maps/mageclassshrine_floor2.webp b/web/assets/maps/mageclassshrine_floor2.webp new file mode 100644 index 0000000..d8a8168 Binary files /dev/null and b/web/assets/maps/mageclassshrine_floor2.webp differ diff --git a/web/assets/maps/maraudon_floor1.webp b/web/assets/maps/maraudon_floor1.webp new file mode 100644 index 0000000..e3043be Binary files /dev/null and b/web/assets/maps/maraudon_floor1.webp differ diff --git a/web/assets/maps/maraudon_floor2.webp b/web/assets/maps/maraudon_floor2.webp new file mode 100644 index 0000000..a96f21a Binary files /dev/null and b/web/assets/maps/maraudon_floor2.webp differ diff --git a/web/assets/maps/moltencore.webp b/web/assets/maps/moltencore.webp new file mode 100644 index 0000000..86c2d9e Binary files /dev/null and b/web/assets/maps/moltencore.webp differ diff --git a/web/assets/maps/naxxramas_classic_floor1.webp b/web/assets/maps/naxxramas_classic_floor1.webp new file mode 100644 index 0000000..b28b67a Binary files /dev/null and b/web/assets/maps/naxxramas_classic_floor1.webp differ diff --git a/web/assets/maps/naxxramas_classic_floor2.webp b/web/assets/maps/naxxramas_classic_floor2.webp new file mode 100644 index 0000000..f4f40a2 Binary files /dev/null and b/web/assets/maps/naxxramas_classic_floor2.webp differ diff --git a/web/assets/maps/naxxramas_classic_floor3.webp b/web/assets/maps/naxxramas_classic_floor3.webp new file mode 100644 index 0000000..93940dd Binary files /dev/null and b/web/assets/maps/naxxramas_classic_floor3.webp differ diff --git a/web/assets/maps/naxxramas_classic_floor4.webp b/web/assets/maps/naxxramas_classic_floor4.webp new file mode 100644 index 0000000..b4540dc Binary files /dev/null and b/web/assets/maps/naxxramas_classic_floor4.webp differ diff --git a/web/assets/maps/naxxramas_classic_floor5.webp b/web/assets/maps/naxxramas_classic_floor5.webp new file mode 100644 index 0000000..6b6c242 Binary files /dev/null and b/web/assets/maps/naxxramas_classic_floor5.webp differ diff --git a/web/assets/maps/naxxramas_classic_floor6.webp b/web/assets/maps/naxxramas_classic_floor6.webp new file mode 100644 index 0000000..18d42ed Binary files /dev/null and b/web/assets/maps/naxxramas_classic_floor6.webp differ diff --git a/web/assets/maps/ragefire_chasm.webp b/web/assets/maps/ragefire_chasm.webp new file mode 100644 index 0000000..a326fb2 Binary files /dev/null and b/web/assets/maps/ragefire_chasm.webp differ diff --git a/web/assets/maps/razorfen_downs.webp b/web/assets/maps/razorfen_downs.webp new file mode 100644 index 0000000..4aae3e8 Binary files /dev/null and b/web/assets/maps/razorfen_downs.webp differ diff --git a/web/assets/maps/razorfen_kraul.webp b/web/assets/maps/razorfen_kraul.webp new file mode 100644 index 0000000..64ee3c1 Binary files /dev/null and b/web/assets/maps/razorfen_kraul.webp differ diff --git a/web/assets/maps/scarlet_monastery_armory.webp b/web/assets/maps/scarlet_monastery_armory.webp new file mode 100644 index 0000000..883947f Binary files /dev/null and b/web/assets/maps/scarlet_monastery_armory.webp differ diff --git a/web/assets/maps/scarlet_monastery_cathedral.webp b/web/assets/maps/scarlet_monastery_cathedral.webp new file mode 100644 index 0000000..f857119 Binary files /dev/null and b/web/assets/maps/scarlet_monastery_cathedral.webp differ diff --git a/web/assets/maps/scarlet_monastery_graveyard.webp b/web/assets/maps/scarlet_monastery_graveyard.webp new file mode 100644 index 0000000..62e9e7e Binary files /dev/null and b/web/assets/maps/scarlet_monastery_graveyard.webp differ diff --git a/web/assets/maps/scarlet_monastery_library.webp b/web/assets/maps/scarlet_monastery_library.webp new file mode 100644 index 0000000..0f63319 Binary files /dev/null and b/web/assets/maps/scarlet_monastery_library.webp differ diff --git a/web/assets/maps/scholomance.webp b/web/assets/maps/scholomance.webp new file mode 100644 index 0000000..89f7d1a Binary files /dev/null and b/web/assets/maps/scholomance.webp differ diff --git a/web/assets/maps/shadowfang_keep_floor1.webp b/web/assets/maps/shadowfang_keep_floor1.webp new file mode 100644 index 0000000..1b2288b Binary files /dev/null and b/web/assets/maps/shadowfang_keep_floor1.webp differ diff --git a/web/assets/maps/shadowfang_keep_floor2.webp b/web/assets/maps/shadowfang_keep_floor2.webp new file mode 100644 index 0000000..7e5b0ac Binary files /dev/null and b/web/assets/maps/shadowfang_keep_floor2.webp differ diff --git a/web/assets/maps/shadowfang_keep_floor3.webp b/web/assets/maps/shadowfang_keep_floor3.webp new file mode 100644 index 0000000..46000c8 Binary files /dev/null and b/web/assets/maps/shadowfang_keep_floor3.webp differ diff --git a/web/assets/maps/shadowfang_keep_floor4.webp b/web/assets/maps/shadowfang_keep_floor4.webp new file mode 100644 index 0000000..848035a Binary files /dev/null and b/web/assets/maps/shadowfang_keep_floor4.webp differ diff --git a/web/assets/maps/shadowfang_keep_floor5.webp b/web/assets/maps/shadowfang_keep_floor5.webp new file mode 100644 index 0000000..e8f64d9 Binary files /dev/null and b/web/assets/maps/shadowfang_keep_floor5.webp differ diff --git a/web/assets/maps/shadowfang_keep_floor6.webp b/web/assets/maps/shadowfang_keep_floor6.webp new file mode 100644 index 0000000..3ef775d Binary files /dev/null and b/web/assets/maps/shadowfang_keep_floor6.webp differ diff --git a/web/assets/maps/shadowfang_keep_floor7.webp b/web/assets/maps/shadowfang_keep_floor7.webp new file mode 100644 index 0000000..84db82d Binary files /dev/null and b/web/assets/maps/shadowfang_keep_floor7.webp differ diff --git a/web/assets/maps/stratholme_floor1.webp b/web/assets/maps/stratholme_floor1.webp new file mode 100644 index 0000000..eb72e03 Binary files /dev/null and b/web/assets/maps/stratholme_floor1.webp differ diff --git a/web/assets/maps/stratholme_floor2.webp b/web/assets/maps/stratholme_floor2.webp new file mode 100644 index 0000000..b121b55 Binary files /dev/null and b/web/assets/maps/stratholme_floor2.webp differ diff --git a/web/assets/maps/the_stockade.webp b/web/assets/maps/the_stockade.webp new file mode 100644 index 0000000..a4867b4 Binary files /dev/null and b/web/assets/maps/the_stockade.webp differ diff --git a/web/assets/maps/thebeyond.webp b/web/assets/maps/thebeyond.webp new file mode 100644 index 0000000..dbef29c Binary files /dev/null and b/web/assets/maps/thebeyond.webp differ diff --git a/web/assets/maps/uldaman_floor1.webp b/web/assets/maps/uldaman_floor1.webp new file mode 100644 index 0000000..e0652c6 Binary files /dev/null and b/web/assets/maps/uldaman_floor1.webp differ diff --git a/web/assets/maps/uldaman_floor2.webp b/web/assets/maps/uldaman_floor2.webp new file mode 100644 index 0000000..9101491 Binary files /dev/null and b/web/assets/maps/uldaman_floor2.webp differ diff --git a/web/assets/maps/upper_blackrock_spire_floor1.webp b/web/assets/maps/upper_blackrock_spire_floor1.webp new file mode 100644 index 0000000..3b32734 Binary files /dev/null and b/web/assets/maps/upper_blackrock_spire_floor1.webp differ diff --git a/web/assets/maps/upper_blackrock_spire_floor2.webp b/web/assets/maps/upper_blackrock_spire_floor2.webp new file mode 100644 index 0000000..76a1372 Binary files /dev/null and b/web/assets/maps/upper_blackrock_spire_floor2.webp differ diff --git a/web/assets/maps/upper_blackrock_spire_floor3.webp b/web/assets/maps/upper_blackrock_spire_floor3.webp new file mode 100644 index 0000000..2ed1a0e Binary files /dev/null and b/web/assets/maps/upper_blackrock_spire_floor3.webp differ diff --git a/web/assets/maps/wailing_caverns.webp b/web/assets/maps/wailing_caverns.webp new file mode 100644 index 0000000..9d1cf6d Binary files /dev/null and b/web/assets/maps/wailing_caverns.webp differ diff --git a/web/assets/maps/zul_farrak.webp b/web/assets/maps/zul_farrak.webp new file mode 100644 index 0000000..8054992 Binary files /dev/null and b/web/assets/maps/zul_farrak.webp differ diff --git a/web/assets/maps/zulgurub.webp b/web/assets/maps/zulgurub.webp new file mode 100644 index 0000000..0128f04 Binary files /dev/null and b/web/assets/maps/zulgurub.webp differ diff --git a/web/index.html b/web/index.html index 2f8ea17..d1a6448 100644 --- a/web/index.html +++ b/web/index.html @@ -33,6 +33,12 @@ + + + + + + diff --git a/web/style.css b/web/style.css index 9661b57..1b5380f 100644 --- a/web/style.css +++ b/web/style.css @@ -194,6 +194,26 @@ body { border-color: var(--accent); font-weight: 600; } +.toolbar-sep { + width: 1px; + height: 22px; + background: var(--line); + align-self: center; + margin: 0 4px; +} +.layer-toggle { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 12px; + color: var(--text-dim); + cursor: pointer; + padding: 4px 6px; + user-select: none; + white-space: nowrap; +} +.layer-toggle:hover { color: var(--text); } +.layer-toggle input { margin: 0; cursor: pointer; } /* --- canvas / overlay ----------------------------------------------------- */