Files
florian.berthold e11dc1eed5 per-floor extras + Ascension overrides + layer toggles
- atlasloot_extras: fit one transform per (kg_dungeon, floor_id) instead of mixing all kg bosses into one fit. Each AL extra is assigned to whichever floor's anchors it's nearest to (in AL coord space). Strat's Stonespine now correctly lands on floor 235 (Undead) instead of being hidden because the mixed-floor fit pushed it off.
- new data/ascension_overrides.json: per-name position/floor patches for places where Ascension diverges from retail. Seeded with Magistrate Barthilas → moved to the southern courtyard (3498, 3300 on Undead Side) per Ascension spawns.
- frontend renders extras only on their assigned floor; previously hard-coded to floor 0.
- new layer-toggle checkboxes (Enemies / Packs / Patrols / Icons) in the toolbar — flip patrols off if mob routes are noise for your route.
2026-04-25 23:26:24 +02:00

74 lines
3.0 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Ascension M+ Route Planner</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<aside class="sidebar">
<header class="brand">
<h1>M+ Routes</h1>
<p class="sub">Ascension dungeon planner</p>
</header>
<div class="filters">
<input id="search" type="search" placeholder="Search dungeons…" autocomplete="off">
<select id="expansion-filter">
<option value="">All expansions</option>
</select>
</div>
<ul id="dungeon-list" class="dungeon-list"></ul>
</aside>
<main class="viewer">
<header class="viewer-header">
<div class="title-block">
<h2 id="dungeon-name">Pick a dungeon</h2>
<p id="dungeon-meta" class="meta"></p>
</div>
<div id="floor-tabs" class="floor-tabs"></div>
<div class="toolbar">
<button id="tool-route" class="tool active" title="Click map to add waypoints">Route</button>
<button id="tool-pull" class="tool" title="Click map to drop pull markers">Pull</button>
<button id="tool-note" class="tool" title="Drop an (i) info icon — text shows on hover">Note</button>
<button id="tool-text" class="tool" title="Drop a freetext label — text always visible on the map">Text</button>
<span class="toolbar-sep"></span>
<label class="layer-toggle" title="Show enemy/trash spawns"><input type="checkbox" id="layer-enemies" checked> Enemies</label>
<label class="layer-toggle" title="Show enemy pack polygons"><input type="checkbox" id="layer-packs" checked> Packs</label>
<label class="layer-toggle" title="Show enemy patrol routes"><input type="checkbox" id="layer-patrols" checked> Patrols</label>
<label class="layer-toggle" title="Show map icons (start, doors, comments)"><input type="checkbox" id="layer-icons" checked> Icons</label>
<span class="toolbar-sep"></span>
<button id="undo" title="Undo (⌘Z)">Undo</button>
<button id="clear" title="Clear current floor">Clear</button>
<button id="share">Share</button>
<button id="export" title="Download this dungeon's routes/pulls/notes/labels as JSON">Export</button>
<button id="import" title="Load a previously exported route file">Import</button>
</div>
</header>
<section class="canvas-wrap">
<div id="canvas-host" class="canvas-host">
<div id="canvas-stage" class="canvas-stage">
<img id="map-img" alt="">
<svg id="overlay" xmlns="http://www.w3.org/2000/svg"></svg>
</div>
<div class="zoom-controls">
<button id="zoom-in" title="Zoom in">+</button>
<button id="zoom-out" title="Zoom out"></button>
<button id="zoom-reset" title="Fit to screen"></button>
</div>
</div>
<aside class="info-pane">
<h3>Bosses</h3>
<ul id="boss-list" class="boss-list"></ul>
<h3>Waypoints</h3>
<ol id="waypoint-list" class="waypoint-list"></ol>
</aside>
</section>
</main>
<script src="app.js" type="module"></script>
</body>
</html>