v0.41.0 — Supporter Bundle
Focused play. Your loadout follows your zone.
Added — 🎯 Four supporter-tier features (free tier byte-identical to v0.40.1)
- 🎯 Focused Radar Filter — per-zone whitelist / blacklist. Blacklist entities skip the render walk entirely (real FPS win in town: a hideout with 40 decorative NPCs / vendor pets / critters now costs zero draw time). Configurable via a new Radar Filter tab in Settings with per-preset match pattern (glob:
*_town,T17_*,Delirium_*, or exact zone code) + whitelist chips + blacklist chips + add-from-current-zone helper. First-match-wins on zone entry; caps: 20 presets, 50 patterns per list. - 🧩 Zone-Aware Overlay Layouts — save up to 10 dashboard-panel loadouts and let them auto-swap on zone entry. Town preset hides drop timeline + boss HP + XP chart; boss-arena preset hides everything except vitals + boss HP; maps get your full loadout. New Layouts tab with capture-current-layout helper (snapshots visible panels into a draft preset). Same wildcard-glob matcher as Radar Filter.
- 📍 Custom Auto-Nav Destinations — name any grid position ("chest room at 145,220 in T17-Necropolis"). New Nav tab with per-row inline editor + capture-current-position helper (pre-fills zoneCode + coords from
/api/state). Overlay draws cyan diamond markers with→ <name>labels; floating chip strip in top-right shows saved destinations for the current zone. Cap: 50 destinations. - 📊 Session Stat Widget — floating dashboard-chrome widget with 6 configurable chips (drops / XP gained / bosses killed / deaths / time-in-zone / avg-map-clear-time). New Widget tab picks which chips render + x/y position. Refreshes every 2s; hidden entirely for non-supporters.
Under the hood
- New
POE2Radar.Core.Support.SupporterGatestatic — canonical replacement for the scattereds.isSupporterpredicate. Existing v0.35 palette gate refactored to use it behind the scenes (user-visible behavior unchanged). JS mirrorwindow.__supporterGate.isSupporter()for the 4 UI features + retrofit. - New
POE2Radar.Core.Zones.ZoneCodeMatcherstatic — wildcard-glob matcher (*_town,T17_*,*) reused by A + B for zone-code matching. Case-sensitive, null-safe. - New
window.__supporterHintJS component — inline card ("Supporter feature — Save your Ko-fi code in Settings to unlock this.") that renders in the editor's place for non-supporters. Retrofitted into the v0.35 palette-select gate (no more silent-revert UX). - New
window.__panelInventoryJS helper + 12 stabledata-panel-idhandles on canonical dashboard panels — foundation for Layouts auto-swap (B3) and future Layout Designer work. - 4 new
POE2Radar.Core.*stores (RadarFilters / OverlayLayouts / NavDestinations / SessionWidget) — all whole-fileconfig/*.jsonenvelopes with atomic.tmp+File.Movewrites, mirroring v0.39RulesFileStorepattern. - 4 new HTTP endpoint families in
ApiServer.cs—/api/radar-filters,/api/overlay-layouts,/api/nav-destinations(per-id CRUD +?zone=filter),/api/session-widget(single-record + bundledallowedChipsmetadata). Loopback-Host-gated writes; standard 400/403/405 semantics. - Renderer wire-ups: blacklist early-continue in
OverlayRenderer.csentity draw loop (saves bothRules.TryMatchcost andEntityViewallocation for skipped entities) + Nav Destination markers drawn after the tile-landmark loop. - LayoutAutoSwap IIFE polls
/api/stateevery 2s; on zone change, GETs/api/overlay-layouts, first-matching preset applies viawindow.__panelInventory.get(slug). - SessionMetricProviders — 6 pure formatters (CultureInfo.InvariantCulture, thousand-separators, mm:ss / Hh Mm time buckets, em-dash fallback for missing data).
Tests
- ~230 new xUnit facts across 15 new test files. Full suite grows from 1112 → 1370 (+258 tests, all green, 2 pre-existing SSE skips).
Upgrade
Fully additive — no config migration. Free-tier experience is byte-identical to v0.40.1. Every supporter feature is dormant until a valid Ko-fi code is present in Settings; when it is, the new tabs light up. Existing v0.35 palette gate keeps working exactly as before (retrofit is behind-the-scenes).
Full Changelog: v0.40.1...v0.41.0