Emberveil
A high fantasy party RPG. Build a party of up to 8 heroes and companions, journey across four acts — goblin frontier, volcanic wastelands, the Shattered Hell, and the Cosmic Void — in cinematic auto-play combat against hordes of enemies. 14 playable classes, procedurally generated equipment, and a story-driven journey to stop the corruption tearing worlds apart.
Prompt History
We are creating a game involving a party of 1-4 heroes and up to 8 characters including pets. The game involves combat against hordes of enemies from just one big enemy to 50 small enemies. The combat takes place a round at a time. All characters in combat roll a turn order and auto-plays using the most appropriate skills available... [full prompt as described in design session April 2026]
Changelog (412 milestones)
M4262026-05-06M426 — Benchmark AI fix + Ranger nerf + role reclassification + companion parity. Sim AI now picks zone-type damage skills (Paladin Consecra
M426 — Benchmark AI fix + Ranger nerf + role reclassification + companion parity. Sim AI now picks zone-type damage skills (Paladin Consecration etc) and target=all_enemies; previously they were filtered out. Benchmark dummies set to dmg=[0,0] hit=0 so the lead survives the full sim window — Paladin / Monk / Tactician readings no longer truncated by mid-fight KO. Ranger Aimed Shot 1.5/2.2/3.0→1.4/1.9/2.4 + executeChance 0.3→0.15. Class roles updated: Mage/Warlock/Sorcerer/Oracle→aoe_dps; Demon Hunter/Scavenger/Swashbuckler→single_dps; Dragon Knight→tank; Paladin/Tactician/Tinker/Shaman→support. Companions now band 883-970 at L20 (vs 7-9 in M423), Healers 2011/2102 (parity).
M4252026-05-06M425 — Companion sim wiring + benchmark improvements. Companions now use _effectiveLevel scaling so a L20 Frost Wyrmling reads as 300 dmg vs
M425 — Companion sim wiring + benchmark improvements. Companions now use _effectiveLevel scaling so a L20 Frost Wyrmling reads as 300 dmg vs the prior 8 dmg. Benchmark dummies now have armor=0 so the chart measures raw class output instead of armor penetration. Re-snapshot generated; Todo List updated with current outliers (Ranger +193%, Paladin -79% suggesting AI skill-priority bug). Todo List link added to docs nav menu (shared/nav-header.js).
M4242026-05-06M424 — Extreme-class rebalance pass. Rogue NERFED: Backstab L10 2.50→2.10 + condition bonus 1.2→0.7, Shadow Step L18 2.53→1.9, Death Mark L2
M424 — Extreme-class rebalance pass. Rogue NERFED: Backstab L10 2.50→2.10 + condition bonus 1.2→0.7, Shadow Step L18 2.53→1.9, Death Mark L20 dmgAmp 1.2→0.7. Monk BUFFED: Palm Strike 1.3→1.6, Flurry 0.6→0.8 (×3=2.4), Shadow Step 2.0→2.4. Paladin BUFFED: Holy Strike 1.1→1.5/2.0/2.6, Consecration 0.6→1.0/1.4/1.8. Shadow Dancer Shadow Strike 1.5→1.9 + Assassinate 2.2→2.6. Witch Hunter Silver Bolt 1.6→1.8 + Purge Strike 2.0→2.3. Shaman Spirit Bolt 1.5→1.0 (was hugely overperforming). Demon Hunter Demon Bolt 0.88→1.4 base. Todo List added to docs nav menu.
M4232026-05-06M423 — Todo List page (/assets/todo.html) with auto-generated skill audit findings from M422 baseline (Rogue +243%, Monk -89%, Paladin -95%
M423 — Todo List page (/assets/todo.html) with auto-generated skill audit findings from M422 baseline (Rogue +243%, Monk -89%, Paladin -95% etc); companion entries added to Damage Report snapshot (role=companion in graph filter); workflow memory entries for damage-report and todo pages. Companion accuracy flagged as critical TODO — synthetic companions in the harness use basic attacks only; needs class-skill wiring to match in-game numbers.
M4222026-05-06M422 — Damage Report tool page (/assets/damage-report.html): per-class damage/healing/mitigation graphed across levels (1,3,5,7,10,15,20,25,
M422 — Damage Report tool page (/assets/damage-report.html): per-class damage/healing/mitigation graphed across levels (1,3,5,7,10,15,20,25,30) × {single,AoE} × {solo,group}. Multi-class overlay (per-color), milestone comparison (solid vs dotted), role filter. Snapshot generator at scripts/damage-report-snapshot.mjs (~1080 sims/run). Baseline M422 snapshot included.M4212026-05-06M421 — DPS rebalance pass: Stormcaller AoE pulled in (Static Field 0.5×→0.4×, Thunder Ring 1.8×→1.4×, Tempest 2.2×→1.6×); Witch Hunter singl
M421 — DPS rebalance pass: Stormcaller AoE pulled in (Static Field 0.5×→0.4×, Thunder Ring 1.8×→1.4×, Tempest 2.2×→1.6×); Witch Hunter single-target up (Silver Bolt 1.4×→1.6×, Purge Strike 1.7×→2.0×); Runesmith Rune Hammer 1.4×→1.6×; Priest Shadow Bolt 1.0×→1.3× so priests have meaningful damage between heals. Goal: AoE/single-target DPS within ±25% of role-mate median.
M4202026-05-06M420 — Healing rebalance: Dispel Curse heal nerfed 0.5×→0.20× Damage, Restorative Purge talent now adds 0.30× (max 0.50× total) instead of t
M420 — Healing rebalance: Dispel Curse heal nerfed 0.5×→0.20× Damage, Restorative Purge talent now adds 0.30× (max 0.50× total) instead of taking it to 1.5×; Mend buffed 200%→350% base, Steady Hand to 410%, Greater Mend 430%, Sanctuary Mend 590%. Priest is now the dominant healer; Witch Hunter cleanse is utility, not primary heal.
M4192026-05-06M419 — Combat Log save-trace and Combat Report buttons converted to floppy-disk download icons; new Combat Report download bundles meter dat
M419 — Combat Log save-trace and Combat Report buttons converted to floppy-disk download icons; new Combat Report download bundles meter data + log + party/enemy snapshots into one JSON
M4182026-05-06M418 — Hit chance soft-cap (knee 95, falloff 0.2, ceil 99); per-target min miss floor (3% normal, 4% champion, 6% boss); max level raised 20
M418 — Hit chance soft-cap (knee 95, falloff 0.2, ceil 99); per-target min miss floor (3% normal, 4% champion, 6% boss); max level raised 20→30 with extended XP curve to 38160
M4172026-05-06M412 — Auto-stat persistence fix + Auto Inventory/Passives/Spell-Talents checkboxes on New Character & Hire Custom + tavern hire post-hire a
M412 — Auto-stat persistence fix + Auto Inventory/Passives/Spell-Talents checkboxes on New Character & Hire Custom + tavern hire post-hire auto-options popup + tavern hires now arrive with class starting gear
M4162026-05-06M416 — Hire Custom dialog redesign verified-and-closed (480 max-width + scrollable appearance grid + estimated stats + skill-points label al
M416 — Hire Custom dialog redesign verified-and-closed (480 max-width + scrollable appearance grid + estimated stats + skill-points label all already shipped); Empty Thornwood node investigation closed (static-map audit clean); Craft menu gets gold-cost glyph + 'Craft (N)' count badge per recipe.
M4152026-05-06M415 — recursion guards on soulbind/counter/thorns wrapped in try/finally (no more deadlock-on-throw); M65 legacy sfx alias table dropped af
M415 — recursion guards on soulbind/counter/thorns wrapped in try/finally (no more deadlock-on-throw); M65 legacy sfx alias table dropped after audit confirmed no call sites; SPRITE_MAP audit deferred (defensive override, intentional).
M4142026-05-06M414 — combat background now extends to top of party HUD via live --hud-h CSS var (matches caption-bar bottom anchor); last-node forward das
M414 — combat background now extends to top of party HUD via live --hud-h CSS var (matches caption-bar bottom anchor); last-node forward dashed connector now uses same DOM popup pattern as back-arrow with 'Travel forward to {Zone}' button; gameState._state initialized via factory to break DEFAULT_STATE reference sharing.M4132026-05-05M413 — verified pre-existing kill counters (warlock + pyromancer unlocks unblocked), maxMp fallback audit clean, flee-fail already canonical
M413 — verified pre-existing kill counters (warlock + pyromancer unlocks unblocked), maxMp fallback audit clean, flee-fail already canonical, cloud asset cleanup (deleted clouds_04/05 + thumbs + manifest scrub), milestone-jargon glossary doc.
M4122026-05-05M412 — passives slot-mult bug fixed (pyro/stormcaller get unique replacement nodes), persistent per-combat statistics with Supabase mirror,
M412 — passives slot-mult bug fixed (pyro/stormcaller get unique replacement nodes), persistent per-combat statistics with Supabase mirror, attack-speed lines on item + compare tooltips, hero/companion split into separate 4-col HUD rows, fallen-hero ↔ save sync, dragon_hatchling 404 + zone-table cleanup.
M4112026-05-05M411 — 22-item batch: spell rewire to weapon-damage scaling, priest AI fixes (Call Back guard, surface offense), enemy hover tooltip (replac
M411 — 22-item batch: spell rewire to weapon-damage scaling, priest AI fixes (Call Back guard, surface offense), enemy hover tooltip (replaces click), companion power-tier balance + scaling, hireable-cost normalization (100g/level), trainer +1 button + spendGold crash + companion exclusion, build picker in custom hire + full point spend, levelup overlay opacity, dg-screen stale DOM cleanup, Void Scholar art set, Silas portrait regen, image-review-v2 page workflow callout + approve-command buttons, achievements wired to combat-victory + level-up + zone-unlock, Hell Breach duplicate boss demoted to challenge, level-up XP cap removed, ev-card class+level label, passives panel layout, items-found rarity colors, images.html combat-bg + orphaned section, Ember Plateau node-overlap pass-3 (edge-edge intersection nudge).
M4102026-05-04M410 — priest overheal fix. Two bugs: (1) AI selection at low priest level had Mend as the only usable skill, so the default-personality fal
M410 — priest overheal fix. Two bugs: (1) AI selection at low priest level had Mend as the only usable skill, so the default-personality fallback chain landed on usableSkills[0]=Mend even when nobody was hurt — now skips heal/buff fallbacks unless someone actually needs healing; (2) the 85% overheal-skip gate in _executeSkill required actor.autoBuild.auto_active or non-hero, so a regular AI hero priest bypassed it entirely — now triggers whenever the cast isn't a manual-mode hero. Combined: priests stop spamming Mend at full HP.
M4092026-05-04M409 — Lay on Hands AI fix. Heal/revive skills now bypass the partyMember.skills filter in the hero AI so a paladin with LoH unlocked but no
M409 — Lay on Hands AI fix. Heal/revive skills now bypass the partyMember.skills filter in the hero AI so a paladin with LoH unlocked but not in his manually-picked active list will still cast it on himself when wounded. Without this the picked-skills filter dropped LoH and the paladin let himself die instead of healing. Self-cast was already supported by the heal target picker (lowest-HP ally including self) — the bug was the AI never seeing the skill in the first place.
M4082026-05-04M408 — combat grid mobile bottom-anchor. Previous attempts placed the grid by a top % which left ~300px of unused space below the front row
M408 — combat grid mobile bottom-anchor. Previous attempts placed the grid by a top % which left ~300px of unused space below the front row on mobile because the grid's actual vertical span is small relative to the element height. Now the grid anchors by the element BOTTOM on portrait mobile so the front row sits just above the HUD with a 20px breathing margin and the back row sits just below the BG's horizon. Added a sky-floor clamp (top 20% of viewport) so back-row sprite heads can never appear in the sky band. Desktop layout untouched.
M4072026-05-04M407 — combat grid mobile fix (followup to M406). Reverted the .ev-battlefield top:90px CSS hack which had desynced the SVG tile layer from
M407 — combat grid mobile fix (followup to M406). Reverted the .ev-battlefield top:90px CSS hack which had desynced the SVG tile layer from the canvas character layer. Now both layers share the same mobile-aware sky percentage (0.42 in EvBattlefield, 0.40 in CombatScreen canvas) so tiles and characters move together. Added clamps so back-row sprite heads can't exit the viewport top and front-row tiles can't exceed the element height.
M4062026-05-04M406 — large batch across 6 parallel agents: Silas weapon reward fixed, combat grid recentered on iPhone 14 Pro, .cbt-hud z-index fix, dunge
M406 — large batch across 6 parallel agents: Silas weapon reward fixed, combat grid recentered on iPhone 14 Pro, .cbt-hud z-index fix, dungeons overhauled (persistent HP/MP, 4-6 enemies/floor, +30-40% difficulty, victory dialog ordering, fluff floors removed), Weapon Scaling committed (INT/STR/DEX damage paths removed, Melee→Damage rename, ~150 skill descriptions updated), shrines reworked (no-op when used, revisitable when skipped, random buff pool replaces heal shrines), node detanglement post-pass (Wounded Soldier, Goblin Warrens, Ruined Watchtower), Forest Warden coins text, single auto-mode confirmation per save, auto checkbox moved next to tab title, Debug Map Nodes setting, combat stats persistence (3rd attempt — flush on fight end), parity warning fix (AoE log over-count), game speed persists across combats, mobile dropdown for Codex/Stats tabs, Achievements wired (War Dog → Trusty Companion + others), Achievements link on title, Enchanter/Priest sprites approved + class-catalog, warrior_east_block regenerated, Dust Roads + Ashen Gate backgrounds swapped.
M4052026-05-03M405 — Major batch follow-up: dialog hero/NPC banner side-swap, skill-rail flex-start, status-icon row above HP bar with proper PNG/SVG icon
M405 — Major batch follow-up: dialog hero/NPC banner side-swap, skill-rail flex-start, status-icon row above HP bar with proper PNG/SVG icons, hide skill rails when auto-combat (HUD shrinks, captions reflow dynamically via JS), 'Act N: Zone — unlocked' consolidated, faint-gold tile borders (no more green/red fills), speed button restored in auto-combat mode, full map untangle (79 → 6 crossings, dungeon nodes for Goblin Warrens + Ash Catacombs + Spider Queen no longer dropped by exit cap, stray hidden-node lines suppressed in renderer, debug log via __mapDebug), achievement screen merges registry-only entries (Untouchable, Hard Hitter, etc), shrine fail statuses now applied to next combat (was a no-op), Mage Arcane Familiar talent unlocks companion via auto-build path, Ash Wraith Deathchill does real damage + slow + bleed, DoT attribution per-source with stacking up to 3 + meter credit, Party screen sub-options Rename/Inventory/Spells/Passives/Attributes via manager.replace, gold-gradient XP bar, grid placement default OFF (incognito-clean) and bottom margin compresses upward, sprite-adjust nav-header height fix so foot is visible, bard_female sprite scaling JSON, .pp-tip-pop width cap + .passive-points-banner shrunk + skill-list-panel overflow-x:hidden.
M4042026-05-03M404 — Major batch follow-up: status tooltips on party frames + compact +N points badge + async sim + .pps-char-badge live update + manual-c
M404 — Major batch follow-up: status tooltips on party frames + compact +N points badge + async sim + .pps-char-badge live update + manual-combat default fixed; Manual Characters advanced option (replaces Hard-difficulty auto-lock); one-liner advanced descriptions; New Combat UI (BETA) default ON; Auto checkbox in char creation + custom hire; starting gold 50 + Silas gold gift 100; random-name dice icon in char creation; Load-game Advanced (N) collapsible; cleric_priestess flagged NPC; quest reward audit (Collapsed Passage + others) + Silas amulet/ring fix (was passing 'amulet' which isn't a valid item base); hybrid skill resolver always treats STR scaling as heavy (was falling to light); Holy Strike + 3 hybrid skill descriptions reworded; Combat Debug Show Grid Placement now lights ALL 7×6 cells; emit-game-data emits damageStat/damageMult/damageCategory; tavern roster genuinely depletes (no reshuffle); auto-toggle button parity between Inventory and Attributes.
M4032026-05-03M403 — Major batch: combat damage rolls per-hit, Multi-Shot fix, manual-combat clickable + tooltips repositioned + mana indicator, 24px desk
M403 — Major batch: combat damage rolls per-hit, Multi-Shot fix, manual-combat clickable + tooltips repositioned + mana indicator, 24px desktop click targets, disabled-skill tooltips, captions positioning, hide auto-toggles in manual mode, 12-enemy battle grid, Party Skills/Inventory route to new PartyPanelScreen, stats Last Saved indicator, RSG-Demos card relinked (Home → index, Play Now → play.html), front page heroImg fix + live-data-driven class/companion counts + primary-attribute bubbles + 'By the numbers' Initiative removed + companion loyalty/Auto Rounds section removed, assets/images.html bosses/enemies split + new NPCs filter + ash_wraith hover-swap fix, sprite-adjust.html guides feature + Single compare mode + Bard Male sizing, custom-content.html updated for builds + hybrid skills + sleep status + new build-preset.json schema, Silas portrait regen (full bust shot), prologue + dust_roads + 8 other zone map_bg JPGs added, dialog conversation grid centered with 100px gap and 2x desktop sprites + NPC name in dedicated banner, prologue combat bg pointer added.
M4022026-05-03M402 — Hotfix: New Game black screen on iPhone caused by property/method name collision. Renamed CharacterBuilderScreen.this._build (chosen
M402 — Hotfix: New Game black screen on iPhone caused by property/method name collision. Renamed CharacterBuilderScreen.this._build (chosen build preset) to this._buildChoice so it no longer shadows the _build() init method that onEnter() calls. The black screen with 'Uncaught TypeError: this._build is not a function' is gone.
M4012026-05-03M401 — Sprite review actions (6 flips, 2 regens), AoE per-target damage logging, lifetime stats sync to supabase, and rate-limited JS error
M401 — Sprite review actions (6 flips, 2 regens), AoE per-target damage logging, lifetime stats sync to supabase, and rate-limited JS error telemetry. Flipped six sprites that were facing west (enchanter male spell + ko, enchanter female ko, priest female ko, priest male ko + spell). Regenerated priest_female_south as a full body (was cropped to portrait) and priest_female_east_attack with a single mace (was dual-wielding); both flagged for re-review. Approved the other 26 new-class poses per user review. Combat log now emits one line per AoE hit so a Whirlwind on 4 enemies reads as 4 separate outcomes plus a header summary instead of a single rolled-up line. Lifetime stats (LIFE_KEY) and run stats (RUN_STATS_KEY) are now allow-listed for cloud sync; saveLife pushes to supabase fire-and-forget after each local write (capped at 200 KB, oldest run history trimmed first). main.js pulls the lifetime stats from cloud on sign-in before merging save slots so the Stats panel character/run survives a hard refresh. New JS error capture in telemetry.js: window.onerror + unhandledrejection report to recordEvent('js_error',…) with per-fingerprint cap of 5 and per-session cap of 30 so a tight error loop can't spam telemetry. No PII.M4002026-05-03M400 — Hotfix: defensive try/catch on Character Builder steps + iOS Chrome pull-to-refresh on the title screen + Silas conversation moved to
M400 — Hotfix: defensive try/catch on Character Builder steps + iOS Chrome pull-to-refresh on the title screen + Silas conversation moved to the actual first dialog node + buckler fix in build-aware loot. New Game flow on iPhone falls through to a safe step instead of black-screening if any single render throws (and logs the error). TitleScreen toggles overscroll on so iOS Chrome pull-to-refresh works on the main menu, off when entering the game so combat taps don't accidentally refresh.
M3992026-05-03M400 — Hotfix: defensive try/catch wrap on Character Builder steps so a render exception in any single step (build, stats, class) falls thro
M400 — Hotfix: defensive try/catch wrap on Character Builder steps so a render exception in any single step (build, stats, class) falls through to a safe step instead of black-screening the New Game flow on iPhone. Also moves the Silas conversation onto prologue_warning (the actual first dialog node players see) instead of the unused prologue_start, fixes a wood_shield item key reference (was undefined, would throw on the build-aware weapon gift path), and reuses the existing Silas Veilward sprite so the build-aware prologue gift actually fires.
M3982026-05-03M398 — Surface 28 new class sprite entries in the image-review-v2 Pending filter. Enchanter male+female and Priest male+female (7 poses each
M398 — Surface 28 new class sprite entries in the image-review-v2 Pending filter. Enchanter male+female and Priest male+female (7 poses each = 28 entries) appended to the m351 open review batch with their referenceSheet prompts and pose-style hints; Pending mode at /assets/image-review-v2.html now shows them ready for approval/feedback.
M3972026-05-03M397 — Image-review surfaces new class art with prompts + appearance picker shows unlocked portraits first. Backfilled the 28 Enchanter/Prie
M397 — Image-review surfaces new class art with prompts + appearance picker shows unlocked portraits first. Backfilled the 28 Enchanter/Priest male+female sprite entries on /assets/image-review-v2.html with prompt context (was empty); the manifest builder now falls back to the art_direction reference-sheet prompt + per-pose style notes when a frame doesn't carry its own prompt yet. Character Builder appearance picker now lists all unlocked portraits before any fame-locked ones while keeping the existing class-grouped order within each band.
M3962026-05-03M396 — Weapon Scaling mode + skill rebalance + tooltips + Enchanter female / Priest male sprites. New advanced game-creation toggle Weapon S
M396 — Weapon Scaling mode + skill rebalance + tooltips + Enchanter female / Priest male sprites. New advanced game-creation toggle Weapon Scaling drives skill damage off the equipped weapon's roll instead of STR/DEX/INT directly; INT spells still benefit from spell power but raw INT no longer multiplies spell damage. Adds standardized benchmark gear packs at L1/3/5/7/10/15/20/25 (no legendaries / uniques) plus a per-class skill benchmark sim that surfaced and trimmed several stacking-multiplier outliers (Cleric Smite, Knight Holy Strike, Tinker Bolt, Monk Shadow Step, Dragon Knight Claw / Breath). Spell tooltips on the new combat HUD now show estimated damage on the primary target plus the full formula breakdown (stat term × mult × (1 + spell/attack power) + weapon flavor); Skills menu picked up the same expanded formula. Damaging skills no longer mislabel as utility in the legacy popup. Generated review-flagged Enchanter (female) and Priest (male) sprite sets and deployed them.
M3952026-05-03M395 — Priest class + class tags + damage categories. Adds Priest (female art, review-flagged) with heal/revive/shadow-damage skills (Mend,
M395 — Priest class + class tags + damage categories. Adds Priest (female art, review-flagged) with heal/revive/shadow-damage skills (Mend, Call Back, Shadow Bolt, Shadow Veil). Introduces a class-tag system (healer / reviver / arcane / dark / holy / tracker / shadow…) so quest gates like the wounded soldier accept any healer instead of only Cleric, and the mage-glyph apprentice accepts any arcane caster. Damage skills now resolve a heavy/light/magic category and apply per-category multipliers; magicMult set to 0.78 to bring spells closer to basic-attack damage (sim shows Act 1 dropping from 15.3 to 13.3 percent win rate, Act 4 18.0 to 9.0, Act 6 9.2 to 2.8 — spells were carrying late-act AoE disproportionately and now read 1.5-2x basic attacks instead of 4x+).
M3942026-05-02M398 — Enchanter class with sleep magic + status particles + bottom-pinned skill menu + hero rename. Combat now ships an Enchanter class (ma
M398 — Enchanter class with sleep magic + status particles + bottom-pinned skill menu + hero rename. Combat now ships an Enchanter class (male sprites generated, art pending review) with new Sleep status that locks targets for 2 rounds and breaks on damage; AI auto-skips sleeping targets. Adds floating status particles (3 SpriteCook PNGs for burning/frozen/sleeping plus SVG fallbacks for poison, bleed, stun, slow, regen, curse, silence, blind, marked). Mobile manual-mode menu pins to the bottom strip without an overlay so the battlefield stays visible. Heroes can be renamed from the Party screen with a customName / defaultName split — clearing the field reverts to the original.
M3932026-05-02M393 — combat HUD overhaul pass: 2.5D grid lifted above HUD, single-row spell rail, compact companion frames, AI badge dropped, manual-mode
M393 — combat HUD overhaul pass: 2.5D grid lifted above HUD, single-row spell rail, compact companion frames, AI badge dropped, manual-mode hides speed/step buttons, captions repositioned, tap-clicks bail on new HUD, portrait fallback chain prefers south then portrait then east, 1v1 placed face-to-face on same row, debug placement knobs feed grid spacing, Show Companion Frames toggle.
M3922026-05-01M392 — 2.5D battlefield tiles now always visible at low intensity behind canvas sprites; occupied/targeting states ramp up from baseline.
M392 — 2.5D battlefield tiles now always visible at low intensity behind canvas sprites; occupied/targeting states ramp up from baseline.
M3912026-05-01M391 — UI overhaul polish: settings 'Back' no longer leaks the prior panel after toggling New UI; canvas BG suppressed in overhaul mode so t
M391 — UI overhaul polish: settings 'Back' no longer leaks the prior panel after toggling New UI; canvas BG suppressed in overhaul mode so the painted 2.5D scene shows through; EvBattlefield now mounts behind the canvas (canvas-driven sprites, animations, enemies, war_dog, stance variants all visible again — no more 404s on broken sprite paths); 2.5D ground tiles now only render under occupied positions instead of a full 6×6 checkerboard; every hero's spell-rail icons populate on mount in cold state (instead of only the active hero); party-card portraits switched to _south pose with chained fallbacks (_south → _east → fallback_portrait.svg, which now exists); card-row padding added so corner ornaments stop triggering page scroll.
M3902026-05-01M390 — manual-mode polish: extra-attack drain now staggers strikes (380ms apart) so each bonus swing paints with its own damage number; turn
M390 — manual-mode polish: extra-attack drain now staggers strikes (380ms apart) so each bonus swing paints with its own damage number; turn loop pauses via _drainingExtras flag mid-chain. Mobile HUD controls (weapon/utility/speed/pause) tighten under 700px and hide empty Tap Power buttons so they stop crowding the manual-mode card rail.
M3892026-05-01M389 — manual-mode UI polish: hardcore lock + spell tooltips + mobile portrait strip + per-encounter BG variants. Hardcore difficulty now vi
M389 — manual-mode UI polish: hardcore lock + spell tooltips + mobile portrait strip + per-encounter BG variants. Hardcore difficulty now visibly locks Manual Combat on (lock badge in DifficultyDialog; gameState.load also enforces). Spell rail buttons get a flourish-cornered tooltip card (mobile: bottom sheet) showing name, MP/CD, AOE, est damage, and description. Below 700px the rail collapses to one expanded card plus a 36px portrait strip; AWAITING-INPUT forces selection to the active actor. EvBattlefield BG now picks 1 of 3 variants per act via a deterministic encounter-id hash; bosses anchor to v1.
M3882026-05-01M391 — Manual extra-attack drain + M392 — SVG corner ornaments. M391: extraAction and _speedExtraRemaining no longer splice the actor back w
M391 — Manual extra-attack drain + M392 — SVG corner ornaments. M391: extraAction and _speedExtraRemaining no longer splice the actor back while awaiting player input — instead they drain synchronously inside _dispatchManualAction so the player is prompted exactly once per turn. M392: lozenge corners on hero cards, simple corners on companion cards + the turn-order strip; defs injected once via evSymbols.js. Both behind 'New Combat UI (Beta)'.
M3872026-05-01M390 — Manual mode loop-pause + spell rail click-to-cast. When 'New Combat UI (Beta)' is on, manual-mode hero turns no longer open the legac
M390 — Manual mode loop-pause + spell rail click-to-cast. When 'New Combat UI (Beta)' is on, manual-mode hero turns no longer open the legacy modal — instead the active hero's card-rail goes hot with Basic Attack + per-class spells (state-aware: ready/no-mana/on-cooldown/disabled) + Use Item (free action) + End Turn. Single-target spells engage the EvBattlefield grid for tile selection (ev:target-select). Item use stays awaiting input; turn timer freezes via a new _awaitingInput guard in update(dt). Legacy modal still drives manual mode when the flag is off.
M3862026-05-01M389 — Card rail skeleton: per-hero bottom-HUD cards (portrait, name/class, HP+barrier+MP bars, status row) replacing legacy .hud-members wh
M389 — Card rail skeleton: per-hero bottom-HUD cards (portrait, name/class, HP+barrier+MP bars, status row) replacing legacy .hud-members when 'New Combat UI (Beta)' is on. Companion row beneath, AI badge, dead/active state styling. Spell rail placeholder reserved for M390. Round/speed/pause controls untouched.
M3852026-05-01M388 — Turn-order strip: top-of-screen initiative chips with portrait, HP fill, hero/companion/enemy color borders, and gold pulse on the ac
M388 — Turn-order strip: top-of-screen initiative chips with portrait, HP fill, hero/companion/enemy color borders, and gold pulse on the active actor. Gated behind 'New Combat UI (Beta)' (gs.uiOverhaul). Rebuilds on each round; HP fills update with the existing _updateHud cadence. Existing canvas combat untouched when the flag is off.
M3842026-05-01M387 — Manual-mode + UI overhaul foundation. Adds the new design-system layer (palette tokens, .ev-panel SVG-corner border component, 18 bac
M387 — Manual-mode + UI overhaul foundation. Adds the new design-system layer (palette tokens, .ev-panel SVG-corner border component, 18 background variants under public/images/map_bg/, 8 placeholder spell-icon SVGs, asset manifests with fallback rules) and a 6×6 SVG battlefield grid component (EvBattlefield class with debounced ResizeObserver, three-layer DOM, click-to-target event contract). Everything is gated behind a 'New Combat UI (Beta)' Settings toggle (gs.uiOverhaul) — the existing canvas combat path is untouched when off. Pre-overhaul revert tag at pre-overhaul-M386. The 12-phase planning tree, 24-slide deck, senior-reviewer roast, and per-act background gallery live at /plan/ on the release server. Two review passes (code-reviewer verifier + ui-designer UX) ran against M388 and M389; blockers fixed inline (event contract sourceCombatantId, hero-overflow row-binning, vanishY 0.15→0.22 to match BG horizon). Build clean, 277/277 tests pass.
M3832026-04-30M386 — End-of-milestone audit fixes from parallel code-reviewer / performance-engineer / game-developer agents. CombatScreen _updateHud now
M386 — End-of-milestone audit fixes from parallel code-reviewer / performance-engineer / game-developer agents. CombatScreen _updateHud now dirty-checks every per-frame DOM write (status row innerHTML was the worst offender). meter.events ring capped at 2000 entries. Boss-intro splash gate replaced per-frame querySelector with a boolean flag. NG+ act-shift cap raised 6→10 with actMultipliers extended to acts 7-10 so NG+2+ no longer flatlines every zone to the Act-6 ceiling. Added partySize validate guard, prologue act-0 backfill default, and SkillTree _tabPinned reset. Workspace AGENTS.md added with subagent_type quickref for the vanilla-JS+Vite+canvas RPG stack, mirrored into CLAUDE.md and new_game_template/CLAUDE.md.
M3822026-04-30M382 — solo + NG+ + hardcore fixes. Solo runs now scale enemy damage by hero count (solo 0.40x, duo 0.65x, trio 0.85x, full 1.0x) so a hardc
M382 — solo + NG+ + hardcore fixes. Solo runs now scale enemy damage by hero count (solo 0.40x, duo 0.65x, trio 0.85x, full 1.0x) so a hardcore solo paladin can clear the prologue without being one-shot. NG+ Act 1 now uses Act 5's enemy multipliers and bumps the per-loop ngPlus values (hpBase 4.5, dmgBase 2.5) so NG+1 Act 1 actually feels like late-game combat (sim: prologue boss now 5.9 rounds vs 1.7). Hardcore mode disables the Cleric revive button (fallen stay fallen). NG+ map view now uses the dropdown zone selector instead of tabs. Tap weapon damage is now credited in the DPS meter. Hero skill mult bumped 0.70→0.82 so low-level skills feel meaningful.
M3812026-04-29M381 — Act 3+ rebalance: enemy HP & damage ramp by act (no change to Acts 1-2; Acts 3-5 multipliers 1.85x→2.4x HP and 1.22x→1.38x damage). H
M381 — Act 3+ rebalance: enemy HP & damage ramp by act (no change to Acts 1-2; Acts 3-5 multipliers 1.85x→2.4x HP and 1.22x→1.38x damage). Hero skill/spell damage scaled to 70% so AoE finishers no longer one-shot enemy waves. Companions now scale stats with effective level (STR/DEX/CON/INT bonuses), so a Level-1 War Dog hired in Act 1 keeps up in Act 5. Boss damper limits per-act HP ramp on bosses. New scripts/sim-act-balance.mjs validation tool. Sim shows Act 3 trash 10-13 rounds, big-fights 22-24 rounds, bosses 38-47 rounds with real risk of companion deaths.
M3802026-04-29M380 — ESC opens menu on map screen. Map now binds its own window-level keydown handler in onEnter (cleaned up in onLeave + destroy) that pu
M380 — ESC opens menu on map screen. Map now binds its own window-level keydown handler in onEnter (cleaned up in onLeave + destroy) that pushes GameMenuScreen when ESC is pressed and the map is the top of the stack. Belt-and-suspenders to the global ESC handler in main.js — the global one was supposed to handle it but events from the zone-select dropdown / overlay modals didn't reliably bubble to window.
M3792026-04-29M379 — News index page rebuilt to use live data: now fetches news.json (12 entries with current SEO titles) instead of hardcoded markup that
M379 — News index page rebuilt to use live data: now fetches news.json (12 entries with current SEO titles) instead of hardcoded markup that was missing post-overhaul-update + showed stale 'Re-redesign — SpriteCook' / 'M79 Redesign Report' titles. Palette aligned to the new ember accent (--accent-text #ffa844 for ≥4.5:1 contrast). Cards are now real anchors with hover state (border + h2 underline).
M3782026-04-29M378 — Combat simulator parity refactor: simulator.js now instrumented with the same 16 combatDebug.push sites as CombatScreen (initiative_r
M378 — Combat simulator parity refactor: simulator.js now instrumented with the same 16 combatDebug.push sites as CombatScreen (initiative_roll/turn_order/turn_start/ai_decision/skill_cast_attempt/hit_check/crit_check/damage_calc/damage_apply/status_apply/status_tick/legendary_proc/meter_add). New shared src/game/statusTick.js exports computeStatusTick + isDotStatus — used by both simulator and CombatScreen for burn/bleed/poison/regen formulas (no more drift). Simulator now dispatches legendary effect hooks (onCombatStart/onHit/onCrit/onKill/onCast) — Dragon Breath, Mana Shockwave, Echo Cast, etc all fire in headless balance runs. Per-source damage meter (damageBySource) added to simulator output so the M369 attribution rule is enforced both live and headless: Dragon Breath bucketed under its own name, not folded into the parent skill. Combat-debug-replay.cjs harness updated to equip legendary-bearing parties; verified 47 legendary_proc events + 8 status_tick events on a single goblin_camp run with War.damageBySource={Whirlwind:115,Cleave:223,Dragon Breath:120}. Zero perf regression (167ms for 1000 sims with cdb disabled). All 277 tests pass.M3772026-04-29M377 — Combat Debugging system: new src/utils/combatDebug.js (5000-entry ring buffer + parity checker + window.__combatDebug mirror, O(1) ba
M377 — Combat Debugging system: new src/utils/combatDebug.js (5000-entry ring buffer + parity checker + window.__combatDebug mirror, O(1) bail when disabled). Settings toggle 'Combat Debugging' (off by default, persists in localStorage.emberveil_combat_debug_log). 20 push() instrument points across CombatScreen.js: initiative_roll, turn_order, ai_decision, skill_cast_attempt, hit_check, crit_check, damage_calc, damage_apply, status_apply/tick, legendary_proc, meter_add, log_line mirror. End-of-combat parity check compares meter vs report vs parsed log totals (5% tolerance) — emits parity_warning when they diverge (e.g. legendary fire damage attribution mismatches). Post-combat modal shows red notice + 'Copy Debug Log' button when parity fired. GA + Supabase telemetry: single combat_summary event per fight (consent-gated) with encounter_name, outcome, rounds, party/enemy totals, parity_warnings, legendary_procs, top-8 source_breakdown, act. 277 tests pass.
M3762026-04-29M376 — UI fixes: docs.html capped at 1100px container + 760px article width (was full-screen, hard to read on wide displays). Companion cata
M376 — UI fixes: docs.html capped at 1100px container + 760px article width (was full-screen, hard to read on wide displays). Companion catalog rebuilt as a card grid (mirroring class-catalog) with portrait + name + type badge + stats strip + description; 480px breakpoint shrinks to 56px portrait. Sort moved into a dropdown (replaces sortable headers). Mobile layout no longer breaks.
M3752026-04-29M375 — Multi-fix: rune cursor REMOVED entirely (was a11y issue, hid focus); nav header always 'Emberveil' (no longer derives from page title
M375 — Multi-fix: rune cursor REMOVED entirely (was a11y issue, hid focus); nav header always 'Emberveil' (no longer derives from page title that mutates); header restyled to match new Ember design (72px, mono caps, ink-2/ink-1, .scrolled state); rsg-game meta tags normalized to 'Emberveil' across 8 pages; images.html class roster expanded to all 28 (Tinker/Monk/Shaman/Witch Hunter/Knight/Sorcerer/Runesmith/Shadow Dancer added) + auto-hydrates from data/classes.json; front-page hero portrait removed, EMBER no longer wraps (white-space:nowrap when no portrait), stat strip max-width 1100px centered; classes section role text hidden in list, names left-aligned, .class-portrait flex-start with max-height 720px; combat enemies relabeled (Stormcaller + Goblin) using existing portraits; arena-log no longer flickers (only re-renders when log strings change); 'View full balance report' → 'View Report'.
M3742026-04-29M374 — Multi-fix batch: (1) Skills now show 'Lv N' instead of 'Tier N' on front-page hero/classes (uses real unlockLevel from skills.js). (2
M374 — Multi-fix batch: (1) Skills now show 'Lv N' instead of 'Tier N' on front-page hero/classes (uses real unlockLevel from skills.js). (2) Companion section filtered to TRUE companions (war_dog/dire_wolf/etc), no more hireables (Lysa/Borin/Aela/Rekk excluded), capped at 8 entries, portraits fall back to _south.png since most don't have _portrait files. (3) Image Review V2 lightbox now sits below the 52px sticky nav (inset:52px 0 0 0; close-X at top:60px). (4) Inventory tooltip on mobile gets max-height + scroll + sticky action buttons so Equip/Compare always reachable. (5) Changelog parser now folds in releases[N].summary from game_meta.json (245 entries vs 40). release.sh re-runs parser every release. (6) UX review (M367) copied to public/docs/ux-review-m367.md and linked from /assets/docs.html for phone-friendly viewing.
M3732026-04-29M373 — UX polish round 2: combat pause button now has aria-pressed/aria-label that toggle on state change. New /accessibility.html — dedicat
M373 — UX polish round 2: combat pause button now has aria-pressed/aria-label that toggle on state change. New /accessibility.html — dedicated WCAG 2.1 AA statement covering keyboard shortcuts, reduced motion, screen readers, contrast policy, touch targets, known limitations, and reporting. Footer About section now links to it.
M3722026-04-29M372 — Contrast fix follow-through: 7 interactive text contexts (eyebrows, sk-cost, act-tile, news cards, CTAs, tap-button, car-arrow) now u
M372 — Contrast fix follow-through: 7 interactive text contexts (eyebrows, sk-cost, act-tile, news cards, CTAs, tap-button, car-arrow) now use --accent-text (#ffa844, ≥4.5:1 on dark bg) instead of decorative --accent (#e8612a, 2.8:1). Decorative borders/glows still use --accent.
M3712026-04-29M371 — UX accessibility critical fixes: --accent-text token (#ffa844) for ≥4.5:1 contrast on dark bg (--accent itself stays decorative); run
M371 — UX accessibility critical fixes: --accent-text token (#ffa844) for ≥4.5:1 contrast on dark bg (--accent itself stays decorative); rune cursor now only fires on (hover:hover) + (pointer:fine) + no reduced-motion (won't hide cursor for keyboard/touch users); explicit :focus-visible rings on all interactive elements (.ev-themed scope); class picker is now a real role=tablist with arrow-key navigation, Home/End, aria-selected, aria-controls; combat preview ticker checks document.visibilityState (no battery burn while tabbed away); prefers-reduced-motion kills ember particles + parallax + reveal animations + clamps all transitions to 0.01ms; iPhone 14 Pro (480px) breakpoint stacks hero stats 2x2, 1-col acts rail, 240px companion cards, 44px min touch targets. ARIA labels on all 4 chart SVGs (radar, difficulty curve, drop stack, initiative bell).
M3702026-04-29M370 — Hard-mode rebalance (GitHub Pages only, NOT pushed to emberveil.radgh.com per user directive). Every regular enemy HP ×4, dmg ×2; eve
M370 — Hard-mode rebalance (GitHub Pages only, NOT pushed to emberveil.radgh.com per user directive). Every regular enemy HP ×4, dmg ×2; every boss HP ×7, dmg ×2 across all 6 acts (73 stat blocks). Solo Knight on Act 3: 0% survival (target was ≤5%). Comp B Act 3-6: 0% win rate. Comp A Act 1: 85% to 10%, Act 3+: 0%. Balance test flipped from 'highly winnable' floors to 'hard-mode ceilings' (Act 1 ≤60%, Act 3 boss ≤30%, smoke check accepts 0%). New post-snapshot at public/assets/data/balance-snapshot/post-m369-hard.json. balance-report.html now has 'M369 — Hard Mode' toggle with Comp C (solo Knight) charting.
M3692026-04-29M369 — Combat Report damage attribution: legendary effects (Dragon Breath, Arcane Bounce, Mana Shockwave, Echo Cast) now record their damage
M369 — Combat Report damage attribution: legendary effects (Dragon Breath, Arcane Bounce, Mana Shockwave, Echo Cast) now record their damage with the effect's name + element instead of bucketing under 'Attack'. _dispatchLegendaryHook ctx.applyDmg now accepts (sourceName, element) optional args; legendary effects pass them so the meter shows 'Dragon Breath / fire' as a separate row.
M3682026-04-29M368 — Bug fixes: combat-end modal no longer renders twice (added _endModalShown guard + cleanup of any pre-existing .cbt-end-modal in DOM b
M368 — Bug fixes: combat-end modal no longer renders twice (added _endModalShown guard + cleanup of any pre-existing .cbt-end-modal in DOM before mount). Travel-back popup OK button now actually navigates — was being eaten because innerHTML was reset every render frame, killing the click handler mid-event. Now content is only rewritten when destination zone changes; click handler is persistent and reads the latest backLink.
M3672026-04-29M367 — Theme cosmetic pass: ev-themed body class added to all 60 news + tool/catalog/doc pages. They now pick up Cinzel/Spectral fonts + emb
M367 — Theme cosmetic pass: ev-themed body class added to all 60 news + tool/catalog/doc pages. They now pick up Cinzel/Spectral fonts + ember palette via the auto-injected site-theme.css. No layout changes — just the theme tokens cascade in.
M3662026-04-29M366 — Contact page rebuilt to match new design: form removed, three centered Direct/Feedback/More-links cards with vertical stack layout, e
M366 — Contact page rebuilt to match new design: form removed, three centered Direct/Feedback/More-links cards with vertical stack layout, email confirmed radleygh@gmail.com (not radgh.com). Privacy page picks up ev-themed body class so the new fonts/palette apply.
M3652026-04-29M365 — Design migration kickoff: pre-tag pre-design-migration-m364 captured. New shared/site-theme.css (1146 lines, ember-locked, rune curso
M365 — Design migration kickoff: pre-tag pre-design-migration-m364 captured. New shared/site-theme.css (1146 lines, ember-locked, rune cursor, namespaced under .ev-themed). nav-header.js auto-injects theme + sets cursor=rune on themed pages. release.sh syncs site-theme.css. New scripts/build-live-data.cjs writes public/assets/data/live.json with real game counts (28 classes, 5 starters, 35 companions, 6 acts, etc) — runs every release. New public/assets/_design/site.js (vanilla JS port of Hero/Classes/Combat/Companions/Charts/Acts/News + ember layer + rune cursor + reveal). New index.html assembled from those mounts. Tools/Catalogs/Docs unchanged this milestone (will get cosmetic theme pass next).
M3642026-04-29M364 — Forest Warden 'invisible node south' explained: the lower node was act1_warden_reward, which I renamed to 'Warden's Request' in M360
M364 — Forest Warden 'invisible node south' explained: the lower node was act1_warden_reward, which I renamed to 'Warden's Request' in M360 but the rename was masked because _displayedNodeName always overrode node.name with the dialog's npcName. Both dialog nodes shared npcName='Forest Warden', so they collapsed to the same label and looked like duplicates. Fix: _displayedNodeName now prefers node.name when explicitly set, falls back to npcName only for generic-named nodes. Forest Edge + Warden's Request will now render distinctly.
M3632026-04-28M363 — Inventory tab now opens with 'Inventory — ClassName' header to match Skills/Passives/Attributes tab title pattern. Character name + p
M363 — Inventory tab now opens with 'Inventory — ClassName' header to match Skills/Passives/Attributes tab title pattern. Character name + portrait moved into a sub-header below, no longer doubling as the tab title.
M3622026-04-28M362 — Token migration + tab title normalization. dragon-expansion.html and balance-report.html now use canonical --rsg-* tokens (no more ha
M362 — Token migration + tab title normalization. dragon-expansion.html and balance-report.html now use canonical --rsg-* tokens (no more hardcoded #0a0204/#ffd060/etc). SkillTree tabs unified: 'Skills — Class', 'Passives — Class', 'Attributes — Class' (was 'Class' / 'Passive Tree — Class' / 'Attributes — Class'). Tokens come from nav-header.js :root injection so every page picks them up.
M3612026-04-28M361 — Map polish: completed dialog nodes now show a green checkmark badge so the player knows once-only events are done. Tooltip clamping (
M361 — Map polish: completed dialog nodes now show a green checkmark badge so the player knows once-only events are done. Tooltip clamping (M360) verified working.
M3602026-04-28M360 — Boss scaling double-multiply fix (was bossScale^2 * 2.5; bosses correctly sized now). Map node tooltips now clamp inside container —
M360 — Boss scaling double-multiply fix (was bossScale^2 * 2.5; bosses correctly sized now). Map node tooltips now clamp inside container — no more horizontal scrollbar on right-edge nodes. Forest Warden duplicate node renamed to Warden's Request; both Forest Warden dialogs now use male druid portrait. Dialog nodes are now once-only by default — completed dialog becomes silent walk-past unless event has repeatable:true (fixes Forest Warden 1 re-firing). Memory Trial doubled to 8 cards / 4 pairs / 12 flips, replaced letters with class-style glyph sigils (sword/shield/flame/rune) inline SVG; reward bumped to 50 gold.
M3592026-04-28M359 — Save load routing fix: if a save is on an adventure zone (not in town), Load now opens MapScreen at that node instead of bouncing the
M359 — Save load routing fix: if a save is on an adventure zone (not in town), Load now opens MapScreen at that node instead of bouncing the player to the last town. Town saves still go to TownScreen as before. Fixes the 'I saved on Border Roads but loaded into Emberveil' bug.
M3582026-04-28M358 — Level-up 'Spend Now' now routes to Party > Spells/Passives/Attributes tab (whichever has pending points first), not the legacy SkillT
M358 — Level-up 'Spend Now' now routes to Party > Spells/Passives/Attributes tab (whichever has pending points first), not the legacy SkillTreeScreen. Auto-Equip button on Inventory tab renamed to 'Auto' with circle (○) indicator when off; matches Skills/Passives/Attributes Auto buttons. Same circle-off indicator added to SkillTree Auto buttons.
M3572026-04-28M357 — Settings cleanup: Companion Level Sync always-on (toggle removed), Attack Speed always-on (toggle removed) AND wired to dagger/rapier
M357 — Settings cleanup: Companion Level Sync always-on (toggle removed), Attack Speed always-on (toggle removed) AND wired to dagger/rapier/shortbow/dragonfang_dagger via attackSpeed:'fast' tier (was previously a no-op because no weapon had the tier set). Auto-Advance Dialog and Debug Mode now have descriptive subtext matching the other toggles.
M3562026-04-28M356 — Frontpage companions/bosses/enemies now render with the same hero-card-sm grid structure as unlockable heroes (120px minmax, identica
M356 — Frontpage companions/bosses/enemies now render with the same hero-card-sm grid structure as unlockable heroes (120px minmax, identical card markup). Starter classes still use the larger heroBigCard layout per spec.
M3552026-04-28M355 — Assets page split: /assets/ is now a landing card page; /assets/images.html, /assets/audio.html, /assets/milestones.html each show on
M355 — Assets page split: /assets/ is now a landing card page; /assets/images.html, /assets/audio.html, /assets/milestones.html each show only their own section (rest hidden via #section { display:none }). Assets nav submenu updated to link to the new pages.M3542026-04-28M354 — Sweeping site overhaul: nav reorg (Catalog/Docs new menus, Archived moved to footer, Send Feedback removed); shared footer.js with 5-
M354 — Sweeping site overhaul: nav reorg (Catalog/Docs new menus, Archived moved to footer, Send Feedback removed); shared footer.js with 5-section layout (Game/Tools/Docs/Archived/About) auto-injected on every page; canonical CSS design tokens injected by header (var(--rsg-bg/accent/container-max/etc)); 10 OpenAI desert-fantasy news hero images (gpt-image-1 1536x1024) wired through Image Review V2 batch m351; new post-overhaul-update news report with chart.js (Act win rates pre/post, damage share, status distribution) + sample damage meter; SEO-renamed all 10 news titles (e.g. 'Milestone Report' -> '20 Classes, 84 Skills & Combat Rework'); privacy.html rebuilt with consent banner notes for GA4 (per-host G-IDs), telemetry, cloud saves; consent gating verified - GA only loads when rsg_consent_v1 granted; frontpage hero now calc(100svh-52px), scroll-indicator centered with auto-margin (immune to padding), news bumped to 6 items; dragon-expansion overlay removed + dragon knight icon refreshed + Emberveil-in-meta cleaned + inline GA stripped; milestone-report 6-box now 3x2 grid; sub-menu hover bridge added (no more flicker); contact clouds match index parallax direction + speed; More Links section rewritten with 8 useful destinations; lightbox prompt section now shows old/new prompts side-by-side; Image Review V2 palette aligned to canonical tokens; .char-m79-portrait min 120px; assets pose hover-swaps into portrait slot (desktop only).
M3532026-04-28M353 — Image Review V2: pyromancer east_spell approved (m350 → history). Category filter now applies in Pending/History modes (was leaking c
M353 — Image Review V2: pyromancer east_spell approved (m350 → history). Category filter now applies in Pending/History modes (was leaking character entries into Backgrounds tab).
M3522026-04-28M352 — Image Review V2 fixes: lightbox close button (added top-right red X + event delegation), prev/next visible-but-disabled when single i
M352 — Image Review V2 fixes: lightbox close button (added top-right red X + event delegation), prev/next visible-but-disabled when single image, prompts shown under old/new comparison, asset/reference IDs visible. tools.html now reads live data/tools.json (rebuilt every release) — 19 untracked tools surfaced + curated descriptions added. release.sh auto-runs build-tools-list.cjs + build-image-review-v2.cjs.
M3512026-04-28M351 — Image Review V2: merged image-review + character-redesign into new viewer with mode/category toggles, multi-select copy-as-list appro
M351 — Image Review V2: merged image-review + character-redesign into new viewer with mode/category toggles, multi-select copy-as-list approval flow, image-left/sidebar-right lightbox, and batch JSON system. Nav reorg: new Catalog/Docs/Archived top-level menus. Old pages renamed deprecated-*.html with banners.
M3502026-04-28M350 — Balance pass: Act 5 enemies HP -28%/dmg -16% (Comp A 32% to 78%, Comp B 1% to 53% win rate); Act 6 dragons HP +30-50% (Comp A 88% to
M350 — Balance pass: Act 5 enemies HP -28%/dmg -16% (Comp A 32% to 78%, Comp B 1% to 53% win rate); Act 6 dragons HP +30-50% (Comp A 88% to 86%, Comp B 85% to 67%); chart.js balance-report.html with pre/post/compare views; new pyromancer east_spell sprite approved.
M3492026-04-28M349 — Pending Replacements review panel: regenerated pyromancer east_spell sprite (feet were cut off) flagged for user approval before over
M349 — Pending Replacements review panel: regenerated pyromancer east_spell sprite (feet were cut off) flagged for user approval before overwriting original.
M3482026-04-28M348 - iPhone inventory tap targets, boss scale fix, real reset defaults, combat positioning, FTL gap fix.
M348 - iPhone inventory tap targets, boss scale fix, real reset defaults, combat positioning, FTL gap fix.
M3472026-04-28M347 - Cleric overheal AI; XP halved + cap tightened; prologue trailhead start; traveling overlay viewport-centered; skill-check first-visit
M347 - Cleric overheal AI; XP halved + cap tightened; prologue trailhead start; traveling overlay viewport-centered; skill-check first-visit fix; boss-chest iPhone-tappable; per-zone map fit.
M3462026-04-28M346 — Hotfix: Ancient Shrine first-visit incorrectly rendered Already Used (gs.visitNode fired before _showShrineModal so re-checking visit
M346 — Hotfix: Ancient Shrine first-visit incorrectly rendered Already Used (gs.visitNode fired before _showShrineModal so re-checking visitedNodes always returned true; now passes the pre-visit flag through). iPhone portrait map node spacing — canvas internal width forced to 760px minimum and .map-canvas-wrap scrolls horizontally so columns are ~50px apart (well above the 40px tap-target target).
M3452026-04-28M339 — Difficulty picker + Hire estimate. Both DifficultyDialog (mid-run swap) and CharacterBuilderScreen (new game) now show three compact
M339 — Difficulty picker + Hire estimate. Both DifficultyDialog (mid-run swap) and CharacterBuilderScreen (new game) now show three compact icon+name buttons in a 3-col grid with a single description paragraph below that updates as the user picks. Hard difficulty surfaces its '+20% Magic Find' and '+10% XP' bonuses as inline chips. Hire Custom estimated stats block now uses the same .preview-stat markup + 3-col grid layout as Create Character (HP/Mana/Hit/Dodge/Init in cells; Melee/Magic/Spell Power as full-width rows). preview-stat CSS mirrored into HireBuilderScreen so the screen stands alone.
M3442026-04-28M344 — NPC dialog portraits via NAME_TO_SPRITE map + slug fallback + initials placeholder; portrait box 56->64px.
M344 — NPC dialog portraits via NAME_TO_SPRITE map + slug fallback + initials placeholder; portrait box 56->64px.
M3432026-04-28M343 — Skill check Pass/Fail preview, Auto-Pass affordance, disabled dialog choices show Requires: line, shrines show Effect: block.
M343 — Skill check Pass/Fail preview, Auto-Pass affordance, disabled dialog choices show Requires: line, shrines show Effect: block.
M3422026-04-28M342 — Per-encounter XP cap (defensive against level-7-at-prologue overflow); Riposte parry counter actually wired and logged.
M342 — Per-encounter XP cap (defensive against level-7-at-prologue overflow); Riposte parry counter actually wired and logged.
M3412026-04-28M341 — Stun overhaul. New Dazed status (-25 hit pts); AoE stuns converted; +1-round stun talents reworked.
M341 — Stun overhaul. New Dazed status (-25 hit pts); AoE stuns converted; +1-round stun talents reworked.
M3402026-04-28M340 — Magic shield system: 4 new cloth off-hand bases with native Barrier + Barrier Regen; 2 magic-shield-only affixes (Wardstone, Conduit)
M340 — Magic shield system: 4 new cloth off-hand bases with native Barrier + Barrier Regen; 2 magic-shield-only affixes (Wardstone, Conduit); combat barrier-absorb + per-round regen wired.
M3392026-04-28M339 — Difficulty picker reorg (3 icon+name buttons + dynamic paragraph in both new game and Change Difficulty); Hire Custom Estimated Stats
M339 — Difficulty picker reorg (3 icon+name buttons + dynamic paragraph in both new game and Change Difficulty); Hire Custom Estimated Stats reuses CharacterBuilder .preview-stat layout.
M3382026-04-27M338 — map + dungeon. Dungeon nodes: anchor-aware return path (was using gs.nodeId which had already moved to the dungeon entry, so 'give up
M338 — map + dungeon. Dungeon nodes: anchor-aware return path (was using gs.nodeId which had already moved to the dungeon entry, so 'give up' looped back into the dungeon). Visible error fallback if dungeonId is missing or DungeonScreen import fails. Map layout rewrite — _layoutZoneToFTLGrid now caps each node's outgoing exits at 3 (preferring the spatially closest), pins the boss to (COLS-1, mid-row), classifies thru-nodes by 'reaches boss' set, places thrus along a centred trunk with ≤2-row vertical drift between adjacent columns, and places one-offs in the SAME column as their parent at parent.row ± 1 so detours read as off-lane. Fewer cross-screen connections, no node should branch to more than 3 destinations. Empty Thornwood node investigation queued for M339 — needs in-game save-state inspection.
M3372026-04-27M337 — UX batch (15 items). Title fame chip color matches the subtitle (no more vanishing into the dusk palette). WHATS NEW + SEND FEEDBACK
M337 — UX batch (15 items). Title fame chip color matches the subtitle (no more vanishing into the dusk palette). WHATS NEW + SEND FEEDBACK in game menu are de-emphasized text links instead of full buttons. Lore Compendium + Achievements fonts bumped for desktop legibility (cat tab 0.72->0.92, body 0.84->1, achievement name 0.75->0.95, etc). STR description no longer claims a carry-capacity stat (there isn't one). Map legend separated Shrine / Challenge / Skill Check labels and gave each a distinct glyph (✦ / ! / ?). Map top margin default raised 2.5% -> 7% so the player star at the top of a zone always renders fully. Damage meter 'E' checkbox + Combat log 'Secondary' checkbox removed (live in Settings now). Hire Custom card min-height removed (was forcing 140px and smushing). Hire Custom Level +/- now lays out inline on one row. Difficulty dialog toggle grid-template-columns -> auto 1fr per spec. New Game Map Seed moved to end of advanced options to match Change Difficulty layout. Party screen now shows an XP bar below HP/MP per hero (hover tooltip shows current/next-level target). Fame-tier encounters made global once-per-account via localStorage AND no longer hand out items — fame is meta since M327, so the legendary on tier 500 was leaking into every new run.
M3362026-04-27M336 — UX batch. (1) Sync toast suppressed when same digest as last shown for that user (was popping every refresh). (2) Codex 'Coming soon'
M336 — UX batch. (1) Sync toast suppressed when same digest as last shown for that user (was popping every refresh). (2) Codex 'Coming soon' for enemy scaling replaced with current role+tier+NG+ explanation incl. boss vs regular sample numbers. (3) Character-Builder advanced options checkbox layout: help text moved inside cb-adv-checkline as a 2-row grid (checkbox left, title row 1, help row 2). (4) PartyPanel embedded SkillTreeScreen no longer renders its redundant skill-mode-tabs bar (CSS hide; outer PartyPanel tabs control the sub-screen). (5) Combat pause/end-modal z-indexes raised to 1000/1010 so they sit above captions (800) and damage meter (920). (6) Fame curve recapped at 2,000 fame (was 5,000+ for late slots) — all ~25 cross-class slots fall within that range. (7) Combat speed persisted to localStorage emberveil_combat_speed; restored on next combat. (8) Next-Turn step button now shows whenever combat is paused regardless of Slow Combat setting.
M3352026-04-27M335 — UX batch. Boss loot chest affix lines now read '8% Crit Chance' instead of 'Deadly: 8%' (stat-name lookup with fallback to descriptor
M335 — UX batch. Boss loot chest affix lines now read '8% Crit Chance' instead of 'Deadly: 8%' (stat-name lookup with fallback to descriptor). Town header button no longer shows the skill-pending bubble — only Party does (Town shows quest-ready / new-unlock count). Town node fast-travel now animates the star to the destination before opening the town dialog. Skills/Passives/Attributes Auto button now immediately spends pending points on click (previously the flag flipped on but spending was deferred to the next screen open). Settings → Combat: new toggles 'Show Combat Log' (default on) and 'Show Damage Meter' (default off); when either is on, an additional 'Show Enemy Damage & Info' toggle appears. CombatScreen reads those at build time and hides log/meter or shows enemy info accordingly. In-game menu reorganized into Hero row + 3-column grid (Game / Library / Settings) + Footer row, with a new Load Game button alongside Save Game; columns collapse to a single stack below 640px wide. Class-catalog.html keeps user CSS edits.
M3342026-04-27M334 — Two backend wins. (1) Supabase request-burst fix: opening Load Game while signed in fired ~184 requests (1 listCloud + 92 readClouds
M334 — Two backend wins. (1) Supabase request-burst fix: opening Load Game while signed in fired ~184 requests (1 listCloud + 92 readClouds + a redundant auth.getUser per row). cloudSaves.mergeWithCloud and downloadAllMissing now call new savesClient.listFull which selects slot_name+state+updated_at+created_at in a single query; savesClient caches the auth.getUser result for 30s and invalidates on auth state change. Net: 2 requests instead of 184. (2) telemetry_events runtime: new src/auth/telemetryEventsClient.js inserts each consented analytics event as a row in the 0003_telemetry_events Supabase table; signed-out users insert with user_id null (RLS allows it). consent.pushEvent now fires GA AND lazy-imports the telemetry client so every milestone event lands in both places.
M3332026-04-27M333 — Google Analytics wired. Hostname-based GA id resolver in src/main.js: emberveil.radgh.com -> G-5H26ZXKBCL, anything else (radgh.githu
M333 — Google Analytics wired. Hostname-based GA id resolver in src/main.js: emberveil.radgh.com -> G-5H26ZXKBCL, anything else (radgh.github.io/RSG-Demos, localhost) -> G-XP7B7KVNY8. Override path remains: window.__RSG_GA_ID or VITE_GA_ID. Demos hub generate_pages_index.js now ships its own inline consent banner + GA snippet using the same rsg_consent_v1 localStorage key; GA only loads after Accept; same-origin so the decision shares with the game13 tab. Both properties get their own GA stream.
M3322026-04-27M332 — Class catalog rebuild: linked from the shared Catalogs nav menu (Class Catalog above Companion Catalog). Sprite strip now uses fixed
M332 — Class catalog rebuild: linked from the shared Catalogs nav menu (Class Catalog above Companion Catalog). Sprite strip now uses fixed flex-basis so 4 tiles fit across desktop, 2 across mobile. Unlockable classes stay full-opacity with an Unlock-Requirement section under the passives instead of fading out. Display-mode select (View: all / basic / images / attributes) hides sections per card. Top-right Select toggle reveals per-card checkboxes; selected count shows next to '28 of 28 classes' with a Copy List button (newline-separated class names). Lightbox gallery for sprites modeled on character-redesign.html: 7-pose nav, prev/next + arrow keys + Escape, mobile-safe scroll (close button anchored to viewport, no scroll-trap at top of frame). Each lightbox frame fetches the matching pose-prompt from public/data/art_direction/<class>.json lazily and shows it as a Prompt block. Backing data: emit-game-data.cjs now enriches classes.json with starter:true and unlockRequirement:{type,value,label} pulled from classUnlocks.js.M3312026-04-27M331 — Class catalog page. New /assets/class-catalog.html shows all 28 playable classes with portrait, 7-pose sprite strip (portrait, south,
M331 — Class catalog page. New /assets/class-catalog.html shows all 28 playable classes with portrait, 7-pose sprite strip (portrait, south, east, attack, spell, block, ko), role, armor type, primary attribute tag, lock state (starter vs unlockable), full skill list with unlock level + MP cost + description, and class passive tree. Loads via data-source.js (same source as the in-game screens; not a static copy). Filter by primary attr / armor tier / starter-vs-locked, plus a search that matches class name, role, hook, AND skill text. getPassives() added to data-source.js; passives.json was already being emitted.
M3302026-04-27M330 — Main-menu UX audit ship: collapsed three signed-out auth buttons (Login/Create/Google) into a single Sign In button + unified modal w
M330 — Main-menu UX audit ship: collapsed three signed-out auth buttons (Login/Create/Google) into a single Sign In button + unified modal w/ tabs and Google primary action. NG+ subtitle removed from title screen, surfaced as a yellow pill on Load Game cards. Fame chip simplified — number only when fame > 0; the 'Next: 2,000' copy was removed since the unlock model is per-appearance since M322. New GDPR consent banner (Accept analytics / Reject / Privacy link). GA4 only loads after Accept; consent persists in localStorage rsg_consent_v1 (and a 1y same-site cookie) and shares between game13 + RSG-Demos hub. Major-milestone GA events: run_started, run_completed_win, run_completed_death, level_up, boss_killed, class_unlocked, fame_threshold_reached. New privacy.html on both game and demos hub; new ux-audit.html dev tool linked from the demos hub footer. Optional Supabase migration 0003_telemetry_events.sql (run if you want first-party event analysis); supabase-setup.md updated to cover it.
M3292026-04-27M329 — Title corner-links laid out as a centered horizontal row along the bottom of the screen on mobile (instead of a tall right-edge colum
M329 — Title corner-links laid out as a centered horizontal row along the bottom of the screen on mobile (instead of a tall right-edge column with awkward spacing); safe-area inset for iPhone notch. Combat victory modal soft-lock fixed: CombatScreen.onPause now hides its root element so the victory modal can\'t bleed through and swallow clicks when an achievement toast pushes the AchievementsScreen on top.
M3282026-04-27M328 — Codex screen mobile layout. The horizontal scroll-tab bar of categories was unusable on iPhone (users had to side-scroll to discover
M328 — Codex screen mobile layout. The horizontal scroll-tab bar of categories was unusable on iPhone (users had to side-scroll to discover categories). Added a real select dropdown that takes over below 600px, plus stacked list-on-top / detail-below layout so the entry list isn't crushed into a 38pct column on portrait.
M3272026-04-27M327 — Bug-fix follow-up. Appearance default-unlocks driven by starter classes (warrior/fighter/ranger/rogue/mage), gender filter is display
M327 — Bug-fix follow-up. Appearance default-unlocks driven by starter classes (warrior/fighter/ranger/rogue/mage), gender filter is display-only, fame moved to global localStorage, HireBuilder mobile reuses CharacterBuilder CSS, and a new public/docs/supabase-setup.md linked from /assets/docs.html under Backend.
M3262026-04-27M327 — Bug-fix follow-up: appearance default-unlock now driven by starter classes (warrior/fighter/ranger/rogue/mage) instead of alphabetica
M327 — Bug-fix follow-up: appearance default-unlock now driven by starter classes (warrior/fighter/ranger/rogue/mage) instead of alphabetical sort position (Bard/Chronomancer/Cleric was wrong). Gender filter is now display-only — toggling Male/Female no longer changes which appearances are unlocked. Fame is now GLOBAL (localStorage emberveil_fame_global_v1) so unlocks persist across saves and new games. HireBuilderScreen class cards now use the same wrap-friendly CSS as CharacterBuilderScreen (mobile no longer ellipses 'Paladin' to 'Holy Warrior'). New public/docs/supabase-setup.md covering migration order, application options, verification, rollback — linked from /assets/docs.html under a new Backend section.
M3252026-04-27M325 — Cloud-synced per-run statistics (run_stats Supabase table; account-only; client-side trim 100 rows per user via after-insert trigger)
M325 — Cloud-synced per-run statistics (run_stats Supabase table; account-only; client-side trim 100 rows per user via after-insert trigger). FTL-style map grid layout (M324) snaps every Act 1-6 zone's nodes onto a 12-col x 12-row grid (6 logical rows x 2 alternating sublanes) preserving graph topology. Clockwork Turret + Tinker sprites regenerated via SpriteCook (12 poses total: 5 turret, 7 tinker; reference-asset chained for character consistency). Checkbox checkmark glyph reworked: now an inline-SVG background-image at 70% size on the box itself, scales perfectly with whatever dimensions the checkbox has.
M3242026-04-27M324 — FTL-style map grid layout: post-build pass snaps every Act 1-6 zone's nodes onto a 12-column x 12-row grid (6 logical rows x 2 altern
M324 — FTL-style map grid layout: post-build pass snaps every Act 1-6 zone's nodes onto a 12-column x 12-row grid (6 logical rows x 2 alternating sublanes; even rows for thru-nodes, odd rows for one-offs / hidden bosses / dungeon entries). Preserves graph topology (no edges added or removed) while regularising spacing so close-proximity overlaps and similar-angle line collisions stop happening. BFS depth assigns columns; original y-order preserved within each column.
M3232026-04-27M323 — Combat depth + balance: Enable Slow Combat Options setting adds 0.5x/0.25x/pause/Next-Turn step button to combat speed cycle (default
M323 — Combat depth + balance: Enable Slow Combat Options setting adds 0.5x/0.25x/pause/Next-Turn step button to combat speed cycle (default cycle stays 1x/2x/4x). XP curve slowed (level 2 = 120 XP, was 100; full curve front-loads requirement so prologue + first 2 fights leave the player at level 2-3 instead of L5). Prelude/Act-1 enemy damage bumped 50-70% so prologue enemies actually hit for 10+ effective damage post-mitigation against starter armor (goblin_scout 13-20 → 22-32, veilspawn_herald 16-24 → 26-38, bandit/warrior/warlord proportionally).
M3222026-04-27M322 — UI/UX bulk pass: appearance unlock rework (own-class always free; cross-class on per-appearance fame curve), reset progression option
M322 — UI/UX bulk pass: appearance unlock rework (own-class always free; cross-class on per-appearance fame curve), reset progression option, button-style Auto/Show-Base toggles with global checkbox glyph fix, HP/MP '?' init bug, party attributes 2-column layout, boss double-splash + chest auto-save + town first-visit kick fixes, upgrade-star on chest items, Town/Party header bubble rules, advanced-options checkbox layout, map node spacing + line/text visibility, travel-back popup offset, companion HP bar full width, auto-equip sweeps existing inventory, prologue map background generated.
M3212026-04-27M315 — Deep balance analysis + rebalance pass: Act 5 combat was trivial (party one-shotting all enemies, 0 retaliation). Fixed simulator act
M315 — Deep balance analysis + rebalance pass: Act 5 combat was trivial (party one-shotting all enemies, 0 retaliation). Fixed simulator act-as-ng+ bug and class-casing bug. Rebalanced all enemies Act 1-5 (HP +30-100%, DMG +30-60%), capped Backstab damageMult and Reality Shard stun chance, raised global damage multiplier to 1.3x.
M3202026-04-27M315 — Deep balance analysis + rebalance pass: Act 5 combat was trivial (party one-shotting all enemies, 0 retaliation). Fixed simulator act
M315 — Deep balance analysis + rebalance pass: Act 5 combat was trivial (party one-shotting all enemies, 0 retaliation). Fixed simulator act-as-ng+ bug and class-casing bug. Rebalanced all enemies Act 1-5 (HP +30-100%, DMG +30-60%), capped Backstab damageMult and Reality Shard stun chance, raised global damage multiplier to 1.3x.
M3192026-04-27M314 — XP catch-up + achievement persistence: catchUpMultiplier(level,partyAvg) capped at 3x, applied in awardXp + shown in victory modal as
M314 — XP catch-up + achievement persistence: catchUpMultiplier(level,partyAvg) capped at 3x, applied in awardXp + shown in victory modal as (1.5x catch-up). Achievements now persist across runs in localStorage emberveil_life_achievements_v1; new-game unlock toasts only fire for genuinely new entries; old-save achievements merged in; Reset Achievements button in Settings with confirm modal.
M3182026-04-27M313 — Consistency + codex + What's New fix: removed Recommend/Auto bar from skill tabs, 'Show Base Attributes' label rename, hidden useless
M313 — Consistency + codex + What's New fix: removed Recommend/Auto bar from skill tabs, 'Show Base Attributes' label rename, hidden useless skill-header bar, removed 'Skills - ' prefix, shop+craft auto-equip toasts (matching combat-loot variant), salvage button margin, 3-step enchanter wizard (item→property→tier), What's New fetch + Full History link now use Vite BASE_URL, codex updated with current formulas (armor DR curve, crit, dodge, fame thresholds, boss phases, champion modifiers, legendary activation rules).
M3172026-04-27M312 — UI unification batch: HireBuilderScreen wider class cards + chronomancer fits, DifficultyDialog escape + close fix, Settings difficul
M312 — UI unification batch: HireBuilderScreen wider class cards + chronomancer fits, DifficultyDialog escape + close fix, Settings difficulty row removed, TitleScreen instant fade-in (no slide-down) + cloud layer overlap, save menu flex 0 1 auto + floating Back, Statistics Esc closes properly + persisted run stats, custom confirm modal replaces window.confirm, Tavern routes to PartyPanelScreen, PartyPanel gold/brown redesign with town-style tabs, hidden equip-panel portrait, green-styled auto-equip with sweep on toggle, .inv-char-class margin, reusable settingsPanel component.
M3162026-04-27M316 — Settings/Title/Save/Party UI unification: 18 bug fixes covering HireCustom class-card CSS, title screen instant fade-in, save menu sc
M316 — Settings/Title/Save/Party UI unification: 18 bug fixes covering HireCustom class-card CSS, title screen instant fade-in, save menu scrollable cards with floating Back, Statistics Esc fix, stats localStorage persistence, checkbox checkmark sizing, auto-confirm modal, TownScreen routing to PartyPanelScreen, PPS gold/brown redesign, portrait hidden in equip-panel, auto-equip sweep, inv-char-class margin, DifficultyDialog lifecycle fix, reusable settingsPanel component.
M3152026-04-27M311 — Map/fog fixes: cross-zone back-arrow now a viewport-clamped DOM popup below the player node (no map overlap), per-zone last-position
M311 — Map/fog fixes: cross-zone back-arrow now a viewport-clamped DOM popup below the player node (no map overlap), per-zone last-position persisted (returning from later zone lands at boss node not random), fogged nodes are non-hoverable + don't show tooltips, fog-of-war default ON for new games and old saves without opt-out.
M3142026-04-27M310 — Critical combat/dungeon UI fixes from feedback batch: DungeonScreen now removes its DOM on exit, .combat-screen height:100% to preven
M310 — Critical combat/dungeon UI fixes from feedback batch: DungeonScreen now removes its DOM on exit, .combat-screen height:100% to prevent 0px collapse, victory + map modals scroll when overflowing, boss treasure → pick 1 of 3 (rarity colors only, no class suggestion), achievement screen mid-combat now pauses + defers victory, boss-intro splash hides background HUD + click-only dismiss (no countdown), fame popup cancelled on town teardown, combat report uses formatStat() everywhere, Combat Settings pause menu replaces E toggle with DPS+Log+Captions sub-options, captions raised 80px above HP bar.
M3132026-04-27M309 — News pipeline + asset archive snapshots + release.sh category tags + backward-compat notes: public/news/ markdown folder + Latest New
M309 — News pipeline + asset archive snapshots + release.sh category tags + backward-compat notes: public/news/ markdown folder + Latest News widget + news-archive.html, scripts/snapshot-assets.cjs hooked into release.sh writes per-milestone snapshots to public/assets/data/snapshots/M### (data-overrides.html now restores from them), release.sh accepts RELEASE_CATEGORY + BREAKING_CHANGES env vars, What's New splash shows Migration Notes when present.
M3122026-04-27M311 — Number rounding audit (formatStat helper, no more floating-point artifacts in stat displays) + fame-locked appearance unlocks (5 base
M311 — Number rounding audit (formatStat helper, no more floating-point artifacts in stat displays) + fame-locked appearance unlocks (5 base + up to 5 more at 100/250/500/1000/2000 fame thresholds, fame badge on title screen and game menu)
M3112026-04-27M311 — Number rounding audit (formatStat helper eliminates floating-point artifacts like 13.000000001% across all stat displays) + fame-lock
M311 — Number rounding audit (formatStat helper eliminates floating-point artifacts like 13.000000001% across all stat displays) + fame-locked appearance unlocks (5 base per class, +1-5 extras at 100/250/500/1000/2000 fame thresholds, fame badge on title and game menu).
M3102026-04-27M307 — Crafting + boss death cinematics: 25 unique-item recipes (boss-kill / lore-node / always gates), 30 common recipes (10 white auto-unl
M307 — Crafting + boss death cinematics: 25 unique-item recipes (boss-kill / lore-node / always gates), 30 common recipes (10 white auto-unlock + 10 magic level-5 + 10 rare level-10/act-2), Blacksmith 'Unique' sub-tab, recipe-unlock toast on boss kill. Cinematic dialog overlay for 8 bosses (boss line + hero line + narrator line) before the victory modal, with reduce-motion fallback.
M3092026-04-26M306 — Infinite Depths: post-game scaling dungeon unlocked after defeating an Act 5 boss. Procedural 3-5 node floors, HP×1.15^N / dmg×1.10^N
M306 — Infinite Depths: post-game scaling dungeon unlocked after defeating an Act 5 boss. Procedural 3-5 node floors, HP×1.15^N / dmg×1.10^N scaling, 10 floor effects, anchor boss every 5 floors with guaranteed legendary drop. Local leaderboard, run state persisted, separate InfiniteDungeonScreen + /assets/infinite-dungeon.html catalog page.
M3082026-04-26M305 — Sets + uniques + affixes: 24 sets (12 low-tier 2-piece / 8 mid 3-piece / 4 endgame 4-5-piece), 24 uniques across 5 acts (boss-tied +
M305 — Sets + uniques + affixes: 24 sets (12 low-tier 2-piece / 8 mid 3-piece / 4 endgame 4-5-piece), 24 uniques across 5 acts (boss-tied + open-world drops), 40 new affixes (elemental combo, conditional, defensive, resource, set helpers), 12 legendary effect hooks dispatched on combat-start/hit/crit/cast/kill. Set/unique tooltip + colored borders. Note: onTakeDamage hook deferred to next milestone for re-entrancy safety.
M3072026-04-26M305 — 24 set items (12 low/8 mid/4 endgame), 24 unique items across 5 acts, 40 new affixes, legendary effects system with combat hooks, pur
M305 — 24 set items (12 low/8 mid/4 endgame), 24 unique items across 5 acts, 40 new affixes, legendary effects system with combat hooks, purple/orange UI for sets/uniques, boss loot tables updated with unique drops.
M3062026-04-26M304 — Multi-phase bosses + boss loot + hidden bosses + 40 dialogue branches: bossPhases.js engine wired into 6 bosses with 2+ phases each (
M304 — Multi-phase bosses + boss loot + hidden bosses + 40 dialogue branches: bossPhases.js engine wired into 6 bosses with 2+ phases each (HP-tick markers in canvas bar, transition log + onEnter messages). Per-boss loot tables for 8 bosses. 4 hidden boss encounters across acts (Ember-Etched Key / INT 25 / no-death gates). 40 new gated dialog branches (8 per act) with extended requires (partyClass/inventoryItem/stat/flag2).
M3052026-04-26M303 — Enemy spells + champion modifiers: spellFx.js (5 element CSS animations w/reduce-motion fallback), 13 enemy spells in enemySpells.js
M303 — Enemy spells + champion modifiers: spellFx.js (5 element CSS animations w/reduce-motion fallback), 13 enemy spells in enemySpells.js (incl 3 boss wind-ups), spellList wired on 11 enemies/bosses with cooldowns + interrupt detection. 10 blue-name champion modifiers (regen/aura/fast/extra_strong/tough/cursed/shielded/lifesteal/thorns/inferno) with 5% spawn rate, stat-bumped HP/dmg, blue canvas name + tap-tooltip badges.
M3042026-04-26M302 — Gameplay batch 1: companion level-sync setting + party avg on save slots, flee-from-combat with DEX check (boss-immune), Rogue skills
M302 — Gameplay batch 1: companion level-sync setting + party avg on save slots, flee-from-combat with DEX check (boss-immune), Rogue skills Pilfer Magic + Hemorrhage, Warlock Soul Curse with on-death spread, skill-check map node type with 4 examples, node-overlay system (traveling merchant/memory minigame/bandit patrol — overlays must resolve before underlying node, no skip), per-spell DoT stacking modes (per_source/per_character/global) with tooltip stack counts.
M3032026-04-26M302 — Gameplay batch 1: companion level-sync, DEX-check flee, Pilfer Magic + Hemorrhage (Rogue), Soul Curse + curse-spread system (Warlock)
M302 — Gameplay batch 1: companion level-sync, DEX-check flee, Pilfer Magic + Hemorrhage (Rogue), Soul Curse + curse-spread system (Warlock), skill-check map nodes, node-overlay system (merchant/minigame/bandit), DoT stacking modes per-spell.
M3022026-04-26M302 — Gameplay batch 1: companion level-sync, DEX-check flee, Pilfer Magic + Hemorrhage (Rogue), Soul Curse + curse-spread system (Warlock)
M302 — Gameplay batch 1: companion level-sync, DEX-check flee, Pilfer Magic + Hemorrhage (Rogue), Soul Curse + curse-spread system (Warlock), skill-check map nodes, node-overlay system (merchant/minigame/bandit), DoT stacking modes per-spell.
M3012026-04-26M301 — Headless simulator + regression infra: scripts/lib/combat-sim.mjs (runCombat / runBatch), batch-rebalance with worker_threads + CSV,
M301 — Headless simulator + regression infra: scripts/lib/combat-sim.mjs (runCombat / runBatch), batch-rebalance with worker_threads + CSV, configurable regression-thresholds.json + check-regression.mjs hooked into release.sh, encounter-ratings drive color-coded difficulty in dungeon catalog, item-validation + affix-coverage scripts, save-load-test (auto-snapshots regression saves per milestone), loot-audit (merchant + guild + black market), combat trace export + combat-replay.html, status-matrix.html interaction grid, playthrough-sim full Act 1-5 seeded run with softlock detection.
M3002026-04-26M300 — Devtool batch 2: skill-sim.html (interaction simulator + 100-combat preview), affix-matrix.html (NxN cell grid with stack/conflict/mu
M300 — Devtool batch 2: skill-sim.html (interaction simulator + 100-combat preview), affix-matrix.html (NxN cell grid with stack/conflict/multiply/independent heuristic), spell-catalog compare mode (up to 4 spells side-by-side), asset-pipeline-trace.html (13 build scripts mapped), image-review-manifest cleanup (917→782 entries, 33.5 KB saved), character-redesign-archive (forward-only), rebalance-diff.html (snapshot-A vs snapshot-B color-coded delta).
M2992026-04-26M299 — Devtool catalogs + tools landing + live-data override system: scripts/emit-game-data.cjs prebuild step writes 10 JSON data files; new
M299 — Devtool catalogs + tools landing + live-data override system: scripts/emit-game-data.cjs prebuild step writes 10 JSON data files; new public/assets/data/data-source.js exposes getCompanions/Enemies/Dungeons/StatusEffects/Achievements/Skills/Affixes/Items/Bosses/Classes (with localStorage override + revert-to-default + milestone-snapshot scaffold). Five new catalog pages: companion-catalog.html, dungeon-catalog.html, status-effect-catalog.html, achievement-roadmap.html, plus tools.html landing.
M2982026-04-26M298 — Changelog/news/lore/monument: structured changelog (5-category badges) + new /assets/changelog.html. What's New splash on first boot
M298 — Changelog/news/lore/monument: structured changelog (5-category badges) + new /assets/changelog.html. What's New splash on first boot after each milestone (localStorage gate). Feature-shipped-in-M### badge helper applied to ~8 demonstrative spots. /assets/roadmap.html generated from the wishlist plan with progress bars. New in-game LoreCompendiumScreen with 25 Claude-authored entries across World/Factions/Bestiary/Locations/History/Arcana — unlocked by lore-node visits, boss kills, achievements. Hardcore monument on TitleScreen (only renders when fallen heroes exist); hardcore-death saves stay loadable as 'Fallen' slots with stats view + delete.
M2972026-04-26M297 — Keyboard navigation: new src/utils/keyboardNav.js helper wired into 13 menu screens (Title, CharacterBuilder, LoadGame, Settings, Tow
M297 — Keyboard navigation: new src/utils/keyboardNav.js helper wired into 13 menu screens (Title, CharacterBuilder, LoadGame, Settings, Town, Map, PartyPanel, Dialog, LevelUp, Achievements, Stats, StatsDashboard, GameMenu). Tab/arrows/Enter/Escape across grids/lists. Global :focus-visible gold ring (suppressed for pointer-initiated focus, so touch UX is unchanged). Combat: digit keys 1-N trigger action buttons during manual turns; full arrow-key target selection deferred per scope (noted in wishlist).
M2962026-04-26M296 — Accessibility batch: colorblind palettes (default + deuteranopia/protanopia/tritanopia) via CSS custom properties + Settings selector
M296 — Accessibility batch: colorblind palettes (default + deuteranopia/protanopia/tritanopia) via CSS custom properties + Settings selector. 80%/100%/120%/150% font-size scaling. Global 44×44px tap-target floor for buttons/links/inputs (WCAG AA) with .compact-target opt-out. Reduce-motion 3-way toggle (Auto/On/Off) with src/utils/motion.js helper, expanded coverage to parallax + dialog flashes. Combat captions mode (24px aria-live mirror of the combat log).
M2952026-04-26M295 — Polish batch: Enchanter upgrade preview tooltip with before/after stat deltas finalized. Potion belt — 3-slot quick-access consumable
M295 — Polish batch: Enchanter upgrade preview tooltip with before/after stat deltas finalized. Potion belt — 3-slot quick-access consumables per character, accessible during combat. Achievement-unlock toast (gold variant, 6s, tappable). 'What's New' shortcut in GameMenu reads release-summary.json (auto-emitted prebuild). Shared STATUS_META module with plain-language status descriptions. Boss-specific intro preludes — 2 lines per boss, 11 bosses authored.
M2942026-04-26M294 — UI batch 2: New unified PartyPanelScreen with Party/Inventory/Spells/Passives/Attributes tabs (old InventoryScreen + SkillTreeScreen
M294 — UI batch 2: New unified PartyPanelScreen with Party/Inventory/Spells/Passives/Attributes tabs (old InventoryScreen + SkillTreeScreen marked deprecated, kept in repo). Map 'Inventory' button renamed 'Party'. Zone fast-travel switches to a dropdown when 4+ zones are unlocked. Boss-intro splash with name auto-wrap and clamp() sizing for long boss names on iPhone. Dual-comparison mode for rings/offhand on desktop viewports.
M2932026-04-26M293 — Small UI batch 1: notification bubble bug fixed (skill-points clear without visiting Character screen), quick-equip toast on item pic
M293 — Small UI batch 1: notification bubble bug fixed (skill-points clear without visiting Character screen), quick-equip toast on item pickup, talent-effect preview tooltip on skill upgrades, scroll-position memory per character in inventory, status-effect duration tooltips on combat HUD, and SVG role badges on party screen (no emoji).
M2922026-04-26M292 — Migrated 74 approved brainstorm items + 19 manual additions into wishlist.html under a new milestone-grouped 'Approved Brainstorm' se
M292 — Migrated 74 approved brainstorm items + 19 manual additions into wishlist.html under a new milestone-grouped 'Approved Brainstorm' section (M293–M309 plan). Brainstorm.html now displays approved items in a separate non-interactive 'Approved' section with green checkmarks. CLAUDE.md updated so future sessions check the wishlist plan first.
M2912026-04-26M291 — DungeonScreen completion crash + lingering-overlay bugs fixed; LoadGameScreen now shows hero+companion roster on each save card; new
M291 — DungeonScreen completion crash + lingering-overlay bugs fixed; LoadGameScreen now shows hero+companion roster on each save card; new brainstorm.html with 100+ checkbox feature candidates and Copy-Prompt button (linked in Tools menu).
M2902026-04-26M290 — Sprite review batch (16 chars approved + 10 reference-anchored regens), Stats dashboard back-tap teardown, removed FF-style copy from
M290 — Sprite review batch (16 chars approved + 10 reference-anchored regens), Stats dashboard back-tap teardown, removed FF-style copy from manual combat toggle, sprite-adjust stacked layout fix with Stack Opacity slider.
M2892026-04-26M289 — Per-skill / per-element / per-source damage instrumentation flows into the Damage tab live; new Skill Cast Frequency chart; fight-kin
M289 — Per-skill / per-element / per-source damage instrumentation flows into the Damage tab live; new Skill Cast Frequency chart; fight-kind metadata enables Boss/Dungeon/Regular filter on the Damage tab. The 5-milestone stats batch (M285-M289) is shipped.
M2882026-04-26M288 — Character power tracking: per-hero power score (level + attrs + skills + passives + gear + HP/MP), snapshots on level-up and fight-en
M288 — Character power tracking: per-hero power score (level + attrs + skills + passives + gear + HP/MP), snapshots on level-up and fight-end, Power tab plots growth curves and role-mix donut.
M2872026-04-26M287 — Item + magic-find tracking: every drop (combat loot, dungeon chest, boss chest) now flows into stats so the Loot tab on the dashboard
M287 — Item + magic-find tracking: every drop (combat loot, dungeon chest, boss chest) now flows into stats so the Loot tab on the dashboard fills with rarity/zone/MF data live.
M2862026-04-26M286 — Cross-run analytics: enriched run archive (classes, hero names, dropsByRarity, powerPeaks, completion flags), auto-archive on final-b
M286 — Cross-run analytics: enriched run archive (classes, hero names, dropsByRarity, powerPeaks, completion flags), auto-archive on final-boss victory, Cross-Run tab adds class-playtime donut, lifetime loot donut, hardcore-deaths timeline, win-rate trend line.
M2852026-04-26M285 — chart.js dashboard with global filter bar (time range / hero / fight kind), 7-8 tabs, mode-aware (in-game vs main-menu with cross-run
M285 — chart.js dashboard with global filter bar (time range / hero / fight kind), 7-8 tabs, mode-aware (in-game vs main-menu with cross-run analytics), and the data infrastructure for M286-M289 (drops, damage by skill/element, damage taken by source, power series).
M2842026-04-26M279 — Massive feature batch: dungeons, manual FF-style combat, stats dashboard with charts, fixed-3 tavern pool, 10 wild companions, big-fi
M279 — Massive feature batch: dungeons, manual FF-style combat, stats dashboard with charts, fixed-3 tavern pool, 10 wild companions, big-fight encounters, fog-of-war default ON, prologue backlink purge, no-op Trailhead nodes, map screen Inventory/Town/Menu buttons, weapon-rec stat scaling, difficulty UI overhaul, first-town crash fix. Plus 26 NPC sprite regens (kaela/marek/mira/silas + chrono_f/demon_hunter_f) and 16 east-facing sprite flips.
M2832026-04-25M283 — Major bug-fix milestone. (1) AI hero spell-casting fixed: SKILLS values now stamped with .id keys so partyMember.skills filter actual
M283 — Major bug-fix milestone. (1) AI hero spell-casting fixed: SKILLS values now stamped with .id keys so partyMember.skills filter actually matches; auto-build adds parent skill ID to m.skills when buying a talent; AI defensively falls back to all-unlocked when filter empties. (2) Companion notification badge fixed (Tinker turret no longer ghost-pings the Spells tab). (3) Class pets like Clockwork Turret no longer leak across new games (DEFAULT_STATE shallow-copy bug deep-cloned arrays/objects on init). (4) Clockwork Turret + Veilspawn Herald sprites wired in SPRITE_MAP. (5) Sprite Adjust tool: reference panel now reads live sprite_adjustments.json (read-only with LIVE pill); target stays editable. (6) New Tinker SpriteCook art (east + 6 poses + reference sheet). (7) shaman_male/sorcerer/sorcerer_female/stormcaller per-pose adjustments applied. (8) Clockwork robot removed from hero appearance picker (filter companion-only). 277/277 tests pass.
M2822026-04-25M282 — Applied sorcerer_female + stormcaller per-pose sprite adjustments. Horizontally flipped 8 sprites (bard/cleric/demon_hunter/oracle_ol
M282 — Applied sorcerer_female + stormcaller per-pose sprite adjustments. Horizontally flipped 8 sprites (bard/cleric/demon_hunter/oracle_old/pyromancer/stormcaller/witch_hunter + tinker east). Image-review manifest regenerated (Tinker now appears, deprecated appearances like oracle_old filtered). image-review: new '1' column option for full-width view. sprite-adjust: Preview Animation button cycles south→east→attack→east→spell→east→block→east→ko (suppresses stacked overlay during preview); list counter no longer wraps.
M2812026-04-25M281 — Sprite Adjust 'Stacked' layout now overlaps reference + target in the same canvas (ref draws under target at 45% opacity) instead of
M281 — Sprite Adjust 'Stacked' layout now overlaps reference + target in the same canvas (ref draws under target at 45% opacity) instead of vertically splitting. Swap order flips which panel is the faded underlay. Mobile stacked uses the same single-cell overlap.
M2802026-04-25M280 — Statistics + achievements (Stats screen with Party/Lifetime/Achievements tabs, per-character story log, DPS canvas chart, achievement
M280 — Statistics + achievements (Stats screen with Party/Lifetime/Achievements tabs, per-character story log, DPS canvas chart, achievement toasts, 16 seeded achievements). Inventory mobile redesign (tap-to-modal with breadcrumbs, in-game info modals, hide inline equip on small screens). Sprite adjustments wired site-wide (CombatScreen + portraitImg + builders). Six new towns (Greenbough, Emberwatch, The Last Bastion, Void Harbor, Creation Rest, Scaleholt). Hardcore RIP view (saves preserved, read-only viewer). Full Fog of War (adjacent reveal, persistent). Map Seed consumer (deterministic events + tavern/merchant rolls). Sprite Adjust tool: nav menu link, mobile dropdown sidebar, rounded delta floats.
M2792026-04-25M279 — Sprite Adjust tool: full-screen desktop reviewer for per-(character,pose) scale + offset. Added sprite-adjustment v1 schema + empty c
M279 — Sprite Adjust tool: full-screen desktop reviewer for per-(character,pose) scale + offset. Added sprite-adjustment v1 schema + empty consumer JSON. Wired CombatScreen to apply adjustments at draw time. New Developer Tools card in /assets/.
M2782026-04-25M278 — Wave 3 (final 8 items of 22-item batch). Bug fixes: B4 loot chest opens immediately on map return regardless of path (drained from bo
M278 — Wave 3 (final 8 items of 22-item batch). Bug fixes: B4 loot chest opens immediately on map return regardless of path (drained from both onEnter + onResume), U9 boss chest items pre-rolled at victory + persisted (no save-scum reroll). Features: U10 per-character auto-equip toggle (with manual-unequip blocklist; uses Offense+Defense+Utility delta scoring), C16 auto-revive at combat end if any reviver alive (50% HP, bypasses cooldown). Polish: N1 veilspawn_herald sprite 7-pose set generated via SpriteCook (pending_approval), N2 prologue zone hidden from map navigation tabs. Balance: N3 enemy hit ~80% baseline (was 60-70 → fewer miss streaks early game), N4 +5-10 dmg on Act 1 trash + Act 1-2 bosses (hits no longer mitigated to 0-1). 277 tests passing. ALL 22 items shipped.
M2772026-04-25M278 — Wave 2 partial: Item Offense/Defense/Utility scoring with weight table (Diablo-3 style), inventory upgrade-glow tiers (5%/20%/50%/>50
M278 — Wave 2 partial: Item Offense/Defense/Utility scoring with weight table (Diablo-3 style), inventory upgrade-glow tiers (5%/20%/50%/>50% rainbow shimmer), empty-slot upgrade highlight, Alt-compare mode (desktop) + touch Compare button, hover-slot highlighting. Skill tree: per-tab Auto toggle with in-game ConfirmModal (no more browser confirm), green checkmark badge on auto tabs. Skills>Attributes panel now uses shared CharacterStatsPanel renderer matching Inventory layout (HP not Max HP, DR/MR in Derived). 270 tests passing.
M2762026-04-25M276 — Wave 1 of 22-item batch: Shield affix system fixed (Bulwark/Bracing magic+ shields only, Spellguard chest+legs+shields), Block + Bloc
M276 — Wave 1 of 22-item batch: Shield affix system fixed (Bulwark/Bracing magic+ shields only, Spellguard chest+legs+shields), Block + Block Power as base white stats, Inventory tooltip overlap stripped. Prologue zone (5 nodes solo, runs every new character + NG+). Difficulty system: Easy/Normal/Hard always asked, Easy auto-build defaults, Hard +10% XP / +20% MF, advanced options (Map Seed, Fog of War, Hardcore) persisted in gs.
M2752026-04-25M274 — CombatScreen modular extraction (3 of 4 modules + tests). New: _damagePipeline.js (resolveIncomingDamage), _aiTargeting.js (pickHeroA
M274 — CombatScreen modular extraction (3 of 4 modules + tests). New: _damagePipeline.js (resolveIncomingDamage), _aiTargeting.js (pickHeroAction), _backgroundRenderer.js (buildParallaxLayer). Pure data layers; CombatScreen wraps them with side-effects (timers, telemetry, executeSkill). 22 new tests (15 damage_pipeline_resolve, 7 ai_targeting). 251 tests total, all passing. CombatScreen.js: 4877 → 4761 lines (115 extracted), but more importantly the meter / damage pipeline / hero AI / parallax layer logic is now testable without DOM/instance state.
M2742026-04-24M273 — code-review batch 2 (all 9 items): hoisted _victory zone maps, structuredClone replaces JSON.parse(JSON.stringify), maxMp fallbacks v
M273 — code-review batch 2 (all 9 items): hoisted _victory zone maps, structuredClone replaces JSON.parse(JSON.stringify), maxMp fallbacks via computeMaxMp, flee-fail attack via canonical pipeline, _updateHud caches HUD refs (~32 querySelectors → 0 per call), tracked-setTimeout safety with auto-cleanup on screen pop. New: kill counter + boss-low-HP tracker (unblocks pyromancer + warlock unlocks). New tests: passives (5), damage_pipeline (12), meter (12) — 230 total tests, all passing. Modular extraction proof-of-pattern: _meterTracker.js (pure data layer); CombatScreen now delegates to it.
M2732026-04-24M272 — Code review batch fixes: (1) passives.js double-count fix (pyromancer/stormcaller no longer 2x bonus per point), (2) meter helpers la
M272 — Code review batch fixes: (1) passives.js double-count fix (pyromancer/stormcaller no longer 2x bonus per point), (2) meter helpers lazy-create enemy entries, (3) XSS fix on hero name in meter + report, (4) SaveManager validate-before-wipe on import, (5) rAF-coalesced meter renders, (6) Supabase sync for class unlocks (META_KEYS list). Wishlist updated with remaining review items (tests, refactor, setTimeout safety, kill counter). Also Tinker workshop dialog node in Dust Roads.
M2722026-04-24M272 — Wishlist sweep (flipped 11 M256-batch items to done, added M264-M271 shipped section + code-review review items), playtest checklist
M272 — Wishlist sweep (flipped 11 M256-batch items to done, added M264-M271 shipped section + code-review review items), playtest checklist for the M271 code review findings, milestone report in assets.json, rebalance report page updated with M268/M271 follow-ups, new Tinker workshop dialog node in Dust Roads with Ysolde Cogwright as optional lore encounter.
M2712026-04-24M270 — Clockwork Turret is now a Tinker talent unlock on Clockwork Bolt (matches Raise Skeleton / Forest Wolf / Bound Imp pattern) instead o
M270 — Clockwork Turret is now a Tinker talent unlock on Clockwork Bolt (matches Raise Skeleton / Forest Wolf / Bound Imp pattern) instead of a tavern hirable. Picking 'Deploy Turret' talent spawns pet_clockwork_turret into the party. Removed turret from COMPANIONS_ACT1 tavern pool.
M2702026-04-24M269 — Tinker class (clockwork mechanist, INT-primary): 4 skills (Clockwork Bolt / Alchemical Grenade / Quick-Fix / Overcharge), passive tre
M269 — Tinker class (clockwork mechanist, INT-primary): 4 skills (Clockwork Bolt / Alchemical Grenade / Quick-Fix / Overcharge), passive tree (manapool/manaflow/deadly/igniting/vampirism), hireable Ysolde Cogwright L3 in taverns, Clockwork Turret companion L3. Full 7-pose art for male+female + 5-pose companion art generated via OpenAI gpt-image-1.5. Unlocks after Act 1.
M2692026-04-24M269 — Tinker class (clockwork mechanist, INT-primary). 4 skills (Clockwork Bolt, Alchemical Grenade, Quick-Fix, Overcharge), passive tree (
M269 — Tinker class (clockwork mechanist, INT-primary). 4 skills (Clockwork Bolt, Alchemical Grenade, Quick-Fix, Overcharge), passive tree (manapool/manaflow/deadly/igniting/vampirism), hireable Ysolde Cogwright (L3) in taverns, Clockwork Turret companion (L3). Unlocks after Act 1. Art in progress via OpenAI gpt-image-2 — partial frames shipped.
M2682026-04-24M268 — Combat Report button added to defeat modal + final-boss victory modal; meter tracks enemies (toggle via 'E' checkbox or 'Show enemies
M268 — Combat Report button added to defeat modal + final-boss victory modal; meter tracks enemies (toggle via 'E' checkbox or 'Show enemies' in report); Magic Missile and other skills now attributed by name (not 'Attack'); tavern hires get skill + passive pending points per hire-level + auto-spend them; shared autoBuild module.
M2672026-04-24M267 — Granular DPS meter (DMG/HEAL/MIT modes), Combat Report drill-down (Character→Skill→individual hits) tracking lifesteal+barrier as hea
M267 — Granular DPS meter (DMG/HEAL/MIT modes), Combat Report drill-down (Character→Skill→individual hits) tracking lifesteal+barrier as heals and armor/block/spell-resist/barrier/dodge as mitigation. New rebalance report HTML page at /assets/rebalance-report.html with pure-SVG charts covering M264-M267 findings.
M2662026-04-24M266 — fix skill damageMult additive-stacking bug (tooltips now match combat: Shield Bash 4.9× → 2.0× at L19). 43/63 damage skills were ≥2×
M266 — fix skill damageMult additive-stacking bug (tooltips now match combat: Shield Bash 4.9× → 2.0× at L19). 43/63 damage skills were ≥2× overscale. Enemy HP dialed back 2.5×→2.0× to match new damage. Tooltips render effective multiplier via mergeSkillForCast. Hard-mode HP persistence fix (companion write-back). Loot-chest-after-town fix (no more polling loop). Full report at memory/skill-stacking-plan-m266.md.
M2652026-04-24M265 — Balance pass: +150% enemy HP, +10% damage via globalMultipliers (sim shows bosses at 10.1 avg rounds, goal hit); simulator shield blo
M265 — Balance pass: +150% enemy HP, +10% damage via globalMultipliers (sim shows bosses at 10.1 avg rounds, goal hit); simulator shield block parity added; balance-report + balance-sweep scripts for future tuning.
M2642026-04-24M264 — sim and combat AI now respect member.skills so a knight who only picked Shield Bash no longer auto-casts Holy Strike or Taunt. This i
M264 — sim and combat AI now respect member.skills so a knight who only picked Shield Bash no longer auto-casts Holy Strike or Taunt. This is the primary sim-vs-playtest divergence for Ylva.
M2632026-04-24M263 — approve 4 new NPCs (Silas/Kaela/Marek/Mira frames synced to SpriteCook), Character Redesign 'hide fully approved' self-heals from sta
M263 — approve 4 new NPCs (Silas/Kaela/Marek/Mira frames synced to SpriteCook), Character Redesign 'hide fully approved' self-heals from stale top-level status (chrono female etc), New Game+ button wraps to its own line, sim adds skill.effect.lifesteal path + bonusVs* (not just dmgBuffVs*) for Holy-Strike-family.
M2622026-04-24M262 — Combat log Secondary checkbox inline (no 2-col); granular Combat Report (per-hit log w/ round, source, target, crit, overkill, mitiga
M262 — Combat log Secondary checkbox inline (no 2-col); granular Combat Report (per-hit log w/ round, source, target, crit, overkill, mitigation, overheal); draggable Meter panel; sim alignment (non-healers no longer spam Taunt/dmgReduct buffs, skill damage now includes weaponFlavor + vs-demon/undead bonuses + life steal on skill hits).
M2612026-04-24M261 — Combat Sim vs Playtest AI parity (mergeSkillForCast + personality), in-combat DPS/Heal meter panel + post-combat Combat Report, Level
M261 — Combat Sim vs Playtest AI parity (mergeSkillForCast + personality), in-combat DPS/Heal meter panel + post-combat Combat Report, Level-Up hides Spend Now when auto-build consumed all points.
M2602026-04-24M260 — Quest indicators on dialog nodes (Seer/Warden/Runestone/Ashen), 5 new mid-path map nodes in Acts 1a/1b, World-of-Emberveil story sect
M260 — Quest indicators on dialog nodes (Seer/Warden/Runestone/Ashen), 5 new mid-path map nodes in Acts 1a/1b, World-of-Emberveil story section on assets gallery.
M2592026-04-23M258 batch 4 — Ember Watch town color brightened, Combat log Secondary-effects toggle to declutter status spam.
M258 batch 4 — Ember Watch town color brightened, Combat log Secondary-effects toggle to declutter status spam.
M2582026-04-23M257 batch 3 — level-up auto-detail badges (+1 STR, +1 CON per hero), combat overkill indicator, spell damage formula aligned with Skills pa
M257 batch 3 — level-up auto-detail badges (+1 STR, +1 CON per hero), combat overkill indicator, spell damage formula aligned with Skills panel preview.
M2572026-04-23M256 batch 2 — 4 NPC reference sheets generated (Silas, Kaela, Marek, Mira) + registered in APPEARANCES with playable:false so they stay out
M256 batch 2 — 4 NPC reference sheets generated (Silas, Kaela, Marek, Mira) + registered in APPEARANCES with playable:false so they stay out of character-creation / tavern-hire pools. Ready for user approval on character-redesign page.
M2562026-04-23M256 batch 1 — 20% XP baseline, spell damage formula converged to skills-panel preview (static_field was 65, now ~29), Hard hides Back-to-To
M256 batch 1 — 20% XP baseline, spell damage formula converged to skills-panel preview (static_field was 65, now ~29), Hard hides Back-to-Town + no waypoint teleport, cross-zone line origin skips towns, Scorched Hermit-type cross-zone arrival node auto-triggers its event, loot chest waits for level-up to close, completed-node indicator with no revisit popup, Salvage All button on Blacksmith.
M2552026-04-23M255 — P1 new-game companion leak fixed (war_dog carried across New Game because init() spread DEFAULT_STATE and inherited mutated array ref
M255 — P1 new-game companion leak fixed (war_dog carried across New Game because init() spread DEFAULT_STATE and inherited mutated array refs). Hero-sub color → new --parchment variable (#dfd1c2) matching in-game menu text. Front-page News entry for M220-M254 arc added (+ nav link), standalone /news/m220-m254-consolidation.html report page.
M2542026-04-23M254 P0 HOTFIX — circular import TownScreen↔CharacterBuilderScreen broke play.html at init ('Cannot access Vr before initialization'). Extra
M254 P0 HOTFIX — circular import TownScreen↔CharacterBuilderScreen broke play.html at init ('Cannot access Vr before initialization'). Extracted name-gen to standalone src/game/nameGen.js that both screens import instead.M2532026-04-23M253 — catalog extractor fixes: passives (0→19 classes) + status effects (2→58) via src/ scan. Affixes + encounters + quests + passives + st
M253 — catalog extractor fixes: passives (0→19 classes) + status effects (2→58) via src/ scan. Affixes + encounters + quests + passives + status-effects all live at /assets/data-catalogs.html.
M2522026-04-23M251 content migration + BY THE NUMBERS rework — new front-page sections for Tap Weapons & Utilities, Combat System, and Six Acts (with ques
M251 content migration + BY THE NUMBERS rework — new front-page sections for Tap Weapons & Utilities, Combat System, and Six Acts (with quests + dragon epilogue). Retired the trivial HP/MP chart; added Act 1 drop-rarity chart showing post-M236 rebalance + Magic Find shift.
M2512026-04-23M251 — 6 new towns in zones that didn't have one (Greenbough/Emberwatch/Last Bastion/Void Harbor/Creation Rest/Scaleholt), attached to mid-p
M251 — 6 new towns in zones that didn't have one (Greenbough/Emberwatch/Last Bastion/Void Harbor/Creation Rest/Scaleholt), attached to mid-path nodes with discoverOnVisit so they reveal only when reached. Waypoint flag system + Forest Warden waypoint so Hard mode has fast-travel equivalents. Unlockable classes card layout matches playable (1:1 contain, no more landscape crop). Front-page BY THE NUMBERS rework queued in wishlist.
M2502026-04-23M250 P0 — fix black screen on mobile (reverted document.documentElement.clientWidth which returned 0 on some browsers at init; using window.
M250 P0 — fix black screen on mobile (reverted document.documentElement.clientWidth which returned 0 on some browsers at init; using window.innerWidth with pinch-zoom guard via visualViewport.scale). Companions + bosses grids unified to auto-fill (no more cramped 5-col on mobile). New post-deploy smoke test script verifies play.html structure + chunk hashes.
M2492026-04-23M242g — game-info page removed, Home link added to nav. Wishlist entries added for map expansion (2x nodes), towns-in-every-map, Hard-diffic
M242g — game-info page removed, Home link added to nav. Wishlist entries added for map expansion (2x nodes), towns-in-every-map, Hard-difficulty Thornwood fast-travel, and game-info content migration — all with explicit scope reasons.
M2482026-04-23M242f — Hire Custom full redesign (cb-* templates), 5 data-catalog pages, combat grid placement honors margins + scales + offsetPct/alternat
M242f — Hire Custom full redesign (cb-* templates), 5 data-catalog pages, combat grid placement honors margins + scales + offsetPct/alternateStagger, 'Show Grid Placement' checkbox (replaces inaccurate squares/rows/columns), mobile pinch-zoom pinned to layout viewport to stop sprite rescaling.
M2472026-04-23M242e — Hire Custom redesign uses .cb-* templates (gold/brown, 480 max-width, centered, 3-row scrollable appearance grid, Estimated Stats pr
M242e — Hire Custom redesign uses .cb-* templates (gold/brown, 480 max-width, centered, 3-row scrollable appearance grid, Estimated Stats preview panel). Skills tab shows talent+passive points remaining in the subtitle.
M2462026-04-23M242d — difficulty choice as first New-Game step (persists to localStorage), cross-zone left arrow always visible (dimmed when inactive), po
M242d — difficulty choice as first New-Game step (persists to localStorage), cross-zone left arrow always visible (dimmed when inactive), post-boss first-node auto-activate, miss-tooltip in combat log, news post summarizing M220-M245 arc.
M2452026-04-23M242c — thumbnail gen copies through small images so /assets/ no longer 404s for pyromancer_portrait etc. Unlock All Classes bug fixed (Obje
M242c — thumbnail gen copies through small images so /assets/ no longer 404s for pyromancer_portrait etc. Unlock All Classes bug fixed (Object.keys on array was returning indices). Combat/Map Debug moved from Cheat Menu into Debug Settings. Settings toggles use CSS grid (no more wrapping under the switch). Combat Debug defaults updated per user spec (columns/2x/1.5x/1.5x/2x). Map Debug margin defaults 5%/2.5%/5%/2.5%. Speed button cycles pause/1x/2x/4x when combat-debug is on, starts paused. Combat debug button moved up (no longer covers pause). Gendered name system (each name has gender tag, tavern + Create Hero + Hire Custom respect appearance gender). Quest indicators on map nodes + legend entry.
M2442026-04-23M242b — random-name dice button on Create Hero + Hire Custom (shared name pool). Tavern class dedup: class already on party OR bench is now
M242b — random-name dice button on Create Hero + Hire Custom (shared name pool). Tavern class dedup: class already on party OR bench is now excluded from roster roll. Wishlist entries for Hire Custom template-share refactor and game-info consolidation with specific risk reasons.
M2432026-04-23M242a — 8 regen approvals synced to in-game; cleric ref reverted to M217. Clouds tile fix for in-game main menu (full-width tiling, no more
M242a — 8 regen approvals synced to in-game; cleric ref reverted to M217. Clouds tile fix for in-game main menu (full-width tiling, no more seam). Sign-out email stacked above button. Tavern hire bug fixed (lookup now finds rolled templates). Duplicate-name dedupe per tavern. Map/Combat debug: transparent backdrop + draggable header + auto-pause combat when debug auto-open enabled. Other Effects cleanup (no STR/INT/DEX/CON, no duplicate Spell Power). Appearance display names shortened (Arcane Mage → Mage). 27 gender variants added to APPEARANCES.
M2422026-04-23Gallery: Heroes section renamed to Classes.
Gallery: Heroes section renamed to Classes.
M2412026-04-23M236 batch F — 8 sprite regens redone with canonical art_direction prompts (cleric ref, war_dog east+east_ko, chronomancer_female south, wit
M236 batch F — 8 sprite regens redone with canonical art_direction prompts (cleric ref, war_dog east+east_ko, chronomancer_female south, witch_hunter east_spell, druid east, knight portrait, paladin east_block). Sync-pixellab-to-spritecook script resolves the 'approved sprite still shows old in game' bug (necromancer / mage). Clouds: deleted 06/07/08, wired clouds_08b dual-layer same-direction at 0.65 alpha on front page + game main menu. Gallery rewritten to render canonical 6-pose grid (no more E-FLIP garbage). Memory + docs updated with the 'never invent character descriptions' rule.
M2402026-04-23M236 batch E — 9 identity-locked character redesign regens via SpriteCook (108 credits), saved to pending-review/ + flagged in state.json fo
M236 batch E — 9 identity-locked character redesign regens via SpriteCook (108 credits), saved to pending-review/ + flagged in state.json for user approval. Character-redesign page shows pending versions with NEW★ badge. Intro banner rewrite (Silas Veilward). quests.js scaffold: Silas/Kaela/Marek recurring NPCs, 5 main-quest acts auto-completing on boss kill, 10 side quests. Boss first-kill grants a bonus high-tier Loot Chest (one-time per boss node). Revisited combat nodes drop at -50% chance (farm-gate). Dialog outcomes can now trigger a specific encounter on failure.
M2392026-04-23Front-page hero now shows clouds_07 (top-back reverse drift) + clouds_08 (mid-back) + clouds_06 (front, existing) as three parallax layers,
Front-page hero now shows clouds_07 (top-back reverse drift) + clouds_08 (mid-back) + clouds_06 (front, existing) as three parallax layers, with data-cloud attributes so the user can inspect devtools to identify which strip is which.
M2382026-04-23M236 Batch C — Clouds_07/08 generated via SpriteCook (24 credits total), wired as three-layer parallax on TitleScreen. Wishlist entries upda
M236 Batch C — Clouds_07/08 generated via SpriteCook (24 credits total), wired as three-layer parallax on TitleScreen. Wishlist entries updated.
M2372026-04-23M236 Batch B — Attribute Rating scaling softens late-game caster damage (>attr 20 scales 0.6x), PASS/FAIL roll animation, Loot Chest modal a
M236 Batch B — Attribute Rating scaling softens late-game caster damage (>attr 20 scales 0.6x), PASS/FAIL roll animation, Loot Chest modal at Treasure nodes with 2-3 picks, Magic Find affix + Act 1 rebalance (50% normal on border_roads), audit-sprite-404s.cjs + redirect-assets-to-spritecook.cjs (164 gallery entries migrated to approved spritecook paths). Character-redesign pending-only default ON.
M2362026-04-23M236 Batch A — Attrs panel order restored (STR/DEX/INT/CON at top). Combat + Map debug converted to auto-open toggles (enable in Settings in
M236 Batch A — Attrs panel order restored (STR/DEX/INT/CON at top). Combat + Map debug converted to auto-open toggles (enable in Settings in advance, no more 'enter combat and click button' dead-end). Fast travel legend entry. Hard-mode cleric pricing + walk-only travel. Seeded random events. Attack Speed default ON. Wishlist page overhaul (hide-completed filter, quick-select, copy(N), supporting-mechanics wrap fix). Several shelved items promoted to done with explicit investigation notes.
M2352026-04-23M231 — Attack Speed runtime, shipped OFF by default behind a feature flag. Toggle at Settings → Debug → Attack Speed. Fast weapons get +1 bo
M231 — Attack Speed runtime, shipped OFF by default behind a feature flag. Toggle at Settings → Debug → Attack Speed. Fast weapons get +1 bonus attack per round, Very Fast gets +2, via the existing extraAction splice mechanic — zero cost when the flag is off. Revert = flip the toggle or delete the three [M231 AS] call sites in CombatScreen.js.
M2342026-04-23M233-M234 (Batch 4 partial, Deploy #4) — Fast-travel namesake: always-visible Back-to-Town button with instant teleport to nearest visited t
M233-M234 (Batch 4 partial, Deploy #4) — Fast-travel namesake: always-visible Back-to-Town button with instant teleport to nearest visited town (replaces portal scrolls), blue waypoint rings on visited town nodes, one-tap teleport to any visited town in the viewed zone. Difficulty Normal/Hard setting (Normal auto-heals on town entry; Hard preserves HP/MP; Hard→Normal heals). M235-M242 explicitly deferred with visible wishlist entries (no silent shelving).
M2322026-04-23M228-M232 (Batch 3) — Attributes tab reorder (Derived → Attributes → Other Effects to match Inventory) + missing tooltips, skill-check % dis
M228-M232 (Batch 3) — Attributes tab reorder (Derived → Attributes → Other Effects to match Inventory) + missing tooltips, skill-check % display on dialog badges (M229 partial — roll animation + STR Rating affix deferred), attack-speed data model on weapon bases (M230), character-redesign page gets bg-color toggle + pending-only filter + M217 snapshot option (M232 partial — sprite regens wishlisted). M231 Attack Speed runtime explicitly deferred (isolated revert target).
M2272026-04-23M223-M227 (Batch 2) — Town sidebar overhaul (bigger portraits, click-dropdown to Inventory/Skills/Manage Party, companion HP bars), nav-bar
M223-M227 (Batch 2) — Town sidebar overhaul (bigger portraits, click-dropdown to Inventory/Skills/Manage Party, companion HP bars), nav-bar reorder (Guild Hall before Black Market, lime-green tab), hireable-heroes overhaul (seeded per-class generic templates with gender-aware appearance), slot-based merchant stock (one per armor slot + jewelry chance), game seed infrastructure (gs.gameSeed), and Recommend/Auto-build on Skills/Passives/Attributes (class-specific heuristics, drain-on-open for auto-apply).
M2222026-04-23M222 — Save-game skip bug fix (boss auto-advance now lands on new zone's first node with visitNode+setZoneNode) and auto-updated milestone b
M222 — Save-game skip bug fix (boss auto-advance now lands on new zone's first node with visitNode+setZoneNode) and auto-updated milestone badge on landing page (imports MILESTONE from src/version.js which release.sh regenerates).
M2192026-04-22M219 — Log Images debug tracing (imageLog.js, wired into CombatScreen, spriteUtils/portraitImg, TownScreen, InventoryScreen) plus floating C
M219 — Log Images debug tracing (imageLog.js, wired into CombatScreen, spriteUtils/portraitImg, TownScreen, InventoryScreen) plus floating Combat Debug and Map Debug gear buttons on those screens (visible in debug mode, placeholder modal).
M2182026-04-22M219 — Log Images debug tracing (imageLog.js, wired into CombatScreen, spriteUtils/portraitImg, TownScreen, InventoryScreen) plus floating C
M219 — Log Images debug tracing (imageLog.js, wired into CombatScreen, spriteUtils/portraitImg, TownScreen, InventoryScreen) plus floating Combat Debug and Map Debug gear buttons on those screens (visible in debug mode, placeholder modal).
M2172026-04-22M217 — 14 character art regens across 8 classes. Fixed chronomancer_male bobblehead (east + 3 action frames), chronomancer_female south (col
M217 — 14 character art regens across 8 classes. Fixed chronomancer_male bobblehead (east + 3 action frames), chronomancer_female south (color + pose distinct from east), dragon_knight_male south (removed phantom 2nd hammer), runesmith_male east_attack (restored legs), runesmith_female south (broader smith build matching east), shadow_dancer_female south+east (full-canvas scale), swashbuckler_male south+east_block and swashbuckler_female east+east_block (full-body with legs visible). Adopted sorcerer_male east_spell as canonical sizing reference for future character gens.
M2162026-04-22M216 — War Dog sprite redesigned: dropped the OpenAI 'bulldog in plate armor' look. New SpriteCook 5-pose set (portrait, south, east, east_a
M216 — War Dog sprite redesigned: dropped the OpenAI 'bulldog in plate armor' look. New SpriteCook 5-pose set (portrait, south, east, east_attack, east_ko) with studded leather collar, frayed red bandana, and leather chest strap — companion-dog decoration, no armor.
M2152026-04-22M215 — clouds_06.png (gpt-image-1.5, pixel-art red-tinted fluffy clouds, tileable) replaces 04/05 on both the in-game TitleScreen and the fr
M215 — clouds_06.png (gpt-image-1.5, pixel-art red-tinted fluffy clouds, tileable) replaces 04/05 on both the in-game TitleScreen and the front page index.html. Prior attempts kept on disk for comparison; wishlist updated. gpt-image-2 still gated behind OpenAI org verification.
M2142026-04-22M214 — Cloud asset clouds_05.png added (generated via gpt-image-1.5; gpt-image-2 attempted first but requires org verification). Wired as th
M214 — Cloud asset clouds_05.png added (generated via gpt-image-1.5; gpt-image-2 attempted first but requires org verification). Wired as the primary top cloud layer on the website front page index.html so it can be visually inspected and hand-edited. Game TitleScreen continues using clouds_04.png. Wishlist updated with asset-cleanup note. Memory (new_game_template + user auto-memory) updated to prefer gpt-image-2 with gpt-image-1.5 fallback for future image generation.
M2132026-04-22M213 — Settings: Share Anonymous Data moved out of Debug submenu. Title menu: more opaque buttons (rgba 0.33), softened auth card styling, n
M213 — Settings: Share Anonymous Data moved out of Debug submenu. Title menu: more opaque buttons (rgba 0.33), softened auth card styling, new 3-button landing (Sign In / Create Account / Continue with Google) with modal email+password flow, title changed to 'Save your progress online'. Keyboard nav: toggles focusable via Space/Enter on title + settings screens. Clouds: new red-hue cloud_04.png (OpenAI gpt-image-1), single-layer for now with 4 sprites; old clouds retained on disk for rollback. Save sync: fingerprint UUID added to save records; mergeWithCloud() reconciles local+cloud on sign-in with latest-wins and no data loss, replacing the prior upload-only prompt.
M2122026-04-22M212 — Hotfix: Inventory screen crashed with 'getPassiveBonuses is not defined' (missing import added in M211). One-line import fix in Inven
M212 — Hotfix: Inventory screen crashed with 'getPassiveBonuses is not defined' (missing import added in M211). One-line import fix in InventoryScreen.js.
M2112026-04-22M211 — Telemetry scaffold (opt-in anonymous gameplay data). Client-side queue + sanitization + session UUID in src/game/telemetry.js; Settin
M211 — Telemetry scaffold (opt-in anonymous gameplay data). Client-side queue + sanitization + session UUID in src/game/telemetry.js; Settings toggle; first-launch opt-in modal on TitleScreen; privacy policy at /assets/privacy.html. Transport endpoint null — activation steps in public/docs/telemetry.md (Supabase table + edge function + setTelemetryEndpoint + per-event wiring). Wishlist entry added to Technical Debt Registry.
M2102026-04-22M210 — Combat log clarity + tap weapon tooltip. Damage breakdown tooltip now itemizes barrier absorb, damage-buff reduction, marked amplific
M210 — Combat log clarity + tap weapon tooltip. Damage breakdown tooltip now itemizes barrier absorb, damage-buff reduction, marked amplification, soulbind split, and life/mana steal instead of an opaque 'Post-mitigation' subtotal. Tap weapons now show dealt (post-armor) + rolled in the log with hoverable breakdown. Life steal surfaced inline on hero attack/skill log lines.
M2092026-04-22M209 — Damage Reduction stat row on Inventory screen showing combined curve-DR from Armor + misc (passives). Armor tooltip updated to reflec
M209 — Damage Reduction stat row on Inventory screen showing combined curve-DR from Armor + misc (passives). Armor tooltip updated to reflect curve-DR formula (was still saying 'flat'). Curve-DR has been live since M207 — this fixes the UI lag.
M2082026-04-22M208 — Tuned balance preset for solo-lethality arc. Solos cap at Act 2-3; balanced 3-hero parties reach Act 4-5. Ships via data swap (balanc
M208 — Tuned balance preset for solo-lethality arc. Solos cap at Act 2-3; balanced 3-hero parties reach Act 4-5. Ships via data swap (balance.active.json). 100-iter seeded sim validates gating; revertable via baseline.
M2072026-04-22M207 Rebalance M3/4 — armor curve-DR formula (DR=min(0.95, armor/(armor+100))) replaces flat+legacy mitigation paths in both live combat and
M207 Rebalance M3/4 — armor curve-DR formula (DR=min(0.95, armor/(armor+100))) replaces flat+legacy mitigation paths in both live combat and simulator. Tap Power shipped as combat.tap.globalMult config knob (affix-roll integration deferred to keep M3 focused on the load-bearing DR change). Sim verifies meaningful shift: balanced party now clears Act 1 fully. All 202 tests pass on defaults.
M2062026-04-22M206 Rebalance M2/4 — headless simulator CLI at sim/ playing full Act 1→Act 6 runs for 3 policies (balanced, greedy-damage, greedy-tank). De
M206 Rebalance M2/4 — headless simulator CLI at sim/ playing full Act 1→Act 6 runs for 3 policies (balanced, greedy-damage, greedy-tank). Deterministic Mulberry32 seeded, 100 iters/policy in <1s, JSON report output. Primary tuning harness for M208.
M2052026-04-21M205 — Rebalance arc M1: extracted balance config to JSON (baseline + active), added balance-loader, wired formulas/xp/items/HireBuilder to
M205 — Rebalance arc M1: extracted balance config to JSON (baseline + active), added balance-loader, wired formulas/xp/items/HireBuilder to read from config. Baseline preset reproduces M64 gameplay exactly (all 202 tests pass). Zero behavior change. Adds global multiplier knobs for future M4 tuning pass.
M2042026-04-21M204 — SpriteCook pipeline batch: 8 new 7-pose sets (monk/paladin/pyromancer/ranger × male+female = 56 frames), 4 approved-regens (cleric_ma
M204 — SpriteCook pipeline batch: 8 new 7-pose sets (monk/paladin/pyromancer/ranger × male+female = 56 frames), 4 approved-regens (cleric_male:east, druid:south, necromancer_female:south, mage:east_spell), ranger_male reference sheet regenerated. Plus appearance gender filter UI (All/Male/Female, grouped-by-class, FA mars/venus icons).
M2032026-04-21M203 — repair pixellab_redesign_state entries for cleric/druid/mage/necromancer (restore artDirectionPath so female variants appear on revie
M203 — repair pixellab_redesign_state entries for cleric/druid/mage/necromancer (restore artDirectionPath so female variants appear on review page)
M2022026-04-21M202 — 7-pose sets for Cleric/Druid/Mage/Necromancer (male+female) + Oracle Male east regen; 57 frames via SpriteCook pixel pipeline, refere
M202 — 7-pose sets for Cleric/Druid/Mage/Necromancer (male+female) + Oracle Male east regen; 57 frames via SpriteCook pixel pipeline, reference-locked, pending user approval
M2012026-04-21M201 — regen knight reference+portrait with JET BLACK hair fix; regen 12 legs-cut-off frames (bard, bard_female, fighter, warlock, warlock_m
M201 — regen knight reference+portrait with JET BLACK hair fix; regen 12 legs-cut-off frames (bard, bard_female, fighter, warlock, warlock_male) with new ANTI-CROP clause; regen bard_female south with ANATOMY LOCK (fixes 3-arms/2-lutes/bobblehead); regen oracle_male east with hood-up POSE. Approved and shipped stormcaller + stormcaller_female (both genders fully signed off).
M2002026-04-21M200 — regenerate 2 frames flagged in M199 (stormcaller_female east_block, oracle_male south). Tightened stormcaller east_block pose (lightn
M200 — regenerate 2 frames flagged in M199 (stormcaller_female east_block, oracle_male south). Tightened stormcaller east_block pose (lightning shell hugs silhouette instead of a dome) and swapped oracle_male south's old SCALE clause for the canonical 85%-fill FRAMING block. Both came back valid RGBA/transparent-corners but slightly under canonical size (190x190 and 186x186 vs 200x200). Canvas drawImage normalizes display size, so in-game visual parity is preserved; deviations explicitly noted in art_direction JSONs for review on the approval page. 24 credits. Promoted stormcaller_female and oracle_male to full pending_approval.
M1992026-04-21M199 — fix M198 regression: 57 character sub-sprite frames were downloaded from /raw endpoint (1024x1024 RGB white bg) instead of /pixel (20
M199 — fix M198 regression: 57 character sub-sprite frames were downloaded from /raw endpoint (1024x1024 RGB white bg) instead of /pixel (200x200 RGBA transparent). Re-downloaded from correct endpoint, zero credits re-spent. Added strict post-download validation (200x200 + transparent corners required) to the wire pipeline. Codified rigid SpriteCook download contract in public/docs/image-policy.md and the pipeline memory. FLAGGED for user: 2 frames (stormcaller_female east_block, oracle_male south) came back smart-cropped below 200px and are removed from disk pending regeneration decision.
M1982026-04-21M198 — character art redesign batch 12: 59 SpriteCook frames (708 credits). Promoted fighter_female, stormcaller_female, bard(+f), warlock(+
M198 — character art redesign batch 12: 59 SpriteCook frames (708 credits). Promoted fighter_female, stormcaller_female, bard(+f), warlock(+m), knight(+m) to pending_approval with full 7-pose sub-sprite sets. Regenerated oracle_male south+east_spell (prior blank renders) and fighter east_attack with forced mid-swing prompt. Baked a 15KB min-size check into the wire pipeline to catch blank PNGs. Strengthened bard and ranger east_attack prompts to read as clear MID-STRIKE actions.
M1972026-04-21M197 — first sub-sprite batch: 21 pose frames generated for Fighter, Oracle (Male), Stormcaller via SpriteCook MCP with reference_asset_id f
M197 — first sub-sprite batch: 21 pose frames generated for Fighter, Oracle (Male), Stormcaller via SpriteCook MCP with reference_asset_id for style consistency. Added section headers to character redesign review page (Pending Approval / Fully Approved / Partially Approved / Reference Generated / Pending) to triage at a glance.
M1962026-04-21M196 — add the last 4 gender-variant character references: monk_female, oracle_male, shaman_male, sorcerer_female. Every base class now has
M196 — add the last 4 gender-variant character references: monk_female, oracle_male, shaman_male, sorcerer_female. Every base class now has both male and female reference art. Next pass: user reviews/approves, then frame generation for the 7 canonical poses begins.
M1952026-04-21M195 — character redesign: full-body framing refresh for rogue (female) + stormcaller (male, now booted), plus 19 new gender-variant referen
M195 — character redesign: full-body framing refresh for rogue (female) + stormcaller (male, now booted), plus 19 new gender-variant references (warrior/fighter/paladin/bard/mage/necromancer/demon_hunter/scavenger/swashbuckler/stormcaller/tactician/runesmith/witch_hunter as female; rogue/cleric/warlock/dragon_knight/pyromancer/druid as male). Prompt generator now enforces full-body head-to-toe framing, cross-roster scale consistency, and mandatory footwear. Lightbox added to character-redesign.html for click-to-zoom and next/back navigation across variants.
M1942026-04-21M194: framing + cross-roster scale policy (GLOBAL_ANCHORS + image-policy.md), regen 4 full-body refs (demon_hunter, fighter, stormcaller, sw
M194: framing + cross-roster scale policy (GLOBAL_ANCHORS + image-policy.md), regen 4 full-body refs (demon_hunter, fighter, stormcaller, swashbuckler), lightbox with prev/next on character redesign page.
M1932026-04-21M193 — Character redesign batch 7: demon_hunter (human, red glowing eyes, no horns), dragon_knight (2h dragon hammer only, no sword), rogue/
M193 — Character redesign batch 7: demon_hunter (human, red glowing eyes, no horns), dragon_knight (2h dragon hammer only, no sword), rogue/fighter/tactician (taller adult proportions, no more bobbleheads), shadow_dancer (pure human, no elf/dwarf), witch_hunter (sword + crossbow, no flintlock — crossbows now approved as a weapon type in-world). Renamed /assets/pixellab-redesign.html → /assets/character-redesign.html with refreshed copy and a sticky floating toggle for showing sub-sprite frames per class.
M1922026-04-21M192 — PixelLab redesign page: group each class by old portrait / male / female, move art-direction text under each reference as collapsible
M192 — PixelLab redesign page: group each class by old portrait / male / female, move art-direction text under each reference as collapsible. Easier to spot gender miscategorization before regenerating more sprites.
M1912026-04-21M191 — Character art redesign batch 6: regenerated 22 reference sprites with fixed prompts (fighter scale, rogue red hair + daggers, mage/ne
M191 — Character art redesign batch 6: regenerated 22 reference sprites with fixed prompts (fighter scale, rogue red hair + daggers, mage/necromancer hoods up, cleric not bald, scavenger human not hyena, tactician bright not silhouetted, warrior horned-helm + 2h axe, druid green hood no antlers, runesmith blacksmith not dwarf). Added male variants for ranger/knight/shadow_dancer and female variant for chronomancer. Removed shadow_cat from redesign.
M1902026-04-21M190 — necromancer + mage references regenerated with youthful identities
M190 — necromancer + mage references regenerated with youthful identities
M1892026-04-21M189 — fix bulk-scaffolded art prompts (18 classes) to match existing OpenAI portraits; regen fighter + paladin references with accurate des
M189 — fix bulk-scaffolded art prompts (18 classes) to match existing OpenAI portraits; regen fighter + paladin references with accurate descriptions
M1882026-04-21M188 — SpriteCook mass reference generation: new reference frames for all 27 playable classes, Oracle new art swapped in with old preserved
M188 — SpriteCook mass reference generation: new reference frames for all 27 playable classes, Oracle new art swapped in with old preserved as 'Oracle (Classic)' appearance option, float-display rounding fixes, forge weapon variety, combat-sim debug gating, login card on title screen.
M1872026-04-20M187 — Settings cleanup: Disable Backgrounds + Disable Sprites moved under Debug Mode submenu; sprites-off now swaps town/party portraits fo
M187 — Settings cleanup: Disable Backgrounds + Disable Sprites moved under Debug Mode submenu; sprites-off now swaps town/party portraits for class icons (appearance variants ignored when sprites are off — class icon wins) and the main-menu background respects the flag at draw-time. Music and SFX volume rows gained On/Off checkboxes that hard-mute (pauses media elements so iOS Safari stops reporting an active media session, letting users play their own audio). Combat Simulator Data section is now hidden unless both Debug Mode and Combat Simulator flags are on. Bug fix: random-event dialog nodes (e.g. 'Shady Wanderer') now display the resolved NPC's name on the map and tooltip — the assigned event is persisted per save (gs.assignedRandomEvents) so the label and the event the player encounters always match.
M1862026-04-19M186 — Removed translucent dark gradient overlay that was drawn on top of HD combat backgrounds behind characters; HD art now visible unobst
M186 — Removed translucent dark gradient overlay that was drawn on top of HD combat backgrounds behind characters; HD art now visible unobstructed.
M1852026-04-19M185 — Dead-code cleanup: removed orphaned ForgeScreen.js (fully replaced by the Blacksmith town service in M64+) and the dead _forgeHTML me
M185 — Dead-code cleanup: removed orphaned ForgeScreen.js (fully replaced by the Blacksmith town service in M64+) and the dead _forgeHTML method + ForgeScreen import in TownScreen. Data-forge-* event hooks used by the Blacksmith tabs kept.
M1842026-04-19M184 — Enchanter affix-preview tooltips. Each 'Add Property' button now hovers with the list of possible affixes it could roll (name, stat,
M184 — Enchanter affix-preview tooltips. Each 'Add Property' button now hovers with the list of possible affixes it could roll (name, stat, and tier-scaled min-max range), so players know what they're paying for before committing materials.
M1832026-04-19M183 — Drop fake-HUD combat backgrounds. The old _1/_2/_3 combat backgrounds (generated Apr 16 with prompts that produced fake UI overlays)
M183 — Drop fake-HUD combat backgrounds. The old _1/_2/_3 combat backgrounds (generated Apr 16 with prompts that produced fake UI overlays) were still listed in backgrounds.json alongside the good _hd regens from Apr 18, so combat randomly picked bad BGs 2 out of 3 rolls. backgrounds.json now references only the _hd files; deleted 26 obsolete PNGs + thumbs.
M1822026-04-19M182 — Enchanter consolidation. Removed Blacksmith 'Upgrade' tab (duplicated Enchanter's role). Enchanter now has two tabs: 'Add Property' (
M182 — Enchanter consolidation. Removed Blacksmith 'Upgrade' tab (duplicated Enchanter's role). Enchanter now has two tabs: 'Add Property' (2× tier material → +1 affix of that tier — moved from Blacksmith) and 'Upgrade Rarity' (3× next-tier material promotes normal→magic→rare→legendary, opening affix slots). Both Blacksmith and Enchanter use the same crafting materials — no more gold-for-enchants. Tooltips now point to the correct workflow.
M1812026-04-19M181 — Spell Power unification. Potency affix values now stored as fractions (0.05..0.15) instead of integer points (1..3). Removed scattere
M181 — Spell Power unification. Potency affix values now stored as fractions (0.05..0.15) instead of integer points (1..3). Removed scattered *0.05 multipliers across SkillTreeScreen, CombatScreen, simulator, InventoryScreen; auto-migrates legacy saves in equipBonuses accumulator. spellPower now excluded from 'Other Effects' list in Inventory (no more +0.08 duplicate — correctly rolls into Spell Power in Character Stats as a %).
M1802026-04-19M180 — Combat log / floater / tooltip consistency fixes. (1) Auto-attack log now shows actual HP-reduction dealt (post dmgReduct/marked/barr
M180 — Combat log / floater / tooltip consistency fixes. (1) Auto-attack log now shows actual HP-reduction dealt (post dmgReduct/marked/barrier/soulbind) instead of the _resolveIncomingDamage intermediate, matching the damage floater. (2) Auto-attack log adds 'dmg' suffix: 'Borin → Wraith: 12 dmg' (previously 'Borin → Wraith: 12'). (3) Damage-breakdown hover tooltip now shows both Post-mitigation and Dealt rows when _applyDamage further reduced the value (dmgReduct/marked/barrier absorb/soulbind split), so tooltip dealt matches what you see on screen. (4) Passive on-hit procs (burnOnHit, poisonOnCrit, chainOnHit) gated on actual dealt>0 instead of pre-mitigation dmg (no more burns from fully-blocked hits).
M1792026-04-19M179 — Remove 22% black overlay from combat backgrounds. CombatScreen.js drew a rgba(0,0,0,0.22) rect over the combat canvas area (not the H
M179 — Remove 22% black overlay from combat backgrounds. CombatScreen.js drew a rgba(0,0,0,0.22) rect over the combat canvas area (not the HUD strip below), creating a visible seam where the dimming stopped. Removed the overlay entirely — sprites read fine against raw art and the HUD has its own background. User-requested.
M1782026-04-19M178 — AI Content Generator tool. New /assets/ai-content-gen.html page: enter an Anthropic API key once (saved to localStorage), pick a cont
M178 — AI Content Generator tool. New /assets/ai-content-gen.html page: enter an Anthropic API key once (saved to localStorage), pick a content kind (skill/class/character/item/loot/event-chain/appearance/pack), describe it in plain English, and Claude writes valid JSON against the corresponding /schemas/v1/*.json. Model selector (haiku-4-5 default, sonnet-4-6, opus-4-7). Structural JSON lint runs on output (id present, skill.effects non-empty, DSL ops whitelist). Hands off to Custom Content Loader for full runtime validation. Zero server dependency — browser calls api.anthropic.com directly via anthropic-dangerous-direct-browser-access header. Added to shared nav-header.
M1772026-04-19M177 — Portrait bg-removal sweep. Force-removed solid backgrounds from 75 portraits under public/images/portraits/ (abyssal_knight, ancient_
M177 — Portrait bg-removal sweep. Force-removed solid backgrounds from 75 portraits under public/images/portraits/ (abyssal_knight, ancient_dragon, cleric, dragon_knight, genesis_worm, giant_spider, paladin, primordial_elemental, ranger, reality_shard, rogue, stormcaller, swashbuckler, the_architect, the_unraveler, veil_warden, void_wraith, war_dog, wyrm_warrior, and 56 more). ~4.9M pixels cleared using corner-sampled chroma key with alpha-0 ghost-color pickup. Thumbnails regenerated (75 rebuilt). Previously these portraits slipped past batch-remove-bg because they had partial transparency (fringe smoothing) which triggered the isFullyOpaque skip heuristic.
M1762026-04-19M176 — Passive tree overhaul + UX batch. (1) src/game/passives.js rewritten: HP/MP/regen nodes kept, 10 new mechanical effects (blockChance,
M176 — Passive tree overhaul + UX batch. (1) src/game/passives.js rewritten: HP/MP/regen nodes kept, 10 new mechanical effects (blockChance, thorns, resistAll, dodgePct, lifesteal, burnOnHit, poisonOnCrit, chainOnHit, hpOnKill, manaOnKill) across 13 nodes; all 19 class trees redesigned with role-themed picks. Wired into CombatScreen _resolveIncomingDamage (resistAll), _basicAttack (burnOnHit/poisonOnCrit/chainOnHit), _applyDamage (thorns/hpOnKill/manaOnKill), lifesteal via actor.lifeSteal. (2) resolveSprite fix — hires no longer resolve to templateId, fixing 'images/sprites/borin_east.png not found' in party panel. (3) Skill combat log shows post-mitigation totalDealt instead of pre-armor skillDmg. (4) HP/MP rounded at tavern party tab display and CombatScreen→GameState propagation (fixes 261.0399... float). (5) Fame encounter modal now chains back-to-back through all eligible award tiers in one town visit. (6) Workflow hardening: release.sh/sync_meta_hook.sh/CLAUDE.md now require RELEASE_SUMMARY so releases[N].summary is never empty. 202/202 tests passing. Known follow-up: second-pass portrait bg-removal for partially-transparent sprites (War Dog).
M1752026-04-19M175 — Soulbind runtime wiring. CombatScreen._applyDamage now redirects amount% of incoming damage to a bound partner when both actors carry
M175 — Soulbind runtime wiring. CombatScreen._applyDamage now redirects amount% of incoming damage to a bound partner when both actors carry the soulbind status on the same side. Recursion-safe via _soulbindProcessing. Demo skill arch_soulbind (cleric, 50% split, 4 rounds) added to archetype-spells-2.json. 3 new vitest cases in soulbind_m175.test.js (202/202 passing). Also improves the release workflow — see CLAUDE.md, sync_meta_hook.sh, and release.sh: per-milestone summary is now enforced.
M1742026-04-19M174 — 4-item UX batch. (1) scripts/batch-remove-bg.cjs walks sprite dirs, detects fully-opaque PNGs, runs corner-sampled chroma-key removal
M174 — 4-item UX batch. (1) scripts/batch-remove-bg.cjs walks sprite dirs, detects fully-opaque PNGs, runs corner-sampled chroma-key removal — 503/1262 sprites cleaned. (2) Homepage reduced to a single cloud layer (was 3). (3) SkillTreeScreen: dropped redundant hover tooltip on skill rows since clicking already opens details (tooltip blocked the panel on mobile). (4) SkillTreeScreen onEnter + character-tab switch now auto-select the tab with pending points (priority skill → passive → attr) and jump to the first character with available points.
M1732026-04-19M173 — Counter-stance runtime wiring. CombatScreen._applyDamage now consumes a counterStance status and reflects amount% back to the attacke
M173 — Counter-stance runtime wiring. CombatScreen._applyDamage now consumes a counterStance status and reflects amount% back to the attacker, stack-limited and recursion-safe via _counterProcessing. applyStatus DSL op extended to carry amount/power forward so rich reflect/redirect statuses are authorable in pure DSL. Demo skill arch_counter_stance (Iron Counter, 2 stacks × 150%). 2 new vitest cases (199/199 passing).
M1722026-04-19M172 — stealStatus DSL op (dispel-and-transfer). New op in src/mods/dsl.js moves statuses from any source to any destination, preserving dur
M172 — stealStatus DSL op (dispel-and-transfer). New op in src/mods/dsl.js moves statuses from any source to any destination, preserving duration/stacks/amount. Supports single type, array of types, or prefix match (e.g. 'buff:'); optional max cap. Demo skill arch_dispel_steal (Thief's Whisper) rips all buff:* from target onto caster. 4 new vitest cases (197/197 passing).
M1712026-04-19M171 — Targeted silence wired end-to-end. New statusModel.isSilenced() helper; CombatScreen._heroAI, simulator.simHeroAI, and the enemy heal
M171 — Targeted silence wired end-to-end. New statusModel.isSilenced() helper; CombatScreen._heroAI, simulator.simHeroAI, and the enemy healer AI branch now gate magic/heal/mp-costing skills behind it so basic attacks still resolve while silenced. Demo skill arch_targeted_silence (Hush) added to archetype-spells-2.json. 3 new vitest cases in silence_m171.test.js (193/193 passing).
M1702026-04-19M170 — wishlist checkbox normalizer; 59 status-done rows auto-checked; release.sh now runs sync-wishlist-checkboxes on every release
M170 — wishlist checkbox normalizer; 59 status-done rows auto-checked; release.sh now runs sync-wishlist-checkboxes on every release
M1692026-04-19M169 — critBonus temp buffs migrated to statusModel; all 7 status families now unified (burn/poison/bleed/stun/barrier/dmgBuff/critBonus)
M169 — critBonus temp buffs migrated to statusModel; all 7 status families now unified (burn/poison/bleed/stun/barrier/dmgBuff/critBonus)
M1682026-04-19M168 — dmgBuff migrated to statusModel (6 of 7 families unified); addDmgBuff/getDmgBuffMult helpers; CombatScreen + simulator + tests migrat
M168 — dmgBuff migrated to statusModel (6 of 7 families unified); addDmgBuff/getDmgBuffMult helpers; CombatScreen + simulator + tests migrated; 190/190 tests pass
M1672026-04-19M167 — clouds_02 bg-strip, frontpage chart reorder + count fix, play.html subpath fix, game15 deployed, sprite-flip archived, image-review E
M167 — clouds_02 bg-strip, frontpage chart reorder + count fix, play.html subpath fix, game15 deployed, sprite-flip archived, image-review Enemies grouped + sticky dialog, ~30 bg strips, changelog nested accordion
M1662026-04-19M166: remove dead statusModel legacy shims (burn/poison/bleed/stun/barrier fully migrated)
M166: remove dead statusModel legacy shims (burn/poison/bleed/stun/barrier fully migrated)
M1652026-04-19M165: scripts/remove-bg.cjs CLI + warlock_east_spell bg removed; burn-family migration audit (already on new statusModel)
M165: scripts/remove-bg.cjs CLI + warlock_east_spell bg removed; burn-family migration audit (already on new statusModel)
M1642026-04-19M164: forge hover-tooltip fixes (touch currentTarget, arrow direction, scroll-cancel, level-req prereq)
M164: forge hover-tooltip fixes (touch currentTarget, arrow direction, scroll-cancel, level-req prereq)
M1632026-04-19M163: canvas bg-remove tool + Developer Tools section on assets index
M163: canvas bg-remove tool + Developer Tools section on assets index
M1622026-04-19M162: image-review manifest derived from game data + docs DSL op count fix (18 ops)
M162: image-review manifest derived from game data + docs DSL op count fix (18 ops)
M1612026-04-18M161: combat character stagger/spread + 7 class appearances + aggressive image compression (~80% smaller)
M161: combat character stagger/spread + 7 class appearances + aggressive image compression (~80% smaller)
M1602026-04-18M160: tavern NPC appearance swap per roster refresh
M160: tavern NPC appearance swap per roster refresh
M1592026-04-18M159: CombatSim save/load+diff+benchmark, final 2 HD BGs, combat BG regen closed
M159: CombatSim save/load+diff+benchmark, final 2 HD BGs, combat BG regen closed
M1582026-04-18M158 — no summary recorded
M158 released 2026-04-18
M1572026-04-18M157 release bump
M157 release bump
M1562026-04-18M156: image-review tool enhancements + 5 more HD combat BGs (hell_breach, shattered_core, eternal_void, abyssal_depths, dragon_throne) wired
M156: image-review tool enhancements + 5 more HD combat BGs (hell_breach, shattered_core, eternal_void, abyssal_depths, dragon_throne) wired in
M1552026-04-18M155: wire 5 HD combat BGs into backgrounds.json
M155: wire 5 HD combat BGs into backgrounds.json
M1542026-04-17M154: 5 HD combat backgrounds (border_roads, thornwood, volcanic, cosmic_rift, desert_plateau)
M154: 5 HD combat backgrounds (border_roads, thornwood, volcanic, cosmic_rift, desert_plateau)
M1532026-04-17M153: 26 boss east_spell+east_block sprites + manifest expands boss poses
M153: 26 boss east_spell+east_block sprites + manifest expands boss poses
M1522026-04-17M152: 9 new phantom class east_spell/east_block sprites
M152: 9 new phantom class east_spell/east_block sprites
M1512026-04-17M151: 28 phantom class pose frames (south/east/east_attack/east_ko × 7 classes)
M151: 28 phantom class pose frames (south/east/east_attack/east_ko × 7 classes)
M1502026-04-17M150 followup fix: place 6 misplaced phantom class portraits
M150 followup fix: place 6 misplaced phantom class portraits
M1492026-04-17M149 — getClassSkills merges registered mod skills per class
M149 — getClassSkills merges registered mod skills per class
M1482026-04-17M148 — link spell/enemy/item catalogs in shared nav-header
M148 — link spell/enemy/item catalogs in shared nav-header
M1472026-04-17M147 — /assets/item-catalog.html (weapons/armor/affixes/sets, per-tab export)
M147 — /assets/item-catalog.html (weapons/armor/affixes/sets, per-tab export)
M1462026-04-17M146 — /assets/enemy-catalog.html tool (39 enemies, export as mod pack)
M146 — /assets/enemy-catalog.html tool (39 enemies, export as mod pack)
M1452026-04-17M145 — bootstrap vanilla ENEMIES into mod registry
M145 — bootstrap vanilla ENEMIES into mod registry
M1442026-04-17M144 — vanilla skill bootstrap + emoji purge in CombatScreen
M144 — vanilla skill bootstrap + emoji purge in CombatScreen
M1432026-04-17M143 — vanilla items/classes bootstrap into mod registry
M143 — vanilla items/classes bootstrap into mod registry
M1422026-04-17M142 — schema foundation: stat warn-mode norm, protected mechanics, spell catalog, mechanic doc, example packs
M142 — schema foundation: stat warn-mode norm, protected mechanics, spell catalog, mechanic doc, example packs
M1412026-04-17M141 — TownScreen preserveScroll
M141 — TownScreen preserveScroll
M1402026-04-17M140 preserveScroll to ForgeScreen + PartyScreen
M140 preserveScroll to ForgeScreen + PartyScreen
M1392026-04-17M139 codex formula pass + combat log damage breakdown tooltip
M139 codex formula pass + combat log damage breakdown tooltip
M1382026-04-17M138 scroll preservation helper + HireBuilder/Inventory rollout
M138 scroll preservation helper + HireBuilder/Inventory rollout
M1372026-04-17M137 spritecook-first sprite loader + skill tree scroll preservation
M137 spritecook-first sprite loader + skill tree scroll preservation
M1362026-04-17M136 menu Visit Website + /game-info/ polish
M136 menu Visit Website + /game-info/ polish
M1352026-04-17M135 weapon tooltip + shield rebalance + misc polish
M135 weapon tooltip + shield rebalance + misc polish
M1342026-04-17M134 stats polish + stun immunity
M134 stats polish + stun immunity
M1332026-04-17M133: Event-chain flag ledger
M133: Event-chain flag ledger
M1322026-04-17M132: Blacksmith grid + stat display fixes
M132: Blacksmith grid + stat display fixes
M1312026-04-17M131 — per-skill cooldown map (CombatScreen + simulator)
M131 — per-skill cooldown map (CombatScreen + simulator)
M1302026-04-17M130 — deferred-items pass (goblin shaman flip, pet sprites, reward audit)
M130 — deferred-items pass (goblin shaman flip, pet sprites, reward audit)
M1292026-04-17M129 — Docs scaffolding, doc viewer, Spell Power clarity, image-review isolation
M129 — Docs scaffolding, doc viewer, Spell Power clarity, image-review isolation
M1282026-04-16M128 — mod system v1 (schemas, DSL, registry, upload UI, starter pack)
M128 — mod system v1 (schemas, DSL, registry, upload UI, starter pack)
M1272026-04-16M127: class/appearance decouple + wishlist tracker
M127: class/appearance decouple + wishlist tracker
M1262026-04-16M126 — no summary recorded
M126 released 2026-04-16
M1252026-04-16M125 — no summary recorded
M125 released 2026-04-16
M1242026-04-16M124 — no summary recorded
M124 released 2026-04-16
M1232026-04-16M123 — no summary recorded
M123 released 2026-04-16
M1222026-04-16M122 — no summary recorded
M122 released 2026-04-16
M1212026-04-16M121 — no summary recorded
M121 released 2026-04-16
M1202026-04-16M120 — no summary recorded
M120 released 2026-04-16
M1192026-04-16M119 — no summary recorded
M119 released 2026-04-16
M1182026-04-16M118 — no summary recorded
M118 released 2026-04-16
M1172026-04-16M117 — no summary recorded
M117 released 2026-04-16
M1162026-04-16M116 — no summary recorded
M116 released 2026-04-16
M1152026-04-16M115 — no summary recorded
M115 released 2026-04-16
M1142026-04-16M114 — no summary recorded
M114 released 2026-04-16
M1132026-04-15M113 — no summary recorded
M113 released 2026-04-15
M1122026-04-15M112 — no summary recorded
M112 released 2026-04-15
M1112026-04-15M111 — no summary recorded
M111 released 2026-04-15
M1102026-04-15M110 — no summary recorded
M110 released 2026-04-15
M1092026-04-15M109 — no summary recorded
M109 released 2026-04-15
M1082026-04-15M108 — no summary recorded
M108 released 2026-04-15
M1072026-04-15M107 — no summary recorded
M107 released 2026-04-15
M1062026-04-15M106 — no summary recorded
M106 released 2026-04-15
M1052026-04-15M105 — no summary recorded
M105 released 2026-04-15
M1042026-04-15M104 — no summary recorded
M104 released 2026-04-15
M1032026-04-15M103 — no summary recorded
M103 released 2026-04-15
M1022026-04-15M102 — no summary recorded
M102 released 2026-04-15
M1012026-04-15M101 — no summary recorded
M101 released 2026-04-15
M1002026-04-15M100 — no summary recorded
M100 released 2026-04-15
M992026-04-15M99 — no summary recorded
M99 released 2026-04-15
M962026-04-14M96 — no summary recorded
M96 released 2026-04-14
M952026-04-14M95 — no summary recorded
M95 released 2026-04-14
M942026-04-14M94 — no summary recorded
M94 released 2026-04-14
M932026-04-14M93 — no summary recorded
M93 released 2026-04-14
M922026-04-14M92 — no summary recorded
M92 released 2026-04-14
M912026-04-14M91 — no summary recorded
M91 released 2026-04-14
M902026-04-14M90 — no summary recorded
M90 released 2026-04-14
M892026-04-14M89 — no summary recorded
M89 released 2026-04-14
M872026-04-14M87 — no summary recorded
M87 released 2026-04-14
M862026-04-14M86 — no summary recorded
M86 released 2026-04-14
M852026-04-14M85 — no summary recorded
M85 released 2026-04-14
M842026-04-14M84 — no summary recorded
M84 released 2026-04-14
M832026-04-14M83 — no summary recorded
M83 released 2026-04-14
M822026-04-14M82 — no summary recorded
M82 released 2026-04-14
M812026-04-14M81 — no summary recorded
M81 released 2026-04-14
M802026-04-14M80 — no summary recorded
M80 released 2026-04-14
M792026-04-14M79 — no summary recorded
M79 released 2026-04-14
M782026-04-14M78 — no summary recorded
M78 released 2026-04-14
M772026-04-13M77 — no summary recorded
M77 released 2026-04-13
M762026-04-13M76 — no summary recorded
M76 released 2026-04-13
M752026-04-13M75 — no summary recorded
M75 released 2026-04-13
M742026-04-13M74 — no summary recorded
M74 released 2026-04-13
M732026-04-13M73 — no summary recorded
M73 released 2026-04-13
M722026-04-13M72 — no summary recorded
M72 released 2026-04-13
M712026-04-13M71 — no summary recorded
M71 released 2026-04-13
M702026-04-13M70 — no summary recorded
M70 released 2026-04-13
M692026-04-13M69 — no summary recorded
M69 released 2026-04-13
M682026-04-13M68 — no summary recorded
M68 released 2026-04-13
M672026-04-13M67 — no summary recorded
M67 released 2026-04-13
M662026-04-13M66 — no summary recorded
M66 released 2026-04-13
M652026-04-13M65 — no summary recorded
M65 released 2026-04-13
M642026-04-13M64 — no summary recorded
M64 released 2026-04-13
M632026-04-13M63 — no summary recorded
M63 released 2026-04-13
M622026-04-13M62 — no summary recorded
M62 released 2026-04-13
M612026-04-13M61 — no summary recorded
M61 released 2026-04-13
M602026-04-13M60 — no summary recorded
M60 released 2026-04-13
M592026-04-13M59 — no summary recorded
M59 released 2026-04-13
M582026-04-12M58 — no summary recorded
M58 released 2026-04-12
M572026-04-12M57 — no summary recorded
M57 released 2026-04-12
M562026-04-12M56 — no summary recorded
M56 released 2026-04-12
M552026-04-12M55 — no summary recorded
M55 released 2026-04-12
M542026-04-12M54 — no summary recorded
M54 released 2026-04-12
M532026-04-12M53 — no summary recorded
M53 released 2026-04-12
M522026-04-12M52 — no summary recorded
M52 released 2026-04-12
M512026-04-12M51 — no summary recorded
M51 released 2026-04-12
M502026-04-12M50 — no summary recorded
M50 released 2026-04-12
M492026-04-12M49 — no summary recorded
M49 released 2026-04-12
M482026-04-12M48 — no summary recorded
M48 released 2026-04-12
M472026-04-12M47 — no summary recorded
M47 released 2026-04-12
M462026-04-12M46 — no summary recorded
M46 released 2026-04-12
M452026-04-11M45 — no summary recorded
M45 released 2026-04-11
M442026-04-11M44 — no summary recorded
M44 released 2026-04-11
M432026-04-11M43 — no summary recorded
M43 released 2026-04-11
M422026-04-11M42 — no summary recorded
M42 released 2026-04-11
M412026-04-11M41 — no summary recorded
M41 released 2026-04-11
M402026-04-11M40 — no summary recorded
M40 released 2026-04-11
M392026-04-11M39 — no summary recorded
M39 released 2026-04-11
M382026-04-11M38 — no summary recorded
M38 released 2026-04-11
M372026-04-11M37 — no summary recorded
M37 released 2026-04-11
M362026-04-11M36 — no summary recorded
M36 released 2026-04-11
M352026-04-11M35 — no summary recorded
M35 released 2026-04-11
M342026-04-11M34 — no summary recorded
M34 released 2026-04-11
M332026-04-11M33 — no summary recorded
M33 released 2026-04-11
M322026-04-11M32 — no summary recorded
M32 released 2026-04-11
M312026-04-11M31 — no summary recorded
M31 released 2026-04-11
M302026-04-11M30 — no summary recorded
M30 released 2026-04-11
M292026-04-11M29 — no summary recorded
M29 released 2026-04-11
M282026-04-11M28 — no summary recorded
M28 released 2026-04-11
M272026-04-11M27 — no summary recorded
M27 released 2026-04-11
M262026-04-11M26 — no summary recorded
M26 released 2026-04-11
M252026-04-11M25 — no summary recorded
M25 released 2026-04-11
M242026-04-11M24 — no summary recorded
M24 released 2026-04-11
M232026-04-11M23 — no summary recorded
M23 released 2026-04-11
M222026-04-11M22 — no summary recorded
M22 released 2026-04-11
M212026-04-11M21 — no summary recorded
M21 released 2026-04-11
M202026-04-11M20 — no summary recorded
M20 released 2026-04-11
M192026-04-11M19 — no summary recorded
M19 released 2026-04-11
M182026-04-11M18 — no summary recorded
M18 released 2026-04-11
M172026-04-11M17 — no summary recorded
M17 released 2026-04-11
M162026-04-11M16 — no summary recorded
M16 released 2026-04-11
M152026-04-11M15 — no summary recorded
M15 released 2026-04-11
M142026-04-11M14 — no summary recorded
M14 released 2026-04-11
M132026-04-11M13 — no summary recorded
M13 released 2026-04-11
M122026-04-11M12 — no summary recorded
M12 released 2026-04-11
M112026-04-11M11 — no summary recorded
M11 released 2026-04-11
M102026-04-11M10 — no summary recorded
M10 released 2026-04-11
M92026-04-11M9 — no summary recorded
M9 released 2026-04-11
M82026-04-10M8 — no summary recorded
M8 released 2026-04-10
M72026-04-10M7 — no summary recorded
M7 released 2026-04-10
M62026-04-10M6 — no summary recorded
M6 released 2026-04-10
M52026-04-10M5 — no summary recorded
M5 released 2026-04-10
M42026-04-10M4 — no summary recorded
M4 released 2026-04-10
M32026-04-10M3 — no summary recorded
M3 released 2026-04-10
M22026-04-10M2 — no summary recorded
M2 released 2026-04-10
M12026-04-10M1 — no summary recorded
M1 released 2026-04-10
Full changelog (legacy text)
- M411 — 22-item batch + image-review workflow: (1) spells & heals now scale off equipped weapon damage midpoint (Heavy/Light/Magic from weapon, not attribute), (2) priest AI no longer wastes Call Back when nobody is dead and surfaces a damage spell when the picked set has no offense, (3) enemy champion-affix info moved from click → hover (mouse only), (4) Items Found post-combat now uses correct rarity colors per item, (5) Silas Veilward portrait regenerated to match east frame, (6) images.html gains a Combat Backgrounds section + Other dedupe + new Orphaned section, (7) Hire Custom: Auto attribute spend tops up all points, vertically centers the toggle, and routes through a build-picker step before stats, (8) Trainer adds a +1 Level button + fixes the spendGold TypeError, (9) companions excluded from trainer level-up and now scale via a power tier (1-5) — cost = power × 100g, in-combat HP/dmg = 30P + 8PL / [3+P+PL, 5+2P+1.5PL], shown as star-rating in tavern, (10) hireable hero cost normalized to 100g × level, (11) ev-card class label now shows level, (12) per-encounter XP cap removed (Catch Up handles rate-limiting), (13) Ember Plateau + all zones get an edge-edge intersection detangle pass to fix line/node crossings, (14) Void Scholar boss got a 5-pose art set generated via SpriteCook, (15) Trainer companion bug + spendGold crash fixed, (16) Levelup screen made fully opaque so it no longer leaks dungeon UI behind it, (17) Hireable heroes 100g/level pricing rule, (18) Achievements wired to fire on combat victory + level-up + zone unlock; Hell Descends rename to The Hell Breach, (19) dg-screen DOM defensively purged after dungeon→town→boss transitions so a stale Iron Barricade panel no longer sits behind a fresh boss fight, (20) Hell Breach's Scholar's Sanctum demoted from boss → challenge so Archfiend Malgrath stays the sole act boss, (21) Companion power tier overhaul + visible star rating, (22) Mossy Cairn warden_charm fix (inventoryItem requirement now also scans equipped slots + questKey tags so equipped quest items still gate dialog choices); leave-without-resolving no longer consumes encounters. Image-review-v2 page gains an explicit two-step workflow callout + Copy approve command + Approve all buttons; approve script handles ghost entries gracefully.
- M381 - Act 3+ rebalance. Enemy HP & damage now ramp by act (Acts 1-2 unchanged at 1.0x; Act 3 1.85x HP / 1.22x dmg, Act 4 2.15x / 1.30x, Act 5 2.40x / 1.38x) with a boss-HP damper so single-target boss fights stay around 30-50 rounds instead of 80+. Hero skill/spell damage globally scaled to 70% (combat.skill.heroDamageMult) so AoE finishers are no longer 2-3x basic-attack damage. Companions auto-scale stats with Companion Level Sync — STR/DEX/CON/INT bonuses per (effective level - template level) so a Level-1 War Dog hired in Act 1 stays relevant in Act 5. New scripts/sim-act-balance.mjs validation tool runs the requested Fighter/Stormcaller/Cleric/Mage party against representative encounters per act. Sim shows Act 3 trash 10-13 rounds, big-fight encounters 22-24 rounds, bosses 38-47 rounds with companion deaths and occasional party wipes — matches user goal of suspenseful late-game combat.
- M348 - iPhone inventory tap targets (Equip/Compare/Close 44px+); boss combatants inherit isBoss from boss-tagged encounters so bossScale 2x applies (Veilspawn Herald was 1.5x); Combat Debug Reset uses shared defaults (was hardcoded 1x); hero column shifts toward centre when no companions in party; FTL grid depth renormalised so Act 1 zones do not have cluster-then-gap spacing.
- M347 - Cleric AI overheal: skip self-heal when target HP >= 85pct (the user logged 7 heals with up to 17 overheal each on a single fight). Enemy XP cut roughly in half (goblin_scout 18->8, warrior 32->15, shaman 38->18, herald 60->28). Per-encounter XP cap tightened to 1.25 levels per fight. Prologue start node is now a no-op Trailhead. Traveling overlay moved to fixed-position DOM so it stays viewport-centered when the canvas is scrolled. Skill-check first-visit fixed via dedicated skillChecksAttempted set. Boss-chest modal repositioned to position:fixed so iPhone-portrait taps land correctly. Per-zone canvas min-width: prologue + small zones fit one screen.
- M346 — Hotfix: Ancient Shrine first-visit (and any shrine) was showing Already Used because GameState.visitNode() fires before the modal builds, so visitedNodes.has(node.id) returned true even on first arrival. Now passes alreadyVisited captured pre-visit through to the modal. iPhone portrait map node spacing — canvas internal width clamped to ≥760px so the 14-col grid gives every node a ~50-55px gap (well above the 40px tap-target target the user requested), with .map-canvas-wrap scrolling horizontally on narrow viewports.
- M345 — Tools archive + wishlist audit. Removed Data Catalogs (Legacy), Data Overrides, AI Content Generator from the visible Tools list to shorten the menu (HTML preserved on disk for direct linking + existing bookmarks). public/assets/tools.html and shared/nav-header.js trimmed. Wishlist: new Continuous Release Run M331-M345 section with one-line entries per milestone + four pending follow-ups (empty Thornwood node, tab layout consistency, craft menu revert, fallen-hero sync, milestone glossary). Continuous-release run wraps with all primary user-facing wishlist items shipped.
- M344 — NPC dialog portraits. DialogScreen renders an actual portrait next to the NPC name: priority is event.npcPortrait override -> hand-curated NAME_TO_SPRITE map (Silas Veilward, Kaela Thorne, Marek Greel, Mira the Seer, Forest Warden, Hedge-Mage, Garrison Lieutenant, Wounded Soldier, Faded Shade, etc) -> slugified-name lookup -> initials placeholder. Image onerror fallback swaps in the placeholder so a missing sprite never breaks the dialog flow. Portrait size 56 -> 64px and uses object-fit: cover.
- M343 — Skill check / shrine / dialog clarity. Skill-check modal previews Pass / Fail outcomes BEFORE attempting (two-column grid, green/red). When the partys best stat meets DC alone, the Attempt button becomes a green Auto-Pass affordance so the user can tell the challenge is winnable. Disabled dialog choices render an inline Requires: line (Requires: veil_lens in inventory; Requires: STR 12+; etc) so the user knows WHY a choice is greyed out. Shrine modals carry a clear Effect: block stating exactly what each shrine does.
- M342 — XP cap + Riposte logging. xp.js awardXp caps memberXp at (currentLevel.remaining + 50% of next-level span) so one fight cannot catapult more than ~1 level (defensive guard against the user-reported level-7-at-prologue overflow). Riposte parry counter wired: target.parryStance was set but never consumed; now decrement one charge per incoming hit, deal damageMult * weapon-damage back to the attacker, fully absorb the incoming hit, log via recordDamageDealt + recordDamageBySkill + meter so the combat log and damage report show the counter accurately.
- M341 — Stun overhaul. New Dazed status (-25 percentage points hit chance for the duration; lighter than stun, never skips a turn). AoE stuns converted to Dazed: Tinker Barrage of Debris and Junk Avalanche, Demon Hunter Absolute Vengeance ult. Single-target stuns unchanged. Two skill talents that gave 2-round stun reworked — Thorn Wall now 1-round root + extended Bleed (3r); Bulwark Strike trades extended stun for higher damageMult (2.0 -> 2.4). Combat hit roll deducts 25 pts when the attacker has Dazed.
- M340 — Magic shield system. Four new off-hand bases (Warded Focus / Rune Aegis / Spellguard Orb / Arcane Bulwark; Act 1-4+) with native Barrier and Barrier Regen on every base. Two magic-shield-only affixes added (Wardstone for Barrier, Conduit for Regen). equipBonuses now sums barrier/barrierRegen. CombatScreen seeds a persistent magic-shield barrier status at fight start; existing barrier-absorb path subtracts from it before HP; per-round regen at round-flip restores up to maxPower. Magic-shield barriers stay in the status list when depleted so they can refill (skill-cast one-shots still filtered).
- M339 — Difficulty picker reorg + Hire estimate. New game and Change Difficulty both show three compact icon+name buttons (Easy/Normal/Hard) with a single description paragraph below that updates on selection. Hard difficulty surfaces +20pct MF / +10pct XP as inline chips. Hire Custom Estimated Stats block now uses the same .preview-stat markup (3-col grid + full-width rows) as Create Character; CSS mirrored locally so the screen renders consistently without depending on CharacterBuilder mounting first.
- M338 — Map + dungeon. Dungeon nodes: anchor-aware return path (give-up was looping back into the dungeon entry because the player was using gs.nodeId AFTER it moved to the dungeon node; resolved up front by walking parent exits). Visible error fallback if dungeonId is missing or DungeonScreen fails to import. Map layout rewrite — _layoutZoneToFTLGrid caps each node's outgoing exits at 3 (closest by y); pins the boss to (COLS-1, mid-row); classifies thru-nodes via reaches-boss reverse walk; places thrus around a centred trunk with vertical drift capped to ±2 rows between adjacent columns; places one-offs in the SAME column as their parent at parent.row ± 1 so detours read as off-lane. Empty Thornwood node investigation flagged for M339.
- M337 — UX batch (15 items): title fame chip color matches subtitle, WHATS NEW + SEND FEEDBACK in game menu now de-emphasized text links, Lore Compendium + Achievements fonts bumped, STR carry-capacity copy removed, map legend separated Shrine / Challenge / Skill Check labels with distinct glyphs, map top margin raised to 7 percent default, Damage meter E checkbox + combat log Secondary checkbox removed (live in Settings), Hire Custom card min-height removed, Hire Custom Level +/- on one row, diff dialog grid-template-columns auto 1fr, New Game Map Seed moved to end, Party screen XP bar below HP/MP per hero, fame-tier encounters made global once-per-account and no longer hand out items.
- M336 — UX batch: sync toast no longer pops every refresh (digest dedupe per user, 24h window); Codex Enemy Scaling rewritten — Coming Soon replaced with role/tier/NG+ explanation incl. regular vs boss sample stats; Character Builder advanced options laid out as a 2-row grid per checkline (checkbox left, title row 1, help row 2 — all inside .cb-adv-checkline); PartyPanel hides the redundant inner skill-mode-tabs bar (outer PartyPanel tabs are authoritative); combat pause/end-modal z-indexes raised above captions and damage meter; fame curve capped at 2,000 fame; combat speed persisted across fights via localStorage; Next-Turn step button now shows whenever combat is paused (no longer gated on the Slow Combat setting).
- M335 — UX batch: boss loot chest affix labels (8% Crit Chance instead of Deadly: 8%); Town header bubble no longer shows skill-pending count (Party-only; Town shows quest-ready / new-unlock count); Town node fast-travel animates the star to the node before opening the dialog; Skills/Passives/Attributes Auto button now spends remaining points immediately on click; Settings → Combat: Show Combat Log + Show Damage Meter toggles, with a paired Show Enemy Damage & Info toggle; in-game menu reorganized into Hero row + 3-column grid (Game / Library / Settings) + Footer (mobile collapses to single column), Load Game added alongside Save Game.
- M334 — Backend fixes. (1) Supabase request-burst on Load Game: opening Load Game while signed in fired ~184 requests (1 listCloud + 92 readClouds + a redundant auth.getUser per row). New savesClient.listFull selects slot_name+state+updated_at+created_at in one query; savesClient caches auth.getUser for 30s and invalidates on auth state change. cloudSaves.mergeWithCloud and downloadAllMissing now use it. Net: 2 requests instead of 184. (2) Supabase telemetry mirror: new src/auth/telemetryEventsClient.js writes each consented analytics event into the 0003_telemetry_events table; consent.pushEvent now fires GA and lazy-imports the Supabase client so every milestone event lands in both. Anonymous (signed-out) inserts allowed via the migration RLS policy.
- M333 — Google Analytics wired. Hostname-based GA id resolver in src/main.js: emberveil.radgh.com -> G-5H26ZXKBCL, anything else (radgh.github.io/RSG-Demos, localhost) -> G-XP7B7KVNY8. Override path remains: window.__RSG_GA_ID or VITE_GA_ID. Demos hub generate_pages_index.js ships its own inline consent banner + GA snippet using the same rsg_consent_v1 localStorage key; same-origin so the decision shares with any game tab.
- M332 — Class catalog page rebuild. Linked from the shared Catalogs nav. Sprite strip uses fixed flex-basis (4 across desktop, 2 across mobile). Unlockable classes stay full-opacity with an Unlock-Requirement section under the passives. Display-mode select (View: all / basic / images / attributes) hides per-card sections. Top-right Select toggle reveals per-card checkboxes; selected count shows next to the row count with a Copy List button (newline-separated names). Lightbox modeled on character-redesign.html: 7-pose nav, prev/next + arrow keys + Escape, mobile-safe scroll. Each frame fetches the matching pose-prompt from public/data/art_direction/<class>.json lazily and shows it as a Prompt block. emit-game-data.cjs now enriches classes.json with starter:true and unlockRequirement:{type,value,label} pulled from classUnlocks.js.
- M331 — Class catalog page. New /assets/class-catalog.html shows all 28 playable classes with portrait, 7-pose sprite strip, role, armor type, primary attribute, lock state, full skill list (unlock level + MP cost + description), and class passive tree. Loads via data-source.js (same source as in-game screens; not a static copy). Filters: primary attr, armor tier, starter-vs-locked. Search matches class/role/hook/skill text. getPassives() added to data-source.js.
- M330 — Main-menu UX audit. Three signed-out auth buttons collapsed into one Sign In button + a unified modal (tabs for Sign In / Create Account, Google primary action up top). NG+ subtitle removed from the title screen, surfaced as a pill on Load Game cards instead. Fame chip shows just the number when fame > 0; the misleading "Next: 2,000" tier copy is gone since the unlock model is per-appearance. New GDPR consent banner with Accept / Reject / Privacy link; GA4 only loads on Accept; consent persists across the demos hub and game13 via same-origin localStorage + a 1-year same-site cookie. Major-milestone GA events wired: run_started, run_completed_win, run_completed_death, level_up, boss_killed, class_unlocked, fame_threshold_reached. New privacy.html in both game13 and the RSG-Demos hub, linked from the title-corner links and the hub footer. New ux-audit.html dev tool (linked from the hub footer only) renders the audit table + a live consent / dataLayer inspector. Optional 0003_telemetry_events.sql Supabase migration mirrors GA events into a first-party table; supabase-setup.md updated to cover it.
- M329 — Title corner-links horizontal row on mobile (no more spaced-out vertical column on the right edge); combat victory modal soft-lock fixed by hiding CombatScreen root in onPause.
- M328 — Codex screen mobile layout. Horizontal scroll-tab bar of categories was unusable on iPhone (users had to side-scroll to discover categories). A real select dropdown takes over below 600px wide, plus the list/detail panels stack vertically on mobile so the entry list isn't crushed into a 38pct column on portrait.
- M327 — Bug-fix follow-up. Appearance default-unlocks are now driven by the 5 starter classes (warrior/fighter/ranger/rogue/mage and their gender variants) instead of alphabetical-sort position; the gender filter is now display-only and no longer changes which appearances appear unlocked. Fame moved from per-save to GLOBAL localStorage (emberveil_fame_global_v1) — fame and any appearance unlocks now persist across new games and across saves. HireBuilderScreen class cards now reuse the CharacterBuilderScreen wrap-friendly CSS so mobile no longer ellipses class names down to just the role line. New public/docs/supabase-setup.md (linked from /assets/docs.html under Backend) walks through migration order, application options, verification, and rollback.
- M325 — Cloud-synced per-run statistics. New supabase/migrations/0002_run_stats.sql adds a run_stats table (RLS, after-insert trigger keeps last 100 rows per user). New src/auth/runStatsClient.js mirrors recordRunStarted / recordRunCompleted / recordHardcoreDeath into Supabase when signed in; failures are silent and never block local stats. localStorage life-stats stays the offline source of truth.
- M324 — FTL-style map grid layout. Post-build _layoutZoneToFTLGrid pass snaps every Act 1-6 zone onto a 12-col x 12-row grid (6 logical rows x 2 alternating sublanes; even rows = thru-nodes, odd rows = one-offs/hidden bosses/dungeon entries). BFS depth assigns columns; original y-order preserved within column; zero edges added or removed.
- M326 — Clockwork Turret + Tinker sprites regenerated via SpriteCook. Portraits act as reference assets so the 5 turret poses (portrait, south, east, east_attack, east_ko) and 7 tinker poses (portrait, south, east, east_attack, east_spell, east_block, east_ko) all share visual identity. New PNG art replaces the prior gpt-image-2 set; old files dropped.
- M323 follow-up — Checkbox checkmark glyph now rendered as an inline-SVG background-image at 70 percent size on the box itself, so it scales perfectly to whatever dimensions the checkbox has (the previous unicode-glyph approach kept the check tiny on 44x44 accessibility-sized checkboxes).
- M323 — Combat depth + balance: Enable Slow Combat Options setting adds 0.5x/0.25x/pause + Next-Turn step button to combat speed cycle (default cycle stays 1x/2x/4x). XP curve slowed (level 2 = 120 XP, was 100). Prelude/Act-1 enemy damage bumped 50-70% so prologue enemies hit for 10+ effective damage post-mitigation against starter armor.
- M322 — UI/UX bulk pass (17 items): appearance unlock rework (own-class always free; cross-class unlocks individually on a per-appearance fame curve, replacing 2000-fame-unlocks-all). Reset Progression button (wipes unlocks/achievements/fame, keeps saves). Inventory Auto-Equip + Show Base Attributes converted to button-style toggles; global checkbox glyph rescaled via percentages so 44px accessibility boxes stay readable. HP/MP '?' new-game bug fixed (recalcPassiveStats runs in GameState.init). Party Attributes/Derived/Other split into 2-column max-width-720 grid on desktop. Boss intro double-overlay fixed (canvas BOSS flash removed; combat tick frozen until splash dismissed). Boss loot chest shows light-blue upgrade star left of card with 'Upgrade for X' tooltip + Auto Equip badge; rarity colors preserved on card. Boss chest auto-saves on pick. Town first-visit kick to main menu fixed (pushes TownScreen instead of popping into a missing parent). Town header button hidden until first town visit; Town badge counts new unlocks/quests, Party badge keeps skill points. Advanced new-game options laid out checkbox-left, title+desc-right. Map lines + labels boosted (text shadow, brighter dashes, wider strokes); Trailhead synthetic node guarantees ≥12% gap from first real node; travel-back popup pushed 15px down. Companion HP bars span full row width. Auto-equip toggle sweeps existing inventory on enable. prologue.jpg map background generated; per-zone 404 cache stops console spam.
- M321 (labeled M315) — Balance analysis + full rebalance pass: Act 5 was trivial (party one-shots, 0 retaliation taken). Fixed simulator act-as-ng+ bug (was multiplying HP 410x) and class-casing bug (skills returned empty). Raised global damage multiplier 1.0→1.3, buffed all enemies Act 1-5 (HP +30-100%, DMG +30-60%), capped Backstab Assassinate damageMult 3.20→2.50, reduced Reality Shard stun 20%→10%. Post-rebalance: Act 5 regular 94-97% win, Architect final boss 87% win for level-appropriate party.
- M314 — XP catch-up multiplier (capped 3x) + account-wide achievement persistence (localStorage merged with saves; Reset button in Settings).
- M313 — Consistency batch: removed Recommend/Auto bar, Show Base Attributes label, hidden skill-header bar, removed Skills- prefix, shop/craft auto-equip toasts, salvage margin, 3-step enchanter wizard, Whats New BASE_URL fix, codex Advanced Systems tab.
- M312 — UI unification: hire-custom card sizing, difficulty dialog fix + Settings removal, title fade-in, cloud overlap, save menu reflow + floating Back, stats Esc + persistence, custom confirm modal, tavern→PartyPanel routing, PartyPanel redesign, auto-equip sweep, reusable settingsPanel component.
- M316 — Settings/Title/Save/Party UI unification: 18 bug fixes. HireCustom class grid wider (160px min), class name ellipsis for long names. Title screen skips slide-in intro, fades in 0.35s. Cloud layer height reduced to avoid menu overlap. Save screen cards flex auto-height, no max-height, floating Back button with safe-area inset. Statistics screens get noGameMenuEsc=true so Escape closes them. Run stats flushed to localStorage on damage events, restored on page reload. Checkbox checkmark pseudo-element centered (left:6px, top:2px, 4x9px). SkillTree auto-recommend uses showConfirmModal() instead of window.confirm(). TownScreen Inventory/Party/Skills buttons route to PartyPanelScreen correct tab. PPS redesigned: dark brown bg, Inter primary font (Cinzel for active tab only), gold/brown borders. Portrait hidden inside equip-panel when in PPS. Auto-equip sweeps existing inventory when toggled ON. inv-char-class gets 0.6rem bottom margin. DifficultyDialog onLeave→onExit fix, Escape handler, noGameMenuEsc. settingsPanel.js reusable component created.
- M311 — Map/fog fixes: cross-zone back popup positioned below node with viewport clamping, per-zone last-position restored on return, fogged nodes non-hoverable, fog-of-war default ON.
- M310 — Critical combat/dungeon UI fixes: dg-screen unmount, combat 0px-height fix, victory scroll, boss-treasure pick-1-of-3 (rarity colors), achievement-pause-during-combat, boss-intro splash click-dismiss + HUD hide, fame popup teardown, combat-report rounding, Combat Settings pause panel, captions raised above HP bar.
- M309 — News pipeline (public/news/ + Latest News widget + news-archive.html), per-milestone asset snapshots, release.sh RELEASE_CATEGORY + BREAKING_CHANGES env vars, Whats New Migration Notes section.
- M311 — Number rounding audit: src/utils/numberFormat.js formatStat() helper (int/pct/mult/damage/time/gold/auto kinds) deployed across CombatScreen, InventoryScreen, CharacterBuilderScreen, items.js tooltip. Fame-locked appearance unlocks: src/game/fame.js FAME_UNLOCKS map, CharacterBuilder shows fame counter + greyed locked tiles with unlock targets, TitleScreen fame chip, GameMenuScreen fame chip.
- M307 — 25 unique-item recipes (boss/lore/always unlock) + 30 common-tier recipes (white/magic/rare gating), Blacksmith Unique tab, recipe-unlock toasts. Boss-defeat cinematic dialog (8 bosses, 3-line overlay, reduce-motion safe).
- M306 — Infinite Depths post-game dungeon: scaling formula, 10 floor effects, anchor bosses every 5 floors with guaranteed legendary, local leaderboard, dedicated screen + catalog page.
- M305 — 24 sets (12 low / 8 mid / 4 endgame), 24 uniques tied to acts + bosses, 40 new affixes, 12 legendary effect hooks. onTakeDamage hook deferred to a follow-up cycle.
- M305 — Set items + uniques + 40 affixes: 24 sets (12 low 2-piece, 8 mid 3-piece, 4 endgame 4-5-piece), 24 unique items across Acts 1-5, 40 new affixes (elemental combos, conditional triggers, resource, defensive), legendary effect hooks (onCrit/onKill/onCast/onCombatStart) wired into combat, boss loot tables reference unique IDs, inventory UI purple/orange for set/unique items.
- M304 — Multi-phase bosses (6 bosses w/2+ phases, HP tick markers), per-boss themed loot tables (8 bosses), 4 hidden boss encounters with stat/item/no-death gating, 40 new gated dialogue branches (8 per act).
- M303 — Enemy spells (13 spells incl 3 boss wind-ups, interrupt+steal-buff support) + 10 blue-name champion modifiers with 5% spawn rate.
- M302 — Gameplay batch 1: companion level-sync setting (party avg level on save slots), flee combat with DEX check (boss-immune), Rogue Pilfer Magic + Hemorrhage skills, Warlock Soul Curse with on-death spread, skill-check map nodes (4 examples), node-overlay system (merchant/minigame/bandit) that resolves before underlying node, per-spell DoT stacking modes.
M302 (2026-04-26) — Gameplay batch 1: companion level-sync toggle (Settings), party avg level on save slots, DEX-check flee with gold penalty + counter-attack on failure (boss immune), Pilfer Magic skill (Rogue, strips enemy buff), Hemorrhage skill (Rogue, consumes bleed stacks for burst damage), Soul Curse + death-spread mechanic (Warlock), skill-check map nodes (4 examples across acts), node-overlay system (seeded merchant/memory-minigame/bandit patrol overlays per zone, overlay fires before underlying node), DoT stacking modes per_source/per_character/global with _applyDotStacked helper, stack count display in status rows.
- M301 — Headless simulator + regression infra: scripts/lib/combat-sim.mjs API, parallel batch-rebalance + CSV, configurable per-act regression thresholds + release.sh hook, encounter difficulty ratings, item validator, affix coverage, save-load tester with milestone snapshots, loot audit (merchant/guild/black market), combat-replay export+HTML player, status-matrix grid, playthrough-sim with softlock detection.
- M300 — Devtool batch 2: skill-sim, affix-matrix, spell-catalog compare mode, asset-pipeline-trace (13 scripts), image-review-manifest cleanup (917→782), character-redesign-archive, rebalance-diff snapshot comparison.
- M299 — Devtool catalogs + live-data override system: emit-game-data.cjs prebuild → 10 JSON data files; data-source.js with localStorage override + revert; data-overrides.html manager. Five catalog pages: companion, dungeon, status-effect, achievement-roadmap, tools landing.
- M298 — Changelog flow + lore + roadmap + monument: structured changelog with 5 category badges + /assets/changelog.html, Whats New splash on first boot after milestone, featureRegistry + newBadgeIfRecent() helper, /assets/roadmap.html derived from wishlist plan, new in-game LoreCompendiumScreen (25 entries), hardcore monument on TitleScreen with disabled-but-loadable Fallen save slots.
- M297 — Keyboard navigation: new keyboardNav.js helper, full arrow-Tab-Enter-Escape across 13 menu screens, :focus-visible gold ring (pointer-suppressed). Combat: digit-key shortcuts for action buttons; full arrow-target selection scoped down per user direction.
- M296 — Accessibility: colorblind palettes (default + 3 variants via CSS vars), 4-step font-size scaling, global 44px tap-target rule, 3-way reduce-motion toggle in Settings (Auto/On/Off) with expanded coverage, combat-captions mode (24px aria-live).
- M295 — Polish: enchanter upgrade preview tooltip (before/after stats), 3-slot potion belt per character with combat-row quick access, achievement-unlock toasts (gold variant, tappable), Whats New modal in GameMenu pulling from auto-emitted release-summary.json (prebuild step), shared statusEffects.js module with plain-language descriptions, 11 boss intro preludes authored.
- M294 — UI batch 2: PartyPanelScreen unifies Party/Inventory/Spells/Passives/Attributes under one tabbed view (old InventoryScreen + SkillTreeScreen marked DEPRECATED M294, kept in repo). Map 'Inventory' button renamed 'Party' and points at the new screen. Zone fast-travel collapses to a dropdown at 4+ zones unlocked. Boss-intro splash card uses clamp() font sizing + overflow-wrap so long names (Unraveler-of-Mortal-Threads etc.) wrap on iPhone instead of cutting off; canvas boss name renderer also clamps to 90% width. Dual-compare mode for rings/offhand activates on desktop viewports (min-width 700 + hover) and falls back to single-compare on narrow.
- M293 — Small UI batch 1: skill-points notification bubble now clears immediately after combat level-up auto-allocation (root cause: MapScreen badges were baked-in HTML, fixed via _refreshHeaderBadges() in onResume()). Quick-equip toast on item pickup with tappable upgrade-available variant. Talent preview tooltips on skill-tree upgrade picker via formatTalentEffect(). Per-character scroll-position memory in InventoryScreen. Status-effect duration glyphs + plain-language tooltips on combat HUD. PartyScreen role badges (Tank/DPS/Support/Healer) as inline SVG with role-color coding (no emoji per CLAUDE.md).
- M292 — Brainstorm→wishlist migration. 74 approved items + 19 manual additions grouped by target milestone (M293–M309) under #approved-brainstorm in public/assets/wishlist.html. brainstorm.html now shows approved items in a separate non-interactive Approved section. CLAUDE.md updated so future Claude reads the wishlist plan first at session start.
- M219 — Log Images debug tracing: new src/utils/imageLog.js helper (reads emberveil_dbg_log_images flag), wired into CombatScreen (combat-bg + hero/companion/enemy sprites), spriteUtils.portraitImg (town-party, town-hire, inventory-grid contexts), TownScreen, InventoryScreen. Added floating gear icon debug buttons on CombatScreen and MapScreen (bottom-right, 44x44, visible only when Debug mode is on), each opens the placeholder Combat Debug (M220) or Map Debug (M221) modal.
- M217 — 14 frames regenerated across 8 classes: chronomancer_male east/east_attack/east_spell/east_block (bobblehead fix), chronomancer_female south (pose + color match), dragon_knight_male south (removed phantom 2nd hammer), runesmith_male east_attack (restored legs), runesmith_female south (smith build match), shadow_dancer_female south/east (full-canvas scale), swashbuckler_male south/east_block + swashbuckler_female east/east_block (legs visible). sorcerer_male east_spell adopted as canonical sizing reference. Wishlist: sorcerer_male other 4 frames, tactician_male east_attack, witch_hunter east_spell all flagged for future scale fixes.
- M216 — War Dog sprite redesigned via SpriteCook (5-pose set: portrait, south, east, east_attack, east_ko). Dropped the OpenAI 'bulldog in plate armor' look for a muscular scarred mastiff with studded leather collar, frayed red bandana, and leather chest strap. Matches other companion dog pose coverage (dire_wolf / bone_hound / shadow_cat). east/east_ko muzzle color drift flagged on wishlist for future touch-up.
M208 — Tuning pass (rebalance arc M4 of 4). Enemies.globalMultipliers tuned (hp 0.55, damage 0.28, armor 0.75); ngPlus compression (hpBase 4.5→1.35, dmgBase 2.8→1.25, armorLinear 0.55→0.25); XP 3×, gold 1.2×. Sim verifies solos cap at Act 2-3, 3-hero parties reach Act 4-5. Ships as balance.tuned-M208.json, revertable via baseline-2026-04-21.json. Playtest memo in memory/rebalance-m4-playtest.md.
- **M207** (2026-04-22) — Rebalance Arc M3/4 (armor curve-DR + tap knob): Both live and simulator armor paths route to new applyCurveDr when combat.mitigation.{liveFormula,simulatorFormula}=curve-dr. DR = min(0.95, armor/(armor+100)), k and cap tunable via combat.mitigation.curveDr. Baseline preset keeps flat+legacy so revert is one-line. Added combat.tap.globalMult knob scaling tap damage + utility magnitude at _applyTapEffect. Tiered-affix Tap Power documented as deferred (globalMult sufficient for M4 targets). 202/202 vitest pass on DEFAULTS; active.json flips formulas to curve-dr. Sim confirms meaningful shift: balanced party now clears all Act 1 and dies in Act 2.
- **M206** (2026-04-22) — Rebalance Arc M2/4 (headless simulator CLI): New Node CLI at `sim/` plays full Act 1 → Act 6 runs for 3 policies (`balanced` 3-hero, `greedy-damage` solo monk, `greedy-tank` solo warrior). Uses existing `src/game/simulator.js` (seeded Mulberry32, already Node-safe), imports `ENCOUNTERS` from `mapData.js`, awards XP between fights via `awardXp`, rebuilds attrs/gear per policy after each level-up. Deterministic — same seed → same results. 100 iters × 3 policies in <1s. Writes timestamped reports to `sim/reports/`. Output: deaths/iters, avg act reached, avg encounters cleared, deaths-by-act histogram, top-5 first-loss encounters. Primary tuning harness for M208. Zero changes to `src/` — parity still at 202/202 vitest pass. Baseline signal: all 3 policies die in Act 1 currently; M3 (tap power, armor DR) and M4 (global multipliers) will move these numbers toward targets.
- **M205** (2026-04-22) — Rebalance Arc M1/4 (config extraction): Extracted all tuning-critical balance numbers into `public/data/balance/balance.active.json` with baseline snapshot `balance.baseline-2026-04-21.json`. New `src/game/balance-loader.js` provides typed frozen access. Wired hot paths in `formulas.js` (maxHp/maxMp/hit/dodge/crit/initiative/damage/spell/steal/mitigation/NG+), `xp.js` (xp table, talent cadence, stat points), `items.js` (quality/rarity tables), `HireBuilderScreen.js` (hire cost + creation budget), `passives.js` (HP/MP base formulas). Added global multiplier knobs (`enemies.globalMultipliers`, `economy.globalMultipliers`) applied at point-of-use — main M4 tuning surface. Zero behavior change: all 202 tests pass with identical per-encounter win-rate snapshots. Revert = `cp baseline-2026-04-21.json active.json`. New doc at `/assets/docs.html` (`balance-config.md`).
- **M200** (2026-04-21) — Regenerate 2 flagged frames: stormcaller_female east_block and oracle_male south. Tightened stormcaller's lightning pose (shell hugs silhouette, no lateral overflow) and replaced oracle_male south's old 'do not stretch' scale clause with the canonical 85%-fill FRAMING block. Both valid RGBA/transparent but came back at 190×190 / 186×186 instead of canonical 200×200 — canvas drawImage normalizes display size, so in-game parity is preserved. 24 credits.
- **M199** (2026-04-21) — Fix M198 regression: 57 character sub-sprite frames were downloaded from the wrong SpriteCook endpoint (/raw, 1024×1024 RGB white bg) instead of /pixel (200×200 RGBA transparent). Re-downloaded from the correct endpoint — zero credits re-spent. Added strict post-download validation (200×200 + transparent corners required). Codified a rigid SpriteCook download contract in public/docs/image-policy.md and the pipeline memory so this cannot repeat. FLAGGED: stormcaller_female east_block and oracle_male south came back smart-cropped below 200px; removed pending regeneration decision.
- **M198** (2026-04-21) — Character art redesign batch 12: promoted 8 classes (fighter_female, stormcaller_female, bard m/f, warlock m/f, knight m/f) to pending_approval with full 7-pose sub-sprite sets. Regenerated oracle_male south+east_spell (prior blanks) and fighter east_attack with forced mid-swing. Baked 15KB min-size check into the wire pipeline to prevent blank-PNG regressions. Strengthened bard and ranger east_attack prompts for clear MID-STRIKE reading. 59 frames, 708 credits.
M187 — Settings page cleanup. Disable Backgrounds + Disable Sprites toggles relocated under Debug Mode submenu (only visible when Debug is on). When sprites are off, town/party portraits render as class icons via portraitImg fallback (appearance variants are intentionally collapsed to the base class icon). Main-menu background image now respects the __gfxDisableBg flag at draw-time (previously it was loaded once at TitleScreen construction and stayed visible after toggling). Music and SFX rows gained On/Off mute checkboxes — when off, _musicMuted/_sfxMuted block playSfx and the music start helpers, pause every registered HTMLAudioElement, and zero the gain nodes; this releases the iOS Safari media session so the user's external music plays through. Combat Simulator Data section is gated behind Debug Mode + Combat Simulator (sim-data-block .enabled class). Bug fix: dialog map nodes that fall back to the random-event pool now display the picked NPC's name on the map label and the hover tooltip; assignment is persisted per save in gs.assignedRandomEvents keyed by 'zoneId:nodeId' so reload/revisit shows the same NPC and the same event fires on click.
M175 — Soulbind runtime wiring. CombatScreen._applyDamage redirects amount% of damage to a soulbind-bound partner (recursion-safe via _soulbindProcessing). Demo skill arch_soulbind (cleric, 50% split, 4r). 3 vitest cases (202/202 passing). Workflow fix — release.sh now enforces RELEASE_SUMMARY (warns loudly if releases[N].summary empty), sync_meta_hook.sh updated, CLAUDE.md documents the RELEASE_SUMMARY env var. Backfilled M171–M175 summaries so they show up in the RSG-Demos main-page changelog.
M174 — 4-item UX batch from user. (1) batch-remove-bg.cjs: walks sprite dirs, detects opaque PNGs, runs corner-sampled chroma removal; 503/1262 sprites processed. (2) Homepage now single cloud layer (was 3). (3) SkillTreeScreen: dropped redundant hover tooltip on skill rows (clicking already opens details — tooltip blocked the panel on mobile). (4) SkillTreeScreen onEnter + character-tab switch auto-select the tab with pending points (priority: skill → passive → attr), and jumps to the first character that has any.
M173 — Counter-stance runtime wiring. CombatScreen._applyDamage now consumes counterStance status (amount % reflected to attacker, stack-limited, recursion-safe). applyStatus DSL op extended to carry amount/power. Demo skill arch_counter_stance (Iron Counter): 2-stack, 150% reflect. 2 new tests (199/199 passing).
M172 — stealStatus DSL op (dispel-and-transfer). New op moves statuses from any source to any destination, preserving duration/stacks/amount. Supports single type, array of types, or prefix match; optional max cap. Demo skill arch_dispel_steal (Thief's Whisper) in archetype-spells-2.json. 4 new tests (197/197 passing).
M171 — Targeted silence wired end-to-end. statusModel.isSilenced() helper; CombatScreen._heroAI and simulator.simHeroAI now gate magic/heal/mp-costing skills behind isSilenced(); enemy healer branch respects it too. New arch_targeted_silence (Hush) skill in archetype-spells-2.json. 3 new tests (silence_m171.test.js), 193/193 passing.
M149 — Mod skills merge into class rosters: getClassSkills() now augments vanilla SKILLS with registered mod skills whose classOrigin matches the classId. Non-breaking — vanilla entries take precedence; registry bootstrap skills are filtered out to avoid duplication. Enables mods to add skills to any class without touching hardcoded data.
M148 — Nav header links for Spell/Enemy/Item Catalog tools so they're discoverable from the shared header on every assets page.
M147 — /assets/item-catalog.html tool: 35 weapons + 43 armor + 22 affixes + 4 sets browsable in tabbed UI with contextual filters, detail dialogs, and per-tab 'Export as mod pack' download. Completes the catalog trio (spell, enemy, item).
M146 — /assets/enemy-catalog.html tool: 39 vanilla enemies (ENEMIES + ENEMIES_ACT4/5/6) browsable with filter by tier/boss/regular, sort by name/hp/damage, detail dialog with encounter cross-references, and 'Export as mod pack' download. Mirrors spell-catalog.html UX.
M145 — ENEMIES bootstrap: all vanilla enemies from mapData.js mirrored into the mod registry as characters (hp/dmg/armor/loot/xp preserved). Completes the vanilla-data schema surface (weapons/armor/affixes/classes/skills/enemies).
M144 — Vanilla skill bootstrap + emoji purge: all 81 vanilla skills mirrored into the mod registry (class-tagged, talents+effects preserved). Removed stray emoji from CombatScreen (potion icon fallback, speed multiplier button, encounter start log, status-applied log) per 'No emoji!' rule.
M143 — Vanilla data bootstrap: WEAPON_BASES (32), ARMOR_BASES (30), AFFIXES_ACT1 + SHIELD_AFFIXES (22), and all vanilla CLASSES are mirrored into the mod registry at app startup via bootstrapVanilla(). Non-invasive — existing game code paths unchanged; mods and tools can now enumerate and reference vanilla content through the schema surface.
M142 — Schema foundation pass: stat warn-mode normalization (registry.normalizeStatsDeep canonicalizes strength→str/dex/int/con), protected core-mechanics list (14 vanilla classes + status types locked against override), 24-spell mechanic catalog doc (public/docs/spell-mechanics.md), /assets/spell-catalog.html tool (81 skills × 20 classes, filter/archetype/export-as-pack), 3 new example mod packs (custom-weapons, custom-enemies, custom-event), schemas + examples linked in custom-content.html. 5 new registry tests.
M140 — preserveScroll rollout (2026-04-17):
- ForgeScreen._render now wraps its innerHTML build in preserveScroll via _renderImpl. Clicking an upgrade, switching tabs, or crafting keeps the Forge scroll position.
- PartyScreen._render same pattern. Active-bench swap + individual action clicks no longer jump to top.
- Completes the first round of scroll-preservation rollout. Remaining screens (TownScreen, AchievementsScreen, CodexScreen, FormulaCodexScreen, LoadGameScreen) rarely trigger mid-scroll re-renders and can adopt preserveScroll if/when users report jumping.
M139 — Codex formula pass + combat log damage-breakdown tooltip (2026-04-17):
- src/game/formulas.js: 10 new formulas registered with section metadata: computeSpellPower (INT*0.025), computeSpellDamage, computeHealAmount, computeDotTick (burn/poison/bleed), computeBarrierAbsorb (overheal-to-barrier), computeRegenTick, computeLifeSteal, computeManaSteal, computeCritChance, computeCritDamage. All 21 previously-registered formulas now carry a .section id (stats/armor/combat/dmgtypes/block/rewards/scaling/healing/status) so the Codex places them under the correct tab instead of defaulting to Combat Math.
- CombatScreen._resolveIncomingDamage now returns a structured {raw, afterBlock, armorReduction, resistReduction, final} breakdown alongside the existing {dmg, tag}. _basicAttack + _executeSkill pass the breakdown into _log_, which stamps data-breakdown JSON on the log entry and toggles .has-breakdown.
- StatColors.js: new buildDmgBreakdownHtml + attachDmgBreakdownTooltips — reuses the existing tooltip singleton, delegated pointerover/out/click, touch-open for mobile. Tooltip rows (Rolled / Armor / Resist / Blocked / Dealt) colour-coded; final=0 row goes red so absorbed hits read obviously.
- Post-combat log overlay refactored from single innerHTML string to DOM-built rows so data-breakdown attributes survive.
- 185 tests pass.
M138 — Scroll preservation helper + wider rollout (2026-04-17):
- src/ui/components/ScrollPreserve.js: new helper preserveScroll(root, fn). Before fn runs, snapshots scrollTop for every descendant with a non-zero scroll plus window.scrollY. After fn completes, restores by className lookup (survives innerHTML re-mount).
- HireBuilderScreen._render now wraps the innerHTML build in preserveScroll. Stats step attribute +/- and Skills step talent buys no longer jump to top.
- InventoryScreen._render wraps via a new _renderImpl so the equip / swap-to-bench / slot-picker flows keep scroll position.
- Complements SkillTreeScreen (M137) which has its own inline scroll snapshot. Future screens should use the shared helper.
M137 — Sprite pipeline fix + scroll preservation (2026-04-17):
- CombatScreen._loadSprite: primary base changed from /images/sprites/ to /images/spritecook/ with a per-image onerror fallback to /images/sprites/. Every sprite now tries the new SpriteCook asset first (7 variants each) and only falls back to the legacy pixellab dir if the spritecook variant 404s. Fixes all class pets (pet_wolf, pet_bear, pet_skeletal_warrior, pet_bone_golem, pet_imp, pet_demon, pet_war_hound, pet_fire_elemental, pet_lightning_elemental, pet_familiar) which had their files in /images/spritecook/ but were being looked up in /images/sprites/ and falling through to the SVG placeholder. Also picks up the new SpriteCook versions of heroes (cleric, mage, druid, necromancer, etc.) that previously silently kept rendering the older pixellab east/south frames.
- SkillTreeScreen: capture + restore scrollTop of .skill-list-panel/.skill-detail-panel/.passive-panel/.attrs-panel and window.scrollY across innerHTML re-render. Fixes the long-standing scroll-to-top jump on every +1 Attribute / Buy Talent / tab switch.
- Hire Custom class grid min column width already at 150px (wishlist entry was stale).
M136 — Menu + /game-info/ polish (2026-04-17):
• Main-menu 'Visit Website' button now routes to the demos hub root (baseUrl) instead of /game-info/. TitleScreen.js href assignment dropped the 'game-info/' suffix.
• Removed the play-triangle emoji (▶) from both 'Play Now' and 'Play Game' buttons on /game-info/ per no-emoji policy.
• Fixed outdated narrative copy on /game-info/: 'Fourteen paths of power' -> 'Twenty paths' (matches the actual 20-class roster) and 'four increasingly harrowing acts' -> 'six' (matches ACT1-ACT6 in mapData). Stat counters were already accurate (20/10/10/10/6).
M135 — Weapon tooltip type + shield rebalance + misc polish (2026-04-17):
• Weapon tooltips now show HEAVY/LIGHT/MAGIC category + calculated damage: items.js/generateItem was dropping weaponCategory when building items from WEAPON_BASES, so getItemTooltip couldn't render the 'Type: STR/DEX/INT' line or the Base/Total damage split. Propagated base.weaponCategory onto every generated item; tooltip now consistently shows Type + Base Damage + Total Damage (live from computeHeroDamage for the selected hero).
• 'Melee (Light) — DEX' tooltip fixed: SkillTreeScreen + CharacterBuilderScreen both used data-stat='Melee' which resolved to the generic 'Base melee damage from STR' definition. Added 'Melee Heavy' (STR) and 'Melee Light' (DEX) tooltip defs; rewired both screens to the specific keys. Damage calc itself was already correct (computeHeroDamage reads DEX for weaponCategory==='light').
• Shield block rebalance: base blockChance on every shield normalized to 20/30/40/50% (buckler/kite/tower/aegis), base shield 20%. Bulwark affix max lowered from +75% to +15% (min +5%), so the worst-case 'Base Block 20% + Bulwark 73%' scenario is now capped at 35%. Base `shield` also gains blockPower 10 for parity.
• Block Chance / Block Power now surface in Character Stats > Other Effects when non-zero. InventoryScreen._renderCharStats calls getCharacterBlockStats() directly (these affixes live outside getEquipmentAffixBonuses by design so they don't double-count against the damage pipeline).
• Guildmaster Arrives popup now fires on every town entry, not just save-load. TownScreen.onResume() now re-runs _maybeShowFameEncounter() after the sub-screen return rerender, so fame thresholds (100/250/500) trigger immediately when the player walks back into town from combat or the world map.
• Hire Custom + Create Hero + Skill Tree panel backgrounds changed from cool purple-blue (#06040a→#0e0818 / #08050a→#0d0a14 / #08060e→#100820) to warm brown (#0a0608→#120a10) matching Inventory. Town panel still uses its green variant; Black Market still uses its purple variant.
• Notification summary in town now tags bench-only pending points as '(bench)' so users can see the source of 'phantom' skill-point counts. (Save inspection of the necroman-2026-04-17 save showed 2 real pendingSkillPoints=1 entries on bench characters; the summary previously didn't distinguish bench members from active party.)
• 185/185 vitest tests still green.
M134 — Stats polish + stun immunity (2026-04-17):
• Character Stats: STR/DEX/INT/CON now display gear-modified (affix-inflated) values and turn blue when they exceed base. Inventory screen was rendering char.attrs (raw) instead of effView (raw + affix), so any +STR/+DEX/+INT/+CON ring was invisible.
• Other Effects filter hardened with case-insensitive SHOWN_IN_CORE check so legacy uppercase affix keys can no longer leak into the 'Other Effects' list as duplicate STR/CON rows.
• Tooltip defs added for Life Steal, Mana Steal, Crit Chance, Crit Damage, Gold Find, XP Find, Mana Regen, Initiative, Trade Prices, Block Chance/Power — hover formula shown via shared attachStatTooltips.
• Skills menu recolored: MP cost + sub-cost lines now gold (#c0a040) instead of the odd blue (#4080c0) that mismatched the rest of the brown/orange/gold scheme.
• Skills detail panel now shows an 'Est. Damage'/'Est. Heal' row per skill using the selected character's actual stats (mirrors CombatScreen formula: mult × stat × (1 + spellPower)). Based stats include affixes and Potency.
• Stun immunity (CombatScreen): when a stun expires, target gets stunImmuneRounds = 2 + priorStunCount. Each additional stun extends immunity further, so chain-stun has diminishing returns. _applyStatus('stun') short-circuits and logs a resist when immunity is active. Decay runs once per round in _processStatusEffects. Formula documented in the Status Effects section of the Formula Codex.
• wishlist.html: fixed unescaped <button> tag in 'Click handlers scroll to top' task (was rendering a real button inside the description text).
• Shared nav-header: added Wishlist to the Tools dropdown for game13 so the continuously-updated wishlist is one click away.
• PartyScreen HP readout: Math.floor'd cur/max so values like '376.060000000000006' now read '376'.
• Deferred to next cycle (logged to wishlist, not silently shelved): (a) skeleton / bone_golem / wolf / bear companion sprites — portraits OK, combat uses SVG fallback; skeleton + bone_golem missing SpriteCook files, pet_wolf/pet_bear exist but companion templateId may not route there. (b) User reports Necromancer + Druid still render old pixellab sprites even though SpriteCook files exist — needs SPRITE_MAP / resolver trace.
• Full vitest suite still 185/185 green.
M133 — Event-chain flag ledger (2026-04-17):
• GameState gains four ledger primitives: hasFlag(key) (truthy-aware), incrementFlag(key, delta=1) (numeric accumulator with auto-init + non-numeric coercion), consumeFlag(key) (one-shot clear + return), requireFlags([...keys]) (AND list with '!' negation entries).
• Effect DSL (src/mods/dsl.js) gains matching ops so mod-authored event chains can write through the ledger: incrementFlag, consumeFlag, requireFlags. Ops prefer ctx.gameState when available and fall back to ctx.flags scratch space for pure DSL tests.
• consumeFlag op respects a `required: true` hint — if the flag wasn't present, the step sets ctx._skip so downstream branches short-circuit (matches the existing requireFlag semantics).
• Header comment + inline docs in dsl.js updated; setFlag/requireFlag remain unchanged for backwards compat.
• 6 new unit tests in src/game/__tests__/flag_ledger.test.js cover truthiness edge cases, accumulator mutation, consume-returns-boolean, negation gating, and both DSL code paths. Full suite 185/185 green.
M132 — Blacksmith grid + stat display fixes (2026-04-17):
• Inventory Character Stats rounding: HP, Mana, Armor, Magic Resist, Hit, Dodge, Damage now Math.floor() to integers (was rendering raw floats like '315.849999999999997'). Attribute rows (STR/DEX/INT/CON) also floored.
• Life Steal / Mana Steal display fix: the Other Effects section was multiplying values that are already stored as integer percents, so a 1.9% leech read as '190%'. Split InventoryScreen + SkillTreeScreen isPct branch into fractional-percent keys (goldFind/xpFind/critChance/critDamage/tradePrices — stored 0..1) and integer-percent keys (lifeSteal/manaSteal — stored 3..12). Now 1.9 displays as +1.9%.
• Affix rebalance: leeching/siphoning min:3 max:12 (was ~1.5..3 pre-cycle). Same keys, same storage convention, new numeric floor/ceiling.
• Blacksmith Craft tab restructured as a 3-column desktop grid (Magic / Rare / Legendary). CRAFT_RECIPES now a 12-slot × 3-tier flatMap producing 36 recipes: Weapon (heavy=sword / light=dagger / magic=staff), Off-hand (shield, orb), Helm, Chest, Legs, Feet, Hands, Ring, Necklace. Tier cost schedule: magic→(4 iron+2 essence), rare→(4 essence+2 dust), legendary→(3 dust+1 core).
• void_staff / void_plate retired as named exotics; both folded into the legendary staff / legendary chest recipes on the new grid (no more void_shard dependency anywhere in the crafting pipeline).
• Blacksmith Upgrade tab: disabled-state styling added (.bs-btn:disabled → opacity 0.35 + grayscale filter + not-allowed cursor). Already had the `disabled` attribute set correctly per-tier, but the CSS matched nothing so buttons looked active. Now visually matches Craft tab's behavior.
• Spell Power baked-in affix: orbs, tomes, and amulet/necklace accessories now guarantee a base spellPower affix on item generation, mirroring how shield bases bake in block_chance / block_power via synthetic affixes. Off-hand orbs/tomes grant 15% base (scaled by item quality), caster amulets grant 8% base. Stacks with the optional rolled 'Potent' affix.
• All 179 balance tests still green.
M131 — Per-skill cooldown map (2026-04-17):
• Replaced the single shared `actor.skillCooldown` integer with a per-skill `actor.skillCooldowns` map (skillId → rounds remaining) in both CombatScreen and simulator. Fixes the long-standing behavior where using any skill locked a character out of ALL their other skills for 2 rounds.
• Each cast now stores `skill.cooldown` on its own key (default 2 rounds). The tick loop at the start of every turn decrements each active entry and deletes the key when it hits 0, so the usability filter (`!actor.skillCooldowns[skill.id]`) can do a cheap check.
• Resurrect preserved: still uses a 12-round cooldown, but now only its own key is locked — the Cleric can Cleave, Heal, or Smite in the interim, matching how the ability was always supposed to feel.
• Simulator parity maintained — Monte-Carlo balance runs still pass the full 179-test vitest suite with no regressions.
• Wishlist flipped two duplicate 'Per-skill cooldown map' entries to done with M131 tag.
M130 — Deferred-items pass (2026-04-17):
• Goblin shaman combat attack frame no longer mirrored — added 'goblin_shaman' to CombatScreen FLIP_EAST set so the east-facing attack pose renders horizontally flipped correctly.
• Pet sprites (Skeletal Warrior, Wolf, Bear, Imp, Demon, War Hound, Bone Golem, Fire Elemental, Lightning Elemental, Familiar) now render their real art instead of placeholder SVG. Root cause: pet_* ids were missing from CombatScreen SPRITE_MAP. Added 10 explicit entries so the spritecook prefix resolves correctly for each.
• war_dog tavern portrait 404 confirmed resolved in M129 via the resolveSprite companion-marker branch (was returning literal 'companion' as a sprite key).
• Druid + Necromancer desync: investigated. Files exist, manifest entries exist, SPRITE_MAP entries exist — no data mismatch found. Flagged in wishlist as 'investigated, need repro' rather than silently closed.
• Combat reward text vs inventory grant mismatch: same drops[] array feeds the UI text and GameState.addToInventory (CombatScreen._victory ~L2137), so code path is internally consistent. If the user still sees the 'war bow → ring' mismatch, we need a specific save/encounter to reproduce. Kept open on wishlist.
• Wishlist: added one new non-priority request: restructure combat character placement to stagger columns L/R/L/R and spread vertically to use the bottom ~70% of the combat stage (currently ~20% utilized). Answered inline: AoE skills target by group/column (unaffected by placement changes), tap weapons target by pixel distance (will be affected).
M129 — Docs + Image-review polish + Spell Power clarity (2026-04-17):
• NEW: public/docs/ canonical markdown — image-policy, prompt-templates, schema-reference, mod-authoring, asset-types, no-silent-shelving. /assets/docs.html is a lean markdown viewer (~7KB, no external lib) under Tools > Documentation. Source-of-truth lives in versioned files; updates land in every session.
• CLAUDE.md: added Canonical Docs section pointing at /public/docs/, new-tool flag rule (≤25KB auto-approve, anything larger requires name/size/reason).
• Spell Power display rewritten as a +% bonus. CharacterBuilderScreen preview + SkillTreeScreen Attributes tab both show e.g. '+30%' at 12 INT instead of the cryptic '+0.3'. Tooltip in StatColors expanded with the actual formula (base × (1 + 0.025×INT + 0.05×Potency)).
• Image-review: per-category isolation on multi-select apply — hero-card details no longer leak onto background cards when bulk-editing. When selection spans categories, an action or detail edit only writes to cards of the template card's category.
• Stats Base-toggle now session-only. Reverts to 'calculated' on every page load so stale state can't trick users into thinking their starting-point allocation was lost (root-caused a user 'stats reverted to 8' bug).
• Walk-anim waste cleaned up in M129 prep: 20 webp animations + 10 static walk PNGs removed from disk and assets.json. image-policy.md now explicitly forbids walk/attack animation generation unless requested.
• Wishlist: banked all user bugs/requests mid-cycle — Hire Custom class-grid + appearance picker parity; war_dog tavern portrait path; pet sprite placeholders (skeletal_warrior + wolf); Druid/Necromancer battle sprite desync from image-review; goblin shaman flipped attack frame; structural rewrite of image-review to read the real game dataset instead of a parallel manifest; scroll-to-top on spend clicks; combat reward text vs inventory grant mismatch; Base-toggle RESOLVED.
M128 — Mod System v1 (2026-04-16):
• NEW: /schemas/v1/ (9 JSON Schema files) — pack, skill, effect-dsl, class, item, event-chain, appearance, character, loot. Downloadable from Custom Content page; point your editor at them via $schema for completion + validation.
• NEW: Effect DSL runtime at src/mods/dsl.js — 15 ops: damage, heal, applyStatus, buff, setFlag, requireFlag, consumeStatus, resourceSwap, echo, ritual, modifyTurnOrder, onHit, onCrit, onKill, onEvent. Each op walks a ctx { caster, targets, rng, flags, log, emit }. Triggers attach to caster._triggers; rituals queue as caster._rituals.
• NEW: Pack registry at src/mods/registry.js — accepts canonical { id, version, <kind>: [] } packs, bare arrays (kind inferred), or single entities. Boot-wired via src/main.js (optional-by-default — no packs auto-load). Exposes window.__emberveilMods for console/debug.
• NEW: /assets/custom-content.html — 4-tab upload tool (Upload/Paste, Schemas, Example Packs, Loaded). Structural validation (unknown-op detection) + full pack load. Schemas and example packs downloadable. Works in built site via inlined registry logic.
• NEW: public/mods/examples/starter-pack.json — 24 mechanically distinct skills (firebolt, frost nova, blood rite, mend, consecrate, hasten, mirror strike, cleansing touch, stalker's mark, reaper's toll, shield wall, taunt, crippling shot, arcane volley, soul drain, phantom step, backstab, thunderclap, starfall, pact of ruin, radiant burst, ironwill, venom dart, echo cascade), 5 event chains (Cursed Coin, Bessa the Widow, Grenn the Drunk, Dragon Whelp, Rival Adventurer), 2 loot tables (deterministic + rolled).
• NEW: Supporting primitives — src/mods/statusModel.js (addStatus/removeStatus/hasStatus/tickStatuses/overhealToBarrier with legacy-field shims via telemetry), src/mods/seededRng.js (LCG + pickWeighted), src/mods/telemetry.js (shim-hit counter exposed as window.__emberveilShimTelemetry), src/mods/loot.js (resolveLoot for deterministic and rolled tables).
• Wishlist: flipped 8 Mod System items to done (v1 schemas, effect DSL, custom content page, example mods + downloadable schemas, upload packs, seeded RNG, shim telemetry, overheal→barrier, loot specifier). Remaining open items (24 spell mechanics catalog, event chain flag ledger, JSON-Schema warn-mode normalization, unify status model into combat screen, per-skill cooldown map, combat sim diff view) visibly tracked — NOT silently shelved.
• Nav: Custom Content tool added to shared header under Tools.
Not shipped this cycle (explicitly deferred, not silently shelved):
• Full CombatScreen migration to statusModel (shims in place; real call-site rewrites tracked on wishlist).
• Per-skill cooldown map runtime migration (replaces actor.skillCooldown slot).
• Combat sim diff view vs nearest vanilla (hook points identified, UI not wired).
• AJV/in-browser full JSON-Schema validation (structural check only for now; schemas downloadable for editor-side validation).
M127 — Class/Appearance Decouple + Wishlist (2026-04-16):
• NEW: /assets/wishlist.html — AI-maintained tracker of planned/in-progress/done/dropped features. Claude flips boxes as work lands; user-read-only. NO SILENT SHELVING rule enforced.
• Class/Appearance decouple: added src/game/appearances.js registry; member.appearance overrides class-derived sprite resolution. Cleric (class) can now look like a Mage (appearance). CharacterBuilderScreen grew an appearance picker on the stats step. CombatScreen spriteKey resolution now respects member.appearance.
• cleric_priestess — 2nd female cleric appearance generated via SpriteCook (7 frames: portrait/south/east/east_attack/east_spell/east_block/east_ko).
• 10 companion east sprites generated: dire_wolf, forest_owl, ember_drake, shadow_cat, crystal_golem, spirit_wisp, bone_hound, ice_sprite, swamp_frog, void_moth.
• mod-system-report portrait-mixer duplication bug fixed (inner list now cleared before repopulating).
• milestone-report: 7 phantom classes with missing art removed (monk, shaman, witch_hunter, knight, sorcerer, runesmith, shadow_dancer); they are now tracked in the Wishlist "New Characters" section.
• /game-info/index.html: 15 portrait refs switched to /images/spritecook/{id}_portrait.png with onerror fallback to /images/portraits/{id}.png (turn-order, party diagram, class flip-cards, roster helpers).
• Wishlist: added AI Integration section (content-gen AI with schema access; separate portrait-gen AI with reference + directional frames) + four image-review tool enhancement items.
• image-review.html: new "Select whole sprite" button per group (batch-prompt connected views); new Move-to-Library / Archive / Delete actions on Ready cards; new "Unassigned Appearances" + "Archived / Unattached" bottom sections.
• Memory: added wishlist_review.md and mod_system_shelving.md so future sessions know to audit the wishlist each milestone and shelve hard items with a reason.
M120 — Mega Batch (2026-04-16):
Combat balance:
• Spell damage nerfed: spellPower = INT * 0.025 (was INT * 0.08). 40 INT mage Fireball on staff lands ~28-47 per target before mitigation (was 472). Unified display in InventoryScreen, CharacterBuilderScreen, SkillTreeScreen, simulator.js, FormulaCodexScreen.
• Multi-target damage falloff: 1 target 100%, 2 targets 80%, 3 targets 60%, 4+ targets 50%. Applies to BOTH physical and magical AoE; documented in codex.
• Burning DoT power = max(3, floor(INT * 0.15)) with burnMult honored; explicit tick log line so players see it land.
• Healer AI priority: classes (cleric/druid/priest/oracle/paladin/bard) with any ally ≤ 40% HP pick biggest heal/barrier/shield over damage/debuff.
• Crit is now AFFIX-only. New critChance + critDamage keys roll on weapons, gloves, amulets. Enemies baseline 5% crit at 1.5× (no critDamage bonus). critPct clamped to 75.
• Sharp affix physical-only; new Potency affix magic-only (descriptor SPELL). items.js/generateItem filters by weapon category; ab.dmg vs ab.spellPower in _memberToCombatant.
• Return to Town on defeat: _defeat button now this.manager.replace(new TownScreen(...)) (was manager.pop()).
Blacksmith + items:
• Forge service retired from town menu; Blacksmith now has three tabs: Salvage | Craft | Upgrade. Upgrade uses 2 materials of the same tier → +1 random affix of matching rarity (no gold). Max-affix and insufficient-material states disable the button with tooltip.
• 6 new weapons (iron_mace, obsidian_scimitar, ember_focus, voidsteel_greatsword, starfall_bow, abyssal_rod), 4 new shields (buckler, kite_shield, tower_shield, aegis_shield — block_chance+block_power baked in via synthetic affixes), 8 new body pieces (2 each chest/legs/hands/feet), spanning Acts 1-5.
UI + UX:
• Hero portraits upsized to 80×80 with 5px padding across town cards, Party Management, Inventory, Skill tree, Character Builder. Town top-left party window now shows 40px portrait + HP/MP + class icon next to name. Class icon also added on Party slot/detail, Inventory header, Skill-tree char tabs, and Character Builder Stats title.
• Town right-menu order: View Map, (Return to Portal conditional), Inventory, Skills, Tap Items, Quests, Menu.
• In-game menu (GameMenuScreen) overlay now align-items:flex-start + padding + overflow-y:auto so the panel scrolls on mobile. Restyled with canonical palette (Cinzel/ember/gold/parchment) matching public news/assets pages.
• Main Menu confirm replaced with custom gold-bordered dialog (OK/Cancel). Skipped automatically if a save wrote within the last 60 s (window.__lastSavedAt tracked in SaveManager).
Settings + Saves:
• Bulk buttons renamed Export Game Data / Import Game Data with description. New 'Export Save / Import Save' row above — single save file format { emberveilSingle:1, key, heroName, data } with party picker on export and overwrite / add-new / cancel on import collision.
• Combat Simulator: '← Return to Game' replaced with styled 'Main Menu' button centered beside header. New 'Load from File' button next to Load from Save — accepts single-save JSON wrappers or raw records.
Combat Simulator AI parity:
• heroToCombatant now folds passive + affix bonuses into effective stats before feeding damage/HP/MP formulas.
• simHeroAI mergeSkillForCast(skill, _member) applies talents/upgrades. Highest-cost AoE picked (strongest) instead of first-match; AoE vocabulary extended (chain, chain3, multi3, multi4, random3, random4, pierce_row, group2, row2, adjacent).
• Healer/shield branch mirrors CombatScreen — Cleric/Oracle use Foresight/Fate Shield when ally low.
• autoAssignAttrs(classId, level) + autoGenerateEquipment(classId, level) for manually-added chars. Primary = 10+floor(lvl*2.2), CON = 8+floor(lvl*1.2); bard/tactician split DEX+INT. Equipment rarity bracketed by level.
• L20 mage probe now casts Blizzard (~100 dmg/target) instead of auto-attack 17→3.
Tooltips + Character Stats panel:
• Tooltip viewport clamping (two-pass getBoundingClientRect → window.innerWidth/Height - 8). Mobile close button via .rsg-tt-close / .inv-tt-close when touch-open set; desktop hover stays pure.
• Tooltip max-width: min(420px, calc(100vw - 16px)); .tt-affix white-space:nowrap prevents mid-property line wraps.
• Persistence bug fixed: pointerover/pointerout with relatedTarget singleton dismiss (matches item-tooltip lifecycle).
• Character Stats panel: removed 'Atts: (X/Y/Z/W)' one-liner. New Attributes group (STR/DEX/INT/CON rows with base-vs-buffed coloring) + new 'Other Effects' group iterating any non-zero key in getEquipmentAffixBonuses (auto-picks up critChance/critDamage/Potency spellPower). Same treatment in SkillTreeScreen Attributes tab.
• Weapon tooltip: Type (STR/DEX/INT), Base Damage + Total Damage (live from computeHeroDamage) — collapses to single Damage line when base == total. Via globalThis.__rsgFormulas to avoid circular import.
• Base checkbox scroll preserved (save/restore .equip-panel.scrollTop across _render).
Codex:
• Combat Math tab list styling fixed: padding-left 1.2em, margin-block-end 0.8rem, li margin 0.35rem; inline buttons reset to margin:0.
• Crit prose rewritten — crit chance/damage come only from item affixes and passive nodes (never base attrs); formula critMult = 1.5 + critDamage; default enemy 5% @ 1.5×. Stub _fBox entries for rollCrit/applyCritMultiplier.
Art + tooling:
• Combat backgrounds wired: lazy manifest load from public/images/combat_bg/backgrounds.json, deterministic per-zone picker hashed by zoneId, drawn in _drawBackground with procedural palette fallback. Respects Disable Backgrounds toggle.
• re-redesign.html gains a full 'Combat backgrounds' section (12 zone cards, 26 images, per-image prompts).
• assets.json refreshed: +189 SpriteCook entries (heroes + pets + poses). Dead-asset pruning beyond 'file missing' flagged for a dedicated cleanup pass.
• New Tools > Redesign Survey (public/assets/redesign-survey.html) with 40 rows (20 heroes + 20 bosses/enemies): OpenAI 40/40, PixelLab 36/40, Pixel Engine 1/40, SpriteCook 20/40. Mobile-friendly grid → card layout at 820px. Radio-style selection with gold glow; localStorage persistence under rsg.redesignSurvey.v1; Generate Report textarea with Copy/Download/Email actions. Registered in shared/nav-header.js TOOLS_BY_GAME.game13.
Tests: 179/179 pass (was 178; +1 L20 mage parity test; formulas snapshot updated for new affix keys).
M94 — Skill Rewiring Pass (part 1):
• Nine ghost-buff effect objects finally land (Sanctuary, Inspiring Tune, Ballad of Valor, Soul Pact, Fel Sight, Dragon Scales, Draconic Fury, Taunt, Poison Blade). New CombatScreen buff keys wired with decay: barrier, hpRegen, selfDamagePct, critBonus, hitBonus, armorBonus, magicResistBonus, tauntedBy, onHitStatus. Taunt applies as a timed status; enemy AI honoring deferred to m95 (documented).
• Eight missing statusEffects arrays added (Entangle stun, Hellfire burn, Glaive Toss bleed, Thrown Junk stun, Makeshift Bomb burn, Nature's Wrath bleed, Static Field slow, Blizzard slow with power). Slow wired into _buildTurnOrder (halves initiative roll).
• Per-skill payload fixes: Smite/Holy Strike bonusVsUndead+Demon into effect, Lay on Hands/Heal/Rejuvenation/Rewind route healStat through _getSkillStat (no more hardcoded INT), Second Wind honors healAmount as a floor via max(flat, scaled), Rewind cleanse array with handler, Backstab conditionBonus 1.5× vs debuffed targets, Sunder Armor armorReduce + timed restore, Aimed Shot/Dragon Claw effect.armorPen flows through the damage pipeline, Demon Bolt effect.bonusVsDemon, Vengeance baseline +15% dmgBuff (per-death stacker deferred to m95).
• Death Coil replaced with Corpse Explosion — new target:'corpse' branch in _executeSkill that scans dead enemies, deals adjacent/group AoE scaled by the corpse's max HP, marks the corpse detonated, refunds MP on no-corpse.
• Resurrect: cooldown 12 → 10. Two new talents: res_heal_60 (Greater Resurrection → 60% HP) and res_shield (Holy Shield → 1 full round of immunity after revive). Wired reviveImmuneRounds via existing _processStatusEffects decay.
• Death Mark reworked to type:'damage' + new 'marked' status (1.3× incoming damage amplifier in _applyDamage, decays in _processStatusEffects). Proper type:'debuff' branch deferred to m95.
• Tests: 46 new in src/game/__tests__/skills_m94.test.js (total 138, all green). Covers every ghost-buff payload, every new statusEffect array, Corpse Explosion detonation, Resurrect talent merges, marked amplifier, sunder armor restore, and combat-harness runs of Sanctuary/Soul Pact/Fel Sight/Dragon Scales/Poison Blade/Inspiring Tune/Ballad of Valor/Lay on Hands-with-healStat/Rewind cleanse.
• Skill audit page (public/assets/skill-audit.html) updated: ~26 skills bumped partial/orphan → wired with m94 notes; Taunt stays partial pending m95 AI work; Vengeance stays partial pending m95 stacker.
Deferred to m95 (explicitly, with user consent — NOT silently shelved): six missing type branches (zone, trap, counter, utility, debuff, passive), status effects silence/blind, enemy AI taunt honoring, heavy per-skill rewires (Jackpot passive, Flourish/Grandeur stacks, Feint turn-order push, Fate Weave death-save, Corruption DoT tick + spreadOnDeath, Song of Ruin buff dispel, Rain of Arrows volley tick, Vengeance per-death stacker, Smoke Trap trap infra, Riposte counter infra, Scrounge utility infra, Void Rift/Consecration/Ignite zone infra, Discordant Wail silence). See public/assets/skill-audit.html for the live status pills.
M93 — Affix Wiring Pass:
• Shared helper src/game/equipBonuses.js — single source of truth for summing item.affixes into a flat bonus bundle (str/dex/int/con, hp, mp, hit, dodge, initiative, dmg, armor, goldFind, manaRegen). Consumed by CombatScreen._memberToCombatant, passives.computeMaxHp/Mp, CombatScreen._regenMana (was an inline scan), and CombatScreen._victory gold calc. formulas.getEquipmentAffixBonuses now delegates here instead of returning zeros.
• computeGoldReward signature extended — accepts either raw party array or {goldFindBonus} options and multiplies the rolled drop by (1 + sum of hero goldFind affixes). Fixes the user-reported 2000% → ~80g bug. Hero-only — companions are not counted per the find/loot-stat rule.
• Removed 'burning' (burnChance) and 'bleeding' (bleedChance) affixes from AFFIXES_ACT1. Weapon-base burnChance/bleedChance on dragonfang/greataxe/battleaxe bases are untouched — those are weapon intrinsics still consumed by skill/status code. Legacy affixes on existing save data are silently ignored by the helper (no save migration needed).
• Vitest: ~17 new tests — one per kept affix (13) + goldFind multiplier regression + HP/MP/CON flow tests + round-trip (generateItem → equip → helper lights up) + schema check (every AFFIXES_ACT1 stat key maps to a bonus key). Updated pinned affix-stub snapshot to new schema.
• Affix survey HTML status pills updated: all 13 kept affixes → WIRED, burning/bleeding → REMOVED (new grey badge style).
M84 — Simulation Overhaul Part 1:
• src/game/formulas.js — single source of truth for combat math (rollToHit, applyMitigation, computeHero*, enemyScalingForNgPlus, gold/xp rewards). Every export carries .formula + .inputs metadata. CombatScreen refactored to call it — zero behavior change in this step.
• Armor → StarCraft-style flat reduction: max(0, dmg - armor). Magic resist + magic penetration added as parallel system. Damage types: physical / magic / true. Hidden %pen path reserved for legendary affixes.
• Combat log: 'deflected', 'resisted', 'blocked X' tags via mitigationLogTag.
• Shield Block system: shields auto-roll Block Chance (10–75%) + Block Power (10–50 flat) at 100% on shield bases. Pipeline order: hit → block → mitigation → HP.
• Cleric Resurrect rework: single target, 12-round per-combat cooldown, revives at 25% HP, damage immunity until next action. Two new talents (heal % bump + extended immunity round). revival_flask + phoenix_feather updated to match.
• Vitest: 47 tests (was 0). release.sh now runs npm test and aborts on failure.
• Combat Simulator v2 debug screen: Settings → Debug Mode toggle reveals Combat Simulator on title. Loads live party, swappable gear, encounter dropdown, act selector, single-run + 1000× Monte Carlo, Chart.js HP curves + dmg histogram, JSON preset save/load. Engine in src/game/simulator.js (pure, seeded RNG, calls formulas.js).
• Tools dropdown in shared nav header. Affix Survey + Rebalance Survey moved under Tools.
• Shared /home/radgh/claude/shared/tool-styles.css matching Asset Gallery palette, copied into each game on release.
• Affix audit deployed: 14 of 15 affixes are orphaned (only of_mana_regen wired). User survey at /assets/affix-survey.html captures rework decisions for M85.
• Animated /assets/simulation-overhaul.html report: hero w/ pulsing rune, 10 flip cards, animated damage pipeline diagram, affix audit doughnut, armor model comparison chart, block explainer, Part 2 roadmap.
M79 (Redesign): Regenerated entire character roster (~68 chars × 5 variants = 340 images) via OpenAI gpt-image-1; added portrait, east_attack, east_spell, and death animation variants; reworked combat so party faces east and swaps sprites on attack/spell/death; raised HP bars above sprites; retroactive PixelLab fighter generated as baseline; all 69 SFX loudness-normalized to -16 LUFS via ffmpeg; new animated comparison report at /assets/m65-redesign-report.html with A/B audio playback.
M72 — Tap Weapons & Combat Polish:
• New Tap Weapons system: 10 tap weapons + 10 tap utilities with turn/round cooldowns and proximity-based targeting. Click near enemies to attack, near allies to support.
• Party-wide tap inventory (unlimited), one weapon + one utility equipped at a time.
• Tap Weapons vendor added to every town (sells Blade starter + basic utilities).
• Boss drops: each act boss unlocks a powerful tap weapon (bow → fireball → catapult → star caller → spirit hammer → dragon call).
• 4 new skill-check encounters reward tap utilities (heal, cleanse, phoenix feather, haste, etc.).
• Animated standalone report at /assets/tap-weapons.html with SVG-animated icons for all 20 items.
Fixes:
• AudioContext autoplay: title music now queues until first user gesture, then unlocks and plays correctly.
• Title screen clouds clamped to top 40% of viewport, no longer drift into the ground.
• Missing dragons_reach.jpg and dragon companion sprites (dragon_hatchling, frost_wyrmling, storm_drake, shadow_wyrm, dragon_whelp, wyrm_warrior) now wired to existing dragon art.
• Bahamoth defeat no longer leaves the map unclickable: party is routed to nearest town and MapScreen.onResume recovers from stale nodeIds.
• Towns reverted from mid-zone inserts back to one town per act (Emberglen, Cinderhold, Dreadhearth, Nullreach, Deepcradle, Drakegate), tavern rosters redistributed with dragon-kin escalation.
• #app horizontal scroll jump fixed: removed global scrollIntoView from MapScreen tab bar, added overflow guards on #app.
Known partial (not silently shelved — flagged for next cycle):
• 4 tap utility effects (haste double-turn, taunt totem aggro, shield barrier absorb, rally +15%) apply status + cooldown + SFX but their combat-pipeline hooks need a unified applyDamage helper to be fully honored. Plays visually, plays flavor, but the mechanical pass-through lands next cycle.
M71 — Towns, Fame & Polish:
• Multi-town system: 23 new themed towns, 2-3 per zone. 'Return to town' routes to nearest.
• Town merchant stock now scales by act + NG+, deterministic per town.
• Blacksmith quality upgrades auto-roll fresh affixes for new slots; single scrollbar on the panel.
• Themed gold/amber scrollbars globally.
• Cleric rest is free; revive still costs 50g.
• Fame reward encounters at 100/250/500 (free rare amulet, rare+ loot, Guild Hall unlock).
• Guild Hall vendor: 12 fame-gated slots of rare/legendary gear (500 / +250 per additional slot).
• Dragon-kin hireables now gated per act + per town: act 3 towns have one weak dragon, later towns escalate.
• Characters now get +2 attributes per level; starting budget = 8 base per stat + 8 free points. Hireable mercs rebalanced.
• Flavor encounters converted to skill-check events with real rewards.
• Main menu: background visible from frame 0, red-tinted cloud drift across all phases, drop shadows on logo/subtitle/footer, milestone number in footer.
M66 (Dragon Expansion) — Added Act VI: The Dragon's Reach (zones dragons_reach + dragon_throne, 21 nodes, dragon dialogs with skill checks). 7 new dragon enemies (Dragon Whelp, Wyrm Warrior, Dragon Cultist, Frost Wyrm, Storm Dragon, Ancient Dragon, Bahamorth the Dragon King). 7 dragon encounter tables wired into zone pools. Drakehold (Act VI town) with full service slate. 4 unique dragon mercenaries at the tavern (Kaldrek the Dragonborn, Syra Wyrmsworn, Vorin Emberjaw, Maelis Drakeblood — all Dragon Knight class). 4 unique dragon companions (Crimson Dragon Hatchling, Frost Wyrmling, Storm Drake, Shadow Wyrm) sold at the tavern AND obtainable via random dragon-zone encounters. 7 dragon weapon bases + 8 dragon armor pieces (Dragonfang/Wyrmscale/Dragonbone/Drakehammer/Dragontooth/Dragonsteel/Dragonscale/Dragonheart variants). Dragon Knight hero class verified 2-talent compliant. 4 SVG dragon assets, 6 procedural dragon SFX, dragon expansion HTML release page, M65 milestone report appended.
M65 — NG+ rebalance (enemies ~4.5× hp / 2.8× dmg per tier + boss multiplier, guarantees NG+ Act 1 > Normal Act 5), 3 calm combat music variants + dedicated boss theme (rotated by zone, boss triggers epic track), 28 new punchy combat SFX (clangs/booms/slashes) replacing procedural beeps via alias layer, back-to-town button sync fix (checks party zone not viewed tab).
M64 — Skill talent rework (3/8/13/18/23/28 cadence, every skill has ≥2 talents, save migration), ring auto-slot, blue portal icons + portal-only return button, zone-specific travel indicator, 10 new companion encounters with AI-generated sprites, ~60 ElevenLabs SFX + 3 music tracks, 10 OpenAI map backgrounds, menu background + parallax clouds, purple black market (Act 4-5 unlock), forge as town service, town tab bar fix, Trophies→Achievements, weapon variety + starting equipment, split Disable Backgrounds/Sprites settings, demo-assets Play link → /game13/, level-up summary dialog per character.
• M63 (2026-04-13): M56 queue audit pass — verified and hardened the remaining items from the big 21-item queue. Added GameState.sanitizeRoster() invariant (hero entities cannot occupy the companions list; CombatScreen calls it on enter to defensively re-home any misplaced heroes to bench). Combat audio boop-loop root-cause fix: all procedural music now routes through a dedicated per-track _trackGain that is ramped to 0 and disconnected on _stopCurrentTrack, reliably silencing pre-scheduled oscillators created by _addPulse/_addPad instead of relying on node.stop() against oscillators that never started. _victory() now calls _stopCombatAudio() immediately on win (not just in onExit), matching _defeat(). TownScreen overview cards now use delegated click handlers on the service panel so Merchant/Tavern big buttons keep working across re-renders. /game-info timeline extended to M62 with M57–M62 chips and phase label updated to M46–M62. No changes needed to already-complete items (spell/attack power, attributes tab, dialog bg wiring, hire custom parity, blacksmith equipped items, party 4-group layout, inventory filter, war dog sprite, demo-assets categorization, reports layout, logo gradient, portal gating).
• M62 (2026-04-13): Cross-map party-position root-cause fix — per-zone nodeId map (zoneNodeIds) persists per-zone positions so navigating back to a prior map restores the party indicator instead of wiping it; save migration handles legacy saves. Unlimited auto-named save slots — every New Game creates a unique save key (no more overwrites), Load Game lists all detected saves (not limited to 3), level indicator shows with fallback so it no longer reads blank. Cloud parallax layer removed from map screen. Expanded node graphs for variety — Act 1 border_roads preserved; thornwood gains a Queen-Spider mini-boss → Silk Cache detour; Acts 2–5 zones each add 3–5 nodes, branching paths, and a mini-boss-guarded treasure vault side route (buried_cache/ember_hoard/demon_reliquary/shard_vault/void_vault/oblivion_cache/sunken_vault/final_reliquary); progressive complexity with Act 5 reaching ~13 nodes per zone. Sneak skill-check on revisited combat/ambush nodes — deterministic per-node variants pull 2–3 options from DEX/INT/STR/CON with DCs scaling by act; success skips combat, failure enters combat; Fight/Cancel buttons available. Demo-assets Reports link fixed — href now points at #reports-section with scroll-padding-top offset so the section isn't hidden under the fixed nav.
• M56 (2026-04-13): Spell Power / Attack Power aggregates + Character Stats tooltips; Attributes tab in Skills menu for deferred points; dialog backgrounds wired (16 bg arts, rift_entry included); combat audio leak fixed (looping boop); Hire Custom parity with Create Hero (icons, descriptions, armor/weapon prefs); Town Merchant/Tavern buttons routed; Blacksmith & Enchanter accept equipped items with grouped display; Party screen 4-group layout (Active/Inactive × Heroes/Companions), tag pills hidden, Skills/Inventory detail buttons; Hire custom skill points scale +2/level; Inventory inactive-member filter; MapScreen Back-to-Town + portal gating; companion slot hero-reject invariant; war dog sprite wired; demo-assets recategorized (Heroes/Companions/Enemies/Bosses); milestone reports featured+accordion layout; shared header template across demo-assets & reports; in-game logo gold→ember gradient; /game-info updated with M46–M56 features. Bugs fixed: post-defeat map unclickable, inter-map node traversal.
• M53 (2026-04-12): Graphics expansion — 12 new PixelLab sprites shipped across M46–M48 window (stormcaller/druid/oracle × 4 directions), wired into combat SPRITE_MAP. Tactician/Chronomancer sprites queued and pending in the PixelLab job queue.
• M52 (2026-04-12): QoL — View Combat Log button on after-action dialog (formatted log overlay with color-coded entries by type).
• M51 (2026-04-12): Story & quests — quest turn-in flow with gold + fame rewards (four main quests now turn-in-able: Dangerous Roads 150g, Thornwood 250g, Ashen Wastes 400g, Descent to Hell 600g). Town Quests button shows number bubble counting turn-in-ready quests. QuestLogScreen.getCompletedCount() helper for bubble tracking.
• M50 (2026-04-12): Combat polish — boss intro cinematic with '— BOSS —' flash, larger boss nameplate, dark overlay sweep, 3 s dramatic pause before round 1 (regular encounters still 1.2 s).
• M49 (2026-04-12): Map & travel rework — node-by-node travel enforced (no teleporting; only current node and direct exits are reachable), single-use treasure nodes (claimedTreasures tracked in save, 'Already Searched' state on revisit).
• M48 (2026-04-12): Five new classes — Stormcaller (Chain Lightning, Static Field, Thunder Ring, Tempest), Druid (Rejuvenation, Entangle, Wild Shape, Nature's Wrath), Oracle (Foresight barriers, Prophecy dodge, Fate Weave, Ascendance), Tactician (Rally Action, Feint, Reposition, Masterstroke), Chronomancer (Haste, Slow Time, Rewind, Time Stop). Each class has 4 skills with 2+ upgrades + talents. Stormcaller/Druid/Oracle PixelLab sprites wired into CombatScreen SPRITE_MAP. Total playable classes: 19.
• M47 (2026-04-12): Party/Town/Inventory UX — new ESC-style Menu button opens GameMenuScreen (Resume, Save, Party, Quests, Codex, Trophies) reachable via ESC key. Town menu trimmed (Party, Codex, Save, Trophies, Daily, Pending Upgrades removed from right column; View Map bubble removed). Party screen now uses 2-column grid on desktop and renames 'active/bench' to 'party/reserve'. Warrior Shield Bash replaced with Cleave (3-target AoE with Bleed upgrades). Heal now has Radiant Splash + Shielding Prayer talents. Skill points now awarded 1 per 3 levels (was 1 per level). Necromancer Raise Dead replaced with Bone Spear (row AoE, 160% INT, pierce/bleed talents). Hire Custom renamed (from 'Build Mercenary') with <100g disable.
• M46 (2026-04-12): Combat foundation & critical bug fixes — natural-20 crit system (2× dmg, CRIT label, screen shake), attack bob/hit recoil animation, mana regen per round scaled by INT + new 'of Regeneration' affix, formation targeting (companions first, list order), healer enemy AI heals wounded allies, boss sprite ×1.75 scale, hero/enemy sprite rebalance (heroes 56, enemies 62), HP bars raised, dead enemy HP bar hidden, enemy name label removed, lightning-bolt speed-button icon removed, 2×2 HUD grid on narrow viewports, companion sprite fallback lookup (fixes war-dog blank), TPK returns to town at full HP, combat SFX stop on exit, highest-party-stat skill check (excludes companions) with disabled ineligible choices, deferred attribute spend with autosave + queue fix for 3-levelup panels, PartyScreen autosave on swap, ChallengeScreen wave double-advance guard, TitleScreen per-session random stars, SaveManager v3 migration, accessory affix floor (rings/amulets always ≥1 affix), Enchanter rebuilds display name after affix add, post-encounter ⭐ emoji removed.
• M40 (2026-04-11): Massive feature release — 100 random dialog events (merchants, combat, skill checks, lore, moral dilemmas, companion events, resources, supernatural), anti-repeat tracking via seenEvents in GameState. Town Portal Scroll system (30g consumable, opens reusable two-way portal between node and town, persists in save). Combat layout rework (heroes/companions in vertical columns left, enemy groups spread right, 25% max overlap, scale floors at 0.45). Party 'Stand Down' to reserves + 'Call to Arms' from bench. Companion overflow to bench when party full. SkillTree Close button always visible on mobile. Zone tabs horizontally scrollable. Character builder +1 per click (was +2). Ring slot picker dialog. Title screen click/key to skip intro. Shady wanderer no longer fallback for all maps (11 new zone-specific dialog events added). Suggestions form at /game-info/suggestions.html with checklist prompt generator.
• M38 (2026-04-11): Bug fixes + 8 new sprites — Dialog bubble now hidden during choices (was showing empty bordered box above choice buttons). 2H weapon twoHanded/offHandOk properties now properly copied to generated items (fix: offhand was never disabled/unequipped because the flag was missing). Combat _drawUnit wrapped in try-catch for resilience. 8 new PixelLab sprites: Pyromancer (final hero class — all 14 now complete), Corrupted Bear, Demon Brute, Cinder Hound, Veil Cultist, Bandit, Grax the Veil-Touched, Lava Titan. Game info page emoji replaced with flat color symbols. Total: 30 characters with 4-direction pixel art (120 sprite PNGs).
• M35 (2026-04-11): Game info website SPA at /game-info/ — 10-section showcase (hero landing with ember particles, story lore, 14-class grid with role filter, combat system infographic, 4-act journey map, equipment/crafting overview, companions, development timeline, sprite gallery). 8 new PixelLab sprites: Warlock, Demon Hunter, Scavenger, Swashbuckler, Dragon Knight (heroes) + Goblin Warlord, Void Shade, Ash Wraith (enemies) — all 4-direction, wired to SPRITE_MAP. Combat mobile portrait zoom (scale factor based on canvas height + unit count). Disable Textures toggle in Settings (skips background rendering). Companion inventory disabled slots ([Companion] label, can't equip).
• M34 (2026-04-11): Bug fixes — alreadyVisited check now captured BEFORE GameState.visitNode() (was always true causing every combat to give a random encounter); ctx.roundRect() replaced with ctx.rect() to fix silent crash on iOS < 16 that prevented character rendering in combat; pause button emoji replaced with inline SVG icon.
• M33 (2026-04-11): Potion system — 6 potion types (Healing Potion, Greater Healing, Mana Potion, Revival Flask, Group Tonic, Antidote) purchasable at Merchant. Potions displayed in combat pause menu; choose a potion then pick target(s). applyPotionEffect() handles HP/MP restore, revive, AoE, and cure poison.
• M32 (2026-04-11): Custom mercenary hiring at Tavern — opens a mini character builder (choose class, name, distribute 10 attribute points), cost scales with attributes spent (100 + 15G per point). Double-tap / pinch zoom disabled on all interactive elements via touch-action: manipulation; canvas uses touch-action: none.
• M31 (2026-04-11): Inventory weapon slot picker — 1H weapons show a dialog to choose Main Hand or Off Hand; 2H weapons auto-unequip the off hand; off hand slot shows as disabled (grayed with [2H] label) when a 2H weapon is equipped.
• M30 (2026-04-11): Bug fixes + UX improvements — ScreenManager now only draws top screen (fixes title logo showing through combat on app resume); TitleScreen star positions fixed (Math.sin scatter, no more straight line); Map forward-available paths glow with animated gold dashes; random encounters on revisiting combat/ambush nodes from zone pool; zone tabs show NEW badge for unvisited unlocked zones; SkillTreeScreen mobile two-screen flow (list → detail with Back); first node of new zone always accessible; combat pause menu with resume/flee (10-75% chance based on party DEX vs enemies, free enemy attack on fail, disabled for boss fights)/surrender options.
• M25 (2026-04-11): Final polish — zone-specific combat music (7 variants: hell/void/standard), 7 new SFX (defeat, level_up, shrine, craft, ng_plus, purchase), CSS fade-in animations on all overlay screens, custom scrollbars, touch feedback, user-select disabled. All 25 milestones complete. Build: 266KB JS (71KB gzip), 33 modules.
• M24 (2026-04-11): Daily Challenge mode — seeded 5-wave gauntlet, seed changes daily, local leaderboard tracking (per-day localStorage). Score = 100 × waves cleared × wave multiplier. Challenge button added to TownScreen. Daily Champion achievement added. Seeded PRNG (mulberry32) varies wave composition slightly per day while keeping difficulty consistent.
• M23 (2026-04-11): Item Crafting (Forge) — salvage unequipped items into materials (Iron Scrap, Magic Essence, Rare Dust, Legendary Core, Void Shard), then forge new items from 9 recipes. Materials tracked in GameState. Forge button added to TownScreen action bar. Forge achievement added. Zone-scaled salvage yields (normal → legendary progressively better materials).
• M22 (2026-04-11): World Codex screen — 12 lore entries across World, Factions, Bestiary, and Lore categories. Entries unlock based on zones visited, bosses defeated, and story flags. Tabbed category filter, split list/detail layout, progress counter (N/12 unlocked). Codex button added to TownScreen action bar. Lore Seeker achievement added.
• M21 (2026-04-11): Party Management Screen — swap heroes/companions between active party and bench, reorder party with up/down controls, tap-to-select-then-tap-another to swap, companion slots visible separately. Party button added to TownScreen action bar. Fixed 4 achievement checks that referenced wrong boss node IDs. Added Act 4 and NG+ achievements (Cosmic Voyager, The Unraveler Falls, New Game+, Twice-Born Legend).
• M20 (2026-04-11): Audit and polish pass — fixed isGameComplete boss detection (core_boss not 'sovereign'), armor soft cap (damage floors at 15% of raw, not 1), zone-scaled loot tables (Normal→Legendary by zone), zone-scaled drop chance (15%→25%), zone-scaled fame gain (1×→6× multiplier). Full NG+ completeness pass.
• M19 (2026-04-11): New Game+ system — startNgPlus() resets zones/progress while keeping heroes, companions, inventory, and fame. NG+ scaling: enemies gain +35% HP/damage and +15% armor per tier with ✦ suffix on names. Victory screen shows 'New Game+ ✦' button when final boss is defeated. Title screen displays NG+ tier badge (✦ NG+N) when any save file has a NG+ run active. GameState tracks ngPlus tier. TownScreen shows NG+ indicator next to fame display.
• M18 (2026-04-11): Act 4 complete — The Cosmic Rift and Eternal Void zones (14 nodes, 4 new enemy types: Void Wraith, Star Horror, Cosmic Titan, The Unraveler). Item sets system with 4 named sets (Goblin Slayer's Garb, Veil Warden's Regalia, Ashen Wanderer's Kit, Hell-Touched Armor) and tiered bonuses. Shrine map nodes — heal/empower/fullrestore with one-use mechanic. Challenge nodes — optional hard fights with bonus loot. Act 4 combat backgrounds (cosmic blue/void black). ZONE_UNLOCK_MAP extended through eternal_void.
• M17 (2026-04-11): AchievementsScreen — 18 achievements across combat, party, economy, fame, and quests. Progress bar and unlock tracking. Trophies button in TownScreen. Companion personality traits — Aela (Patient), Borin (Aggressive), Lysa (Protective), Rekk (Opportunist) — each affects combat skill AI selection. Personality shown in Tavern hire cards. 9 new PixelLab sprites (Goblin Shaman, Cleric, Molten Golem, Rogue + more queued).
• M16 (2026-04-11): Town fame/reputation system — gained from combat victories (bonus for bosses), displayed in TownScreen header with title tiers (Unknown→Noticed→Known→Respected→Renowned→Legendary). 4 new quests added to QuestLogScreen (Veil Cultists' Purpose, Descent to Hell, The Emberveil Sovereign, plus new Act 3 objectives). Zone weather effects in combat — rain for Border Roads, fog for Thornwood, ash drift for Ashen Wastes, void sparks for Hell zones. Rogue + Cleric wired to sprite system.
• M15 (2026-04-11): Zone-specific combat backgrounds — 6 unique atmospheric scenes (Border Roads starfield, Thornwood tree silhouettes, Dust Roads mesa, Ember Plateau lava glow, Hell Breach spires, Shattered Core void). 2× speed toggle in combat HUD. Rest & Recover service at Cleric (restores all HP/MP for gold). Companion equipment support in InventoryScreen (companions now appear in character tabs). Ranger and Hell Knight sprites added (32 total). New PixelLab sprites queued (Rogue, Molten Golem).
• M14 (2026-04-11): PixelLab character sprites integrated — Warrior, Mage, Goblin Scout (4-direction pixel art, 68×68px). Sprite-based rendering in CombatScreen with geometric shape fallback. Act 3 zones added: Hell Breach and Shattered Core (7 nodes each) with 6 new enemies (Imp, Hell Knight, Void Shade, Demon Brute, Archfiend Malgrath boss, Emberveil Sovereign final boss). ZONE_UNLOCK_MAP extended through Act 3. Sprite assets cataloged in /demo-assets/.
• M13 (2026-04-11): Quest Log screen — 4 authored quests (Dangerous Roads, Into the Thornwood, The Seer's Warning, Through the Ashen Wastes). Progress tracked via GameState.storyFlags and completedBosses. Per-quest objective checklist, progress bar, act/status badges, lore badge. Journal button in TownScreen now opens QuestLogScreen.
• M12 (2026-04-11): Act 2 content — 6 new enemies (Ash Wraith, Cinder Hound, Molten Golem, Veil Cultist, Veil Sorcerer, Lava Titan). 2 new zones: The Dust Roads (7 nodes) and The Ember Plateau (7 nodes). Zone unlock chain: Border Roads → Thornwood → Dust Roads → Ember Plateau. MapScreen now pulls from ALL_ZONES (Act1+Act2). Act 2 zones auto-unlock after corresponding zone boss defeated.
• M11 (2026-04-11): CRITICAL BUG FIX — DialogScreen._finish() called onComplete before manager.pop(), causing CombatScreen to be pushed then immediately popped (combat appeared to lock up with looping audio). Fixed by reversing order: pop first, then fire callback. Also fixed: companion hp/mp initialization in Tavern hire, SaveManager load restores unlockedZones/completedBosses, dlg-done uses this._el.querySelector (not document.getElementById).
• M10 (2026-04-11): Zone progression — MapScreen shows zone tabs for unlocked zones, defeating a boss node unlocks next zone (Border Roads boss → Thornwood Forest). GameState tracks unlockedZones and completedBosses. Victory modal announces new zone unlock. MapScreen reads current zoneId from GameState on entry.
• M9 (2026-04-11): Dialog UX overhaul — backdrop now fully opaque (no UI leaking behind), tap-anywhere-on-bubble advances lines, 'Tap to continue' button made large + visible with clear label. Opening cinematic added (shown once per new game: scrolling story text, starfield sky, ember particles, mountain silhouette). Zone progression tracked in GameState (unlockedZones, completedBosses arrays).
• M8 (2026-04-10): Blacksmith service — upgrade item rarity (Normal→Magic→Rare→Legendary) and quality (Low→Medium→High→Elite→Exotic) for gold. Enchanter service — add new stat affixes to Magic/Rare/Legendary items with open slots. Both services fully wired with gold deduction and stat recalculation.
• M7 (2026-04-10): Fixed screen layering — TownScreen/MapScreen/InventoryScreen/SkillTree/Dialog/LevelUp all implement onPause (hide) and onResume (show) so pushing a new screen properly hides the one below. Full Act 1 enemy roster (Goblin Scout/Warrior/Shaman/Warlord, Corrupted Wolf/Bear, Bandits, Veil Wardens, Grax boss). Zone-specific encounter tables wired to map nodes. Status effects render as colored dots above HP bars.
• M6 (2026-04-10): Fixed critical bug — CharacterBuilderScreen called non-existent SaveManager.saveSlot; now uses GameState.init + saveCurrentGame. Hero skill AI in combat (45% chance per turn to use class skill). Status effects: Burn/Poison/Bleed (DoT per round), Stun (skip turn). AoE skill resolution (single/adjacent/group/row/all). Skill damage formulas respect damageStat + damageMult. Buff skills (Battle Cry party dmgBuff, Unbreakable dmgReduct). Status effect icons in log.
• M5 (2026-04-10): DialogScreen with typewriter text reveal, skill-check choices (DEX/STR/INT vs DC), outcome effects (gold, flags, items). LevelUpScreen for spending pending attribute points post-combat. Floating damage numbers in combat. Dialog nodes on map now route to DialogScreen instead of lore modal.
• M4 (2026-04-10): Skill tree UI (14 classes × 4 skills with talent nodes), inventory screen with equip/unequip logic per slot, save/load system (3 slots, versioned, migration), full GameState integration in combat (whole party fights, XP/gold awards, item drops, level-up detection).
• M3 (2026-04-10): Node map on canvas, zone system, encounter router, boss setup (Grax), combat screen with full turn order, hit/dodge/armor resolution, visual stances, victory/defeat flow, procedural item generation.
• M2 (2026-04-10): Town services (Merchant buy/sell, Tavern hiring, Cleric revive, Save modal), party panel, companion slots, map/inventory/skills navigation.
• M1 (2026-04-10): Project scaffold, title screen cinematic (clouds→logo drop→menu), 14-class character builder, attribute distribution, first town, Web Audio procedural music. Pre-game design report at /demo-assets/pre-game-report.html.Planned Milestones
M305 COMPLETE (2026-04-26) — Set items + uniques + 40 affixes (see changelog).
M149 COMPLETE — mod skills merge per-class.
M148 COMPLETE — catalogs wired into shared nav.
M147 COMPLETE — item-catalog.html.
M146 COMPLETE — enemy-catalog.html.
M145 COMPLETE — enemies bootstrap.
M144 COMPLETE — vanilla skill bootstrap + emoji cleanup.
M143 COMPLETE — vanilla bootstrap into mod registry.
M142 COMPLETE — stat warn-mode normalization (registry.normalizeStatsDeep canonicalizes strength→str/dex/int/con), protected core-mechanics list (14 vanilla classes + status types locked against override), 24-spell mechanic catalog doc (public/docs/spell-mechanics.md), /assets/spell-catalog.html tool (81 skills × 20 classes, filter/archetype/export-as-pack), 3 new example mod packs (custom-weapons, custom-enemies, custom-event), schemas + examples linked in custom-content.html. 5 new registry tests.
M140 COMPLETE (2026-04-17): preserveScroll rollout to ForgeScreen + PartyScreen — attribute / bench swap / upgrade clicks no longer scroll to the top on re-render. 185 tests pass.
M139 COMPLETE (2026-04-17): Codex formula pass + combat log damage breakdown tooltip — 10 new formulas added (computeSpellPower, computeSpellDamage, computeHealAmount, computeDotTick, computeBarrierAbsorb, computeRegenTick, computeLifeSteal, computeManaSteal, computeCritChance, computeCritDamage) and all 21 pre-existing formulas tagged with section ids so Codex routes them correctly. Combat log now shows Rolled / Armor / Resist / Blocked / Dealt on hover (and on tap for mobile) so players can see why damage was 0 against armored enemies. 185 tests pass.
M138 COMPLETE (2026-04-17): Scroll preservation across HireBuilder + Inventory — new ScrollPreserve helper captures scrollTop of all scrollable descendants plus window.scrollY before an innerHTML re-render, restores them after. Wired into HireBuilderScreen._render and InventoryScreen._render so clicking attribute +/- / equip / slot-picker no longer scrolls to the top of the page.
M137 COMPLETE (2026-04-17): Spritecook-first sprite loader + skill tree scroll preservation — CombatScreen._loadSprite now loads from /images/spritecook/ first, falls back to /images/sprites/ on 404 per variant. Fixes invisible pet companions (pet_wolf/pet_bear/pet_skeletal_warrior/pet_bone_golem) + any class whose spritecook art superseded pixellab. SkillTreeScreen._render now snapshots/restores scrollTop on panel + window so clicking +1 Attribute/Buy Talent no longer scrolls to top.
M136 COMPLETE (2026-04-17): Menu Visit Website + /game-info/ polish — TitleScreen 'Visit Website' now routes to site root (baseUrl) instead of /game-info/; removed emoji from 'Play Now' + 'Play Game' buttons on /game-info/; fixed stale narrative text ('Fourteen paths' -> 'Twenty paths', 'four increasingly harrowing acts' -> 'six') to match actual 20 classes and 6 acts.
M135 COMPLETE (2026-04-17): Weapon tooltip type + shield rebalance + misc polish — weaponCategory propagated into generated items so tooltips show HEAVY/LIGHT/MAGIC + Base/Total damage; 'Melee (Light) — DEX' tooltip fixed (Melee Heavy/Light defs, data-stat rewired in SkillTree + CharacterBuilder); shield base block normalized 20/30/40/50% with Bulwark affix capped +5/+15%; Block Chance/Power surfaced in Character Stats > Other Effects; Guildmaster fame encounter now fires on onResume (every town entry, not just load); Hire Custom + Create Hero + Skill Tree panels recolored brown/gold; bench characters tagged in notifications to clarify phantom skill points. 185 tests pass.
M134 COMPLETE (2026-04-17): Stats polish + stun immunity — STR/DEX/INT/CON + spellPower now blue when gear-boosted, tooltip defs for lifesteal/manasteal/crit/find/regen/initiative/trade-prices/block, skills menu recolored brown/orange/gold (no stray blue), Est. Damage/Heal row per-skill using actual stats, stun immunity 2+priorStunCount rounds documented in codex, wishlist <button> escaped + added to Tools nav, PartyScreen HP floor. Deferred + logged: skeleton/bone_golem/wolf/bear companion combat sprite fallback, Necromancer+Druid sprite desync. 185 tests pass.
M133 COMPLETE (2026-04-17): Event-chain flag ledger — GameState.hasFlag/incrementFlag/consumeFlag/requireFlags + matching DSL ops. Unlocks mod-authored event chains with persistent counters + AND/NOT flag gates. 185 tests pass.
M132 COMPLETE (2026-04-17): Inventory stat rounding fix + lifeSteal/manaSteal percent display fix (was 190% → now 1.9%) + affix range 3-12, Blacksmith Craft 3-column grid with all 12 slots × 3 tiers, void→legendary rename, Upgrade buttons visually disabled on insufficient materials, baked-in spellPower on orbs/tomes/caster accessories. 179 tests pass.
M131 COMPLETE (2026-04-17): Per-skill cooldown map — replaces single skillCooldown slot in CombatScreen + simulator. 179 tests pass. Unlocks multi-skill rotation per character.
M130 COMPLETE (2026-04-17): Deferred-items pass — goblin shaman flip, pet SPRITE_MAP entries, war_dog resolver confirmed, Druid/Necromancer investigation, combat reward code audit. New non-priority wishlist item: combat character placement stagger + vertical spread.
M129 COMPLETE (2026-04-17): Docs scaffolding + markdown viewer + CLAUDE.md updates; Spell Power display + tooltip clarity; image-review per-category isolation; session-only Base toggle; walk-anim cleanup; wishlist bank of 9 new user-reported items. Next: M130 — Spell Catalog tool + data-driven skills + variable skill count per character.
M128 COMPLETE (2026-04-16): Mod System v1 foundation — 9 JSON Schemas, 15-op Effect DSL runtime, pack registry + loader, /assets/custom-content.html upload UI, starter example pack (24 skills + 5 event chains + 2 loot tables), supporting primitives (unified status model, seeded RNG, shim telemetry, overheal→barrier, loot specifier). Mid-cycle: dropped unused N/W sprite variants from /assets gallery (only block/ko/attack/spell now shown), fixed image-review multi-select bugs (blue corner dot vs gold outline, Other-describe radio, Clear action button, mixed-actions warning), Oracle east_block sprite generated.
M127 COMPLETE (2026-04-16): Class/Appearance decoupling, wishlist tool launch, 10 companion east sprites + cleric_priestess full sprite set, /game-info portrait refresh, image-review tool enhancements (whole-sprite prompt mode, archive/library/delete, unassigned/archived sections), AI Integration wishlist items.
M120 COMPLETE (2026-04-16): 25-item mega-batch — spell damage rebalance, multi-target falloff, burning DoT, healer AI, crit affixes, Sharp/Potency split, return-to-town fix, Blacksmith merger with material-based Upgrade tab, 18 new item bases, 80×80 portraits, class icon everywhere, town menu reorder, in-game menu mobile scroll + restyle, custom main-menu confirm, single-save export/import, tooltip overhaul, Character Stats split, weapon Type/Base/Total tooltip, Combat Sim AI parity, combat BG wiring, Redesign Survey tool page.
M79 COMPLETE (2026-04-14): Full OpenAI roster regeneration + combat facing + SFX normalization.
M72 COMPLETE (2026-04-13) — Tap Weapons system + audio/map/UI fixes (see changelog).
M71 COMPLETE (2026-04-13) — Towns, Fame & Polish (see changelog). Next: M72 — Tap Weapons system.
M1–M66 COMPLETE (M66 = Dragon Expansion). Next: audio optimization (ffmpeg re-encoding of music/SFX for smaller payload), sprite animations, balance tuning.
Next (candidates for M121+): animation frames for 10 recent companions, hover-preview tooltips on Blacksmith Upgrade list, enemy portrait/sprite generation pass via SpriteCook.
- M216 (2026-04-22) COMPLETE: War Dog sprite redesign via SpriteCook 5-pose pipeline.
- M217 (2026-04-22) COMPLETE: 14-frame character art regen batch + new canonical sizing reference.
M292 (2026-04-26) — COMPLETE. Brainstorm/wishlist plumbing for the 93-item M293–M309 batch.
M293–M309 — PLANNED. See public/assets/wishlist.html#approved-brainstorm for the full milestone-grouped plan.Dicebound
A turn-based online co-op RPG for invite-only parties. Roll six-sided dice, stage them into equipment cards (weapons, spells, armor), play quick-play cards from hand, and push through a branching procedurally-generated world map. One-shot runs, meta-progression, legible iconographic design.
Prompt History
A turn-based online co-op RPG for invite-only friend parties. Combat is built around six-sided dice as action points: each turn you roll your dice and spend them into cards (weapons, spells, armor) whose slots may be blank (any value) or gated (e.g. 4+). Classes differ by loadout — a fighter has weapon + armor, a mage has three spell slots and no weapon. Cards in hand are either equipment (placed into a slot, activates when filled, dice can be pulled back until the last slot locks) or quick-play (played directly, no dice required). A long procedurally-generated branching world map leads the party through encounters, shops, and treasure; locked chests sit in the outskirts with nearby-but-inconvenient keys. One-shot runs: death ends the attempt, but classes, cards, and regions unlock across runs via meta-progression.
Changelog (16 milestones)
M162026-04-22M17 Blocker fixes + solo 2-class + combat UI restructure. BUGS: (1) Locked chest without key no longer blocks navigation — you simply walk p
M17 Blocker fixes + solo 2-class + combat UI restructure. BUGS: (1) Locked chest without key no longer blocks navigation — you simply walk past unopened (kind:'chest-skipped' logged) and can still advance through the map. (2) Chest/key nodes no longer display stale 'kobold' enemyId from their pre-conversion combat origin. (3) Leaving combat mid-run now prompts + ends the run instead of silently skipping the enemy. SOLO MODE: (4) New 2nd-hero class picker appears when you enter solo mode — each hero can be a different class. (5) Intents now route through whichever loopback client owns the current turn, so p1's turn actually plays (fixed: 'mage went first, on fighter's turn I still only see mage's cards'). Reward picks route to correct client. COMBAT UI: (6) Hand is now sticky at bottom so it's always visible without scrolling. (7) Partner panel auto-collapses to compact HP+name when not their turn; expands when they act. (8) Slot label + type both visible on every slot tooltip. ANIMATIONS: (9) 3D flip-deal animation on hand cards as they enter; activation + discard keyframes pre-registered. 52 tests (+1 chest/key stale-enemyId check).
M152026-04-22M16 Bugfix + UX sweep. (1) Map bug: key and chest were on the same map but not connected via any path — forced a key→chest edge (or chain th
M16 Bugfix + UX sweep. (1) Map bug: key and chest were on the same map but not connected via any path — forced a key→chest edge (or chain through intermediate rows) with a new test that verifies reachability across 3 regions × 5 seeds. (2) Class-leak bug: map treasure / chest nodes dropped region-hardcoded card IDs into ANY player's deck (e.g. Mage could get fighter-only smoke_bomb). Treasure + chest now present the same pick-1-of-3 class-scoped dialog as post-combat rewards, plus a shared 'Heal the party' option; chest picks bias toward rare. (3) Save/load: localStorage-backed saves (dicebound_saves_v1), any number, labeled, Load/Delete buttons in precombat; new server intent loadRun that rehydrates the run snapshot. (4) Solo loopback button: 'Play solo (2-hero local)' spins up a second WS client in the same browser and auto-joins as guest, so one person can play both characters through the real netcode. (5) Turn-banner: big sticky banner at top of combat view — 'YOUR TURN' / 'PARTNER' / 'ENEMY' / '✦ VICTORY' in different colors, pulse animation on your turn. (6) Tooltips everywhere: slot-type captions on hand cards + equipped slots, gate tooltips ('Accepts 3, 4, 5, 6…'), key/rewards/node pills, equipped-slot title. Slot type now visible as '→ weapon slot' label on hand cards. (7) Playwright smoke: desktop + iPhone 14 Pro viewports boot game.html with 6 classes, 3 regions, 13 enemies, no console errors. 51 vitest tests (1 new map-reachability).M142026-04-22M15 Tutorial + Run History. First-visit modal explains the turn/dice/slot loop and dismisses via Got it button (localStorage dicebound_tutor
M15 Tutorial + Run History. First-visit modal explains the turn/dice/slot loop and dismisses via Got it button (localStorage dicebound_tutorial_seen_v1). Completed runs push an entry to dicebound_history_v1 with {result, region, boss, classId, visited, date}; last 5 runs shown in the hub card. This wraps the Milestone 1-15 arc — game is playable end-to-end with meta-progression, audio, and onboarding.M132026-04-22M14 Motion + Audio Polish. Web Audio API synthesized SFX module at public/audio/sfx.js — no downloaded assets, lazy-initialized on first use
M14 Motion + Audio Polish. Web Audio API synthesized SFX module at public/audio/sfx.js — no downloaded assets, lazy-initialized on first user gesture. Sounds: dice_roll (noise burst + thud), die_place (pitched click), card_flip / card_activate (rising chime), hit (noise + low sawtooth), heal (ascending sine), victory (ascending arpeggio), defeat (descending sawtooth), turn_start, error. Dice-roll SFX triggers on pool-empty → pool-filled transition; hit / heal SFX tied to HP-delta detection. Screen shake on damage >= 5. Persistent mute button in bottom-right (localStorage-backed dicebound_muted). Tumble + shake CSS keyframes added; card/die interactions now audible.
M122026-04-22M10 Meta-Progression via localStorage (numbered 12 after M12/M13 shipped first). localStorage key `dicebound_meta_v1` tracks runsCompleted,
M10 Meta-Progression via localStorage (numbered 12 after M12/M13 shipped first). localStorage key `dicebound_meta_v1` tracks runsCompleted, runsFailed, bossesDefeated[], cardsSeen{}, totalDamage. Unlocks: Warlock at 1 run, Artificer at 2 runs; Tidewash region requires Ember Wyrm kill; Spire region requires Tidecaller kill. Hub card at top of precombat shows progress pills + remaining unlock hints; Reset button. Class picker + region picker gray out locked options and show the unlock requirement. State-diff tracks boss defeats (maxHp >= 24 heuristic), run outcomes, and damage dealt.M112026-04-22M13 Two New Classes (pure data). Warlock (3 dice, 2 curse slots + 1 weapon, 18 HP) — trades HP for tempo via Soul Pact, Siphon, Hex, Chain B
M13 Two New Classes (pure data). Warlock (3 dice, 2 curse slots + 1 weapon, 18 HP) — trades HP for tempo via Soul Pact, Siphon, Hex, Chain Bolt, Pact Fang. Artificer (4 dice, 2 gadget + 1 armor, 20 HP) — consistent combo class with Gear Coil (adds Haste), Ratchet Shield (even-gated armor), Overclock (prepares exploding), Steam Dump (hits all enemies), Spanner (reusable basic). 11 new cards covering both classes. PROTECTED_IDS list updated to include warlock + artificer. Class count 4 → 6, card pool 44 → 55 (54 + 1 basic) — playable from the precombat class picker without any code changes.
M102026-04-22M12 Advanced Dice Mechanics (numbered 10 because M10 deferred). Three new dice-state effect ops: prepareDiceState (queue weighted/exploding
M12 Advanced Dice Mechanics (numbered 10 because M10 deferred). Three new dice-state effect ops: prepareDiceState (queue weighted/exploding for next roll), empowerDice (+N to every die in pool), markDiceGhost (ghost pierces armor). rollTurn applies weighted (reroll <4 once) and exploding (each 6 spawns an extra die up to cap 6) per actor.nextRollMods. damage op inspects ctx.slotDice for ghost status → auto-piercing. 9 new cards across rarities: Loaded Dice, Volatile Focus, Empower, Shadow Pierce, Cursed Gamble, Twin Strike, Consecrate, Meteor, Guardian Stance. 4 new engine tests covering each new op. 50 tests total.
M92026-04-22M9+M11 combined: 2 new regions (Tidewash Hollows, 8 rows; Shattered Spire, 9 rows) with distinct enemy rosters and palettes (teal / purple v
M9+M11 combined: 2 new regions (Tidewash Hollows, 8 rows; Shattered Spire, 9 rows) with distinct enemy rosters and palettes (teal / purple vs. Emberhollow gold). Region picker added to precombat. 8 new enemies (brine_pirate, deep_eel, drowned, tidecaller boss, sky_cultist, stone_golem, banshee, spire_warden boss) and 11 new enemy cards covering Bleed/Slow/Mark/armor archetypes. REGIONS exported from map.js for client introspection. 2 new map tests verifying each region spawns its correct boss and row count. 46 tests total.
M82026-04-21M8 Post-Combat Card Rewards. After every combat victory in a run, each player is offered a pick-1-of-3 from their class's non-basic card poo
M8 Post-Combat Card Rewards. After every combat victory in a run, each player is offered a pick-1-of-3 from their class's non-basic card pool, weighted by rarity (common 3 / uncommon 2 / rare 1). Choice is seeded from room.seed + visited-nodes so it's deterministic. Picked card joins that player's deck and persists through the run. Skip button also supported. Boss spoils screen terminates the run on pick (so you still get the final reward before returning to precombat). New intents pickReward / skipReward. Map navigation is blocked while rewards are pending.
M72026-04-21M7 Playtest Hotfixes. Reusable basic weapons per class (Iron Fists / Novice Staff / Trained Dagger / Simple Prayer) — never discard, always
M7 Playtest Hotfixes. Reusable basic weapons per class (Iron Fists / Novice Staff / Trained Dagger / Simple Prayer) — never discard, always in hand after use. Discard pile + deck/hand counts visible; click discard chip for popup. Deck reshuffles from discard when empty. Damage/heal floating numbers + red/green radial flash on HP delta (covers DoT ticks too, not just direct damage). Enemy turn paced 450ms/action server-side for readable sequence. Dice row layout fixed for partner/enemy actors. Waiting-turn placeholder. Enemy panel pulse when acting.
M62026-04-21M6 Card Depth + Dice Cap + Enemy Roster. 4 classes were already defined in data (M2); this milestone expands the card pool from 21 → 31 with
M6 Card Depth + Dice Cap + Enemy Roster. 4 classes were already defined in data (M2); this milestone expands the card pool from 21 → 31 with new common/uncommon cards per class (Battleaxe, Tower Shield, Rally, Lightning Bolt, Chain Spark, Mind Burn, Venom Strike, Mark Target, Caltrops, Sanctify, Divine Spark, Link Fates, Overcharge, Second Wind). Enemy roster grows from 3 → 5 (adds Kobold + boss-grade Ember Wyrm with Dragonbreath + Tail Swipe). Emberhollow region points its boss node at Ember Wyrm. Endgame dice cap 6 is enforced in both rollTurn base roll and rollDice effect op; new vitest proves the cap. 44 tests total.
M52026-04-21M5 Procedural World Map. public/engine/map.js generates a seeded branching 7-row graph with 11 nodes for the Emberhollow Wilds region; every
M5 Procedural World Map. public/engine/map.js generates a seeded branching 7-row graph with 11 nodes for the Emberhollow Wilds region; every non-start node has guaranteed reachability; one key+chest pair planted mid-run. Server-side `run` state threads combat into the map loop (HP persists between nodes via partyPersist, rewards collected, boss node marks run complete). New intents startRun / navigate / endRun. Map view in game.html renders an SVG-edge graph with Font Awesome node icons; host-only navigation. 5 new map tests — 48 tests total.
M42026-04-21M4 Multiplayer Combat + Reconnect. 2-player sequential turns over the M1 netcode end-to-end. Precombat lobby shows both members' live class
M4 Multiplayer Combat + Reconnect. 2-player sequential turns over the M1 netcode end-to-end. Precombat lobby shows both members' live class picks; Start Combat gated on all connected members picking. Reconnect: a guest that drops keeps their party slot; any new socket joining the same code takes over that slot (joined event carries `reconnect:true`) and gets the full authoritative state. Host-reload still closes the room per M1 decision. Partner panel renders in real time alongside the local player.
M32026-04-21M3 Combat v1. public/engine/combat.js is pure state transitions (rollTurn/equipCard/placeDie/pullDieBack/playQuick/endTurn/enemyAutoTurn) dr
M3 Combat v1. public/engine/combat.js is pure state transitions (rollTurn/equipCard/placeDie/pullDieBack/playQuick/endTurn/enemyAutoTurn) driven by ctx.rng for determinism. Server wires combat as new intents; enemy turns auto-run after a human ends. public/game.html is a full combat UI with class + enemy picker, HP bars, dice-pool tap-to-select → slot-gate tap-to-place, live status chips, victory/defeat banner, combat log — works iPhone 14 Pro portrait AND desktop. 5 new combat tests (happy path, quick-play, pullback lock semantics, enemy auto-turn, seed determinism); 43 tests total.
M22026-04-21M2 Effect Registry + 4 Classes + Character Sheet. Built public/engine/ runtime (effects.js op DSL, statusModel.js turn-based ticks, registry
M2 Effect Registry + 4 Classes + Character Sheet. Built public/engine/ runtime (effects.js op DSL, statusModel.js turn-based ticks, registry.js with PROTECTED_IDS, expr.js slot-math evaluator, loader split into browser/node). Single JSON data file public/data/corepack.json declares 13 dice states + 12 card states + 12 statuses + 4 classes (Fighter/Mage/Rogue/Cleric) + ~20 starter cards + 3 starter enemies + their cards — all data-driven. sheet.html renders class slot layout, starting deck, and status/dice-state legends from the registry; Font Awesome Free vendored at public/vendor/fa/. 33 vitest tests cover rng determinism, effect ops (damage/heal/armor/applyStatus/flags/rollDice), status lifecycle (stack/refresh/tick/-1 perma), slot-expr precedence, registry pack loading + PROTECTED_IDS enforcement.
M12026-04-21M1 Scaffold + Branding + Netcode Foundation. Dicebound named and themed (Wildfrost-adjacent palette). Authoritative Node+WebSocket server on
M1 Scaffold + Branding + Netcode Foundation. Dicebound named and themed (Wildfrost-adjacent palette). Authoritative Node+WebSocket server on :5317 with server-owned seeded PRNG shared with client tests (determinism verified). Lobby with 4-letter room codes and pass-token acceptance test; debug page with loopback-2-client solo mode, latency/drop sims, state diff, seed inspector, --chaos server flag. ADR-001 effect registry (adapted from game13 mods system) and ADR-002 netcode written. Playwright e2e asserts matching state across two browser contexts. Docs updated (netcode.md added, minimalist iconographic pillar in ui-aesthetics, determinism rule in quality-and-testing). No combat yet — combat lands in M3.
Full changelog (legacy text)
### M17 — Blocker fixes + Solo 2-class + Combat UI overhaul (2026-04-22) **Blocker bugs fixed (from playtest):** - **Chest without key no longer traps you** — walks you past unopened; you keep moving on the map. - **Chest/key nodes** no longer show stale 'kobold' labels from pre-conversion combat origin. - **Leave combat during a run** now prompts and ends the run instead of silently skipping the enemy. - **Solo mode turn stall fixed** — when mage and fighter share a browser, intents now route through whichever loopback client owns the current turn. (Fighter's turn now actually plays instead of showing the mage's cards.) **Solo mode:** - Second class picker for the 2nd hero — each plays a different class. - Reward picks automatically toggle between p0 and p1 picks in solo. **Combat UI restructure:** - **Sticky hand** at the bottom — always visible, no scroll needed. - **Compact partner panel** when it's not their turn (collapses to name + HP). Auto-expands when they act. - **3D flip-deal** animation for newly drawn hand cards; activation + discard keyframes pre-registered for future polish. - Slot tooltips improved (`weapon slot · reusable` caption etc). ### M16 — Bugfix + UX Sweep + Save/Load + Solo + Playwright (2026-04-22) **Bugs squashed (from playtest):** - Key→chest unreachable on same map → forced reachable edge (+ test guards 3 regions × 5 seeds). - Map treasure/chest nodes leaked class-wrong cards (e.g. Mage got fighter's smoke_bomb) → now same class-scoped pick-1-of-3 as combat rewards, plus a 'Heal the party' shared option; chests bias toward rare. **Features:** - **Save / Load** — localStorage (dicebound_saves_v1), multiple labeled saves, Load/Delete buttons in precombat. Server intent `loadRun` rehydrates snapshot. - **Play solo (2-hero local)** button — one browser, two WS clients, auto-guest joins and picks Fighter so host can drive both sides through real netcode. - **Big turn banner** — sticky top-of-combat 'YOUR TURN' / 'PARTNER' / 'ENEMY' / '✦ VICTORY' with pulse animation on your turn + audible turn_start cue on transitions. **UX sweep:** - Hand cards show `→ weapon slot` / `→ quick` captions + tooltip explaining equip-vs-quick-play. - Gate pips show `Accepts 3, 4, 5, 6…` tooltips. - Equipped slot cells show slot type + tooltip with current card description. - Map pills (node / keys / rewards) have tooltips explaining each. **Testing:** - Playwright: desktop (1440×900) + iPhone 14 Pro (393×852) viewport smoke verifies game.html boots clean, 6 classes, 3 regions, 13 enemies, no console errors. 51 vitest tests (new map-reachability). ### M15 — Tutorial + Run History (2026-04-22) - First-visit modal explains the dice/slot/activate loop; dismissed on Got it (localStorage-backed). - Run history tracked in localStorage — last 5 runs shown in the hub card on the precombat screen. - Wraps the M1-M15 arc: playable end-to-end with meta-progression, audio, onboarding, and 6 classes across 3 regions. ### M14 — Motion + Audio Polish (2026-04-22) - `public/audio/sfx.js` — Web Audio synthesized SFX (dice roll, die place, card flip, card activate, hit, heal, victory, defeat, turn start, error). Zero downloaded assets; lazy-init on first user gesture. - Hooked SFX into state diffs — dice-roll fires on pool fill, hit/heal on HP delta, victory/defeat on outcome change. Card interactions (equip, activate, place die, error) play in game.html handlers. - Screen shake on ≥5 damage taken. - Persistent mute button (bottom-right, localStorage-backed). - Tumble keyframe for dice and shake keyframe for body. ### M10 — Meta-Progression (2026-04-22) - localStorage-backed meta: `runsCompleted`, `runsFailed`, `bossesDefeated`, `totalDamage`. - Warlock unlocks at 1 run completed; Artificer at 2. - Tidewash region unlocks after beating Ember Wyrm; Shattered Spire after beating Tidecaller. - Hub card on precombat shows progress pills + remaining unlock hints; Reset Progress button. - Class + region pickers gray out locked options and show the unlock requirement inline. - Meta updates auto-derived from server state diffs (no new intents). ### M13 — Two New Classes (pure data) (2026-04-22) - **Warlock** — 3 dice, slots (curse × 2, weapon), 18 HP. HP-trading DoT build. Cards: Pact Fang (reusable basic), Hex, Siphon, Chain Bolt, Soul Pact. - **Artificer** — 4 dice, slots (gadget × 2, armor), 20 HP. Consistent combo class. Cards: Spanner (reusable basic), Gear Coil, Ratchet Shield, Overclock, Steam Dump. - 11 new cards. PROTECTED_IDS expanded. Pure-JSON addition — no code changes to combat/effects. ### M12 — Advanced Dice Mechanics (2026-04-22) - 3 new effect ops: `prepareDiceState` (weighted / exploding for next roll), `empowerDice` (+N to every die, cap 6), `markDiceGhost` (pierces armor). - `rollTurn` honors per-actor `nextRollMods` — weighted rerolls values < 4 once, exploding spawns extra dice on 6s. - Damage op reads `ctx.slotDice` for ghost-tagged dice → auto-piercing. - 9 new cards: **Loaded Dice** (weighted next roll), **Volatile Focus** (exploding next roll), **Empower** (+1 every die in pool), **Shadow Pierce** (ghost 2 dice), **Cursed Gamble** (+2 dice, take 2), **Twin Strike** rogue, **Consecrate** cleric (heal+armor), **Meteor** mage (huge 3-slot piercing burn), **Guardian Stance** fighter/cleric. - 4 new engine tests (50 total). ### M9 + M11 — 3 Regions, 8 New Enemies, 2 New Bosses (2026-04-22) - **Tidewash Hollows** (8 rows, teal accent) — brine pirates, deep eels, drowned, boss Tidecaller with tidal surge + kraken grip. - **Shattered Spire** (9 rows, purple accent) — sky cultists, stone golems, banshees, boss Spire Warden with warden's hammer + stone barrier. - Region picker in precombat; startRun intent takes regionId. - 8 new enemies + 11 new enemy cards, mostly introducing Bleed/Slow/Marked/armor archetypes to the encounter pool so the three regions feel mechanically distinct. - REGIONS map exported for client introspection. - 2 new map tests (46 total). ### M8 — Post-Combat Card Rewards (2026-04-21) - After every combat victory in a run, each player sees a pick-1-of-3 choice from their class's non-basic card pool, weighted by rarity (common 3 / uncommon 2 / rare 1). Options are seeded from `room.seed + visitedNodes` so they're deterministic. - Reward phase blocks map navigation until all connected members pick or skip. - Picked cards are stamped `forActor` and only shuffled into that player's deck on next combat. - Boss spoils still offered before the run's final victory screen. - New intents `pickReward` / `skipReward`. ### M7 — Hotfixes from Playtesting (2026-04-21) - **Reusable basic weapons per class** (Iron Fists / Novice Staff / Trained Dagger / Simple Prayer) — `reusable: true` keeps them in hand on activation, so you can't run out of cards mid-run. - **Discard pile visible** with deck/discard/hand pill row per player; click the discard chip for a popup of what's there. - **Deck reshuffles from discard** when empty; logged in combat log. - **Damage / heal floating numbers** + red/green radial flash on the impacted actor panel. Diff'd from previous state so they fire on any HP delta (not just direct damage ops — DoT tick damage also shows). - **Enemy turn paced at ~450ms per action** (server-side) — rolls, equips, places each die, activates, plays quicks, ends turn in visible sequence instead of one instant burst. - **Dice row layout fixed** for partner/enemy — wrapped in .dice-pool flex container so dice stay square. - **Waiting-turn placeholder** — own dice pool shows "Waiting — you'll roll N dice on your turn" instead of empty box. - **Enemy panel pulse animation** when it's their turn. ### M6 — Card Depth + Dice Cap + Enemy Roster (2026-04-21) - Card pool 21 → 31. Each class gets 3+ new common/uncommon cards that touch different effect patterns (armor stacking, DoT combos, Focus/Rage buffs, healer coop, dice-roll amplifiers). Two universal uncommons (Overcharge, Second Wind) available to any class. - Enemy roster 3 → 5 (Kobold fast low-roller, Ember Wyrm boss with Dragonbreath + Tail Swipe). Map region now uses Ember Wyrm as its boss node. - Endgame dice cap 6: enforced in `combat.rollTurn` (base roll clamped) and `effects.rollDice` (extra-die op clamped). Test covers cap enforcement at 5→roll-3 = 6. - 44 tests total. ### M5 — Procedural World Map (2026-04-21) - `public/engine/map.js` — seeded branching-graph generation. One region (Emberhollow Wilds), 7 rows, 11 nodes, key+chest pair placed mid-run. Every non-start node has at least one incoming edge (tested). Deterministic for a given seed. - Server-side `run` state: map, currentNodeId, visitedNodes, keys, rewards, partyPersist (HP carries between combats). New intents `startRun`, `navigate`, `endRun`. Combat nodes auto-start combat using the node's enemyId; victory returns to the map and advances the run; boss victory = run complete; any defeat = run end. - Map view in game.html: SVG-edge graph, Font Awesome node icons (sword/treasure/key/chest/dragon/flag), host-only navigation, live stat pills (current node, keys held, rewards collected). - 5 new map tests (seed determinism, start/boss existence, key+chest pair, reachability, neighbor correctness). 48 tests total. ### M4 — Multiplayer Combat + Reconnect (2026-04-21) - The combat engine already supported N-person parties (from M3); this milestone wires the 2-player path end-to-end: both members pick a class before combat, host starts, turns alternate host → guest → enemy → host … - Precombat lobby shows both roles + their class picks live; Start Combat is disabled until all connected members have chosen. - Reconnect: if a guest disconnects mid-combat, their party slot stays alive but marked `connected: false`. A new socket joining the same code takes over that slot (sees `reconnect:true` on the `joined` event) and gets the full combat snapshot. Host-reload still kills the room per original design. - Partner panel in game.html shows their HP, statuses, and turn marker in real time. ### M3 — Combat v1 (server-authoritative, strict sequential turns) (2026-04-21) - `public/engine/combat.js` — pure state transitions: createCombat, rollTurn, equipCard, placeDie, pullDieBack, playQuick, endTurn, enemyAutoTurn. All RNG via `ctx.rng` (server-owned seeded PRNG). - Server wires combat into room state: new intents `pickClass`, `startCombat`, `equipCard`, `placeDie`, `pullDieBack`, `playQuick`, `endTurn`, `leaveCombat`. Enemy turns auto-run on the server immediately after a human endTurn. - `public/game.html` — full combat UI (iPhone 14 Pro portrait + desktop). Class picker, enemy picker, HP bars, dice pool (tap die → tap slot gate), equipped slots showing gate requirements, hand cards, turn marker, combat log, victory/defeat banner. Keyboard support (Enter = end turn, Esc = main menu). - 5 new combat tests (tests 39–43): happy path, quick-play, pullback lock semantics, enemy auto-turn, deterministic replay given seed. Total 43 tests passing. ### M2 — Effect Registry + 4 Classes + Character Sheet (2026-04-21) - Effect runtime (`public/engine/effects.js`) with op DSL: damage/heal/armor/applyStatus/removeStatus/rollDice/modifyDie/setFlag/requireFlag/trigger-attach. - statusModel.js with turn-based durations (-1 = permanent), stack refresh, armor aggregator. - registry.js loads JSON packs; PROTECTED_IDS guards core classes/statuses/diceStates/cardStates from being overridden by mods. - expr.js — safe evaluator for slot-value math (`$slot[0]+$slot[1]`, `$slot.sum`, `$slot.count`, `$stacks`, `$amount`, + - * /, parens, unary minus). No eval/Function — pure parser. - `public/data/corepack.json` declares the full M1-era inventory: 13 dice states, 12 card states, 12 statuses, 4 classes (Fighter, Mage, Rogue, Cleric), ~20 starter cards (equipment + quick-play), 3 enemies, their cards. - `sheet.html` renders class slot layout + starting deck + status/dice-state legends entirely from the registry. Font Awesome Free vendored at `public/vendor/fa/`. - 33 vitest tests across rng/effects/expr/statusModel/registry. All determinism-critical paths covered. ### M1 — Scaffold + Branding + Netcode Foundation (2026-04-21) - Name chosen: Dicebound. Wildfrost-adjacent palette (teals/warm golds/deep purples/storybook whites). - Authoritative Node+WebSocket server at server/ on port 5317, server-owned seeded PRNG. - Lobby: 4-letter room codes, create/join, responsive portrait + desktop. - M1 acceptance test: pass-token across two browsers, server-authoritative state. - Debug page: latency injector, packet-drop slider, force-disconnect, side-by-side state inspector with diff, seed replay, loopback-2-client solo mode. - ADR-001 (effect registry) + ADR-002 (netcode) written. - Wishlist seeded with M2–M8 plan, 20 build archetypes, post-launch features, deferred dice/card/status states. - Docs updated: new `netcode.md`, `ui-aesthetics.md` minimalist-iconographic pillar, `quality-and-testing.md` deterministic-RNG requirement.
Planned Milestones
### Plan (from M1 kickoff) - **M1 — Scaffold + Branding + Netcode Foundation** ✅ 2026-04-21 - **M2** — Effect registry + JSON schemas + 4 classes defined in data + character sheet UI - **M3** — Combat v1 (single-class, single-enemy, strict sequential turns, local) - **M4** — Multiplayer combat over M1 netcode, reconnect handling - **M5** — Procedural world map (region templates, seeded generation, branching nodes, key/lock pairing) - **M6** — 3 remaining classes (Mage, Rogue, Cleric) + enough cards for distinct feel. Endgame dice cap 6. - **M7** — Meta-progression (class, card pool, region unlocks) + run death → hub - **M8+** — TBD (additional classes, wishlist effects, more regions, polish) Milestones are immutable — never overwrite an existing `milestone_N/` directory. Adjust future plans via `promptHistory`, not by rewriting past entries.
Neonaut
A goofy, physics-forward 2D neon-tech space sim. Build rockets from individual parts, wrestle through atmosphere, land on alien worlds with unique gravity and hazards, deploy rovers, scan for new planets, and salvage resources to craft ever more extravagant craft. Inspired by Kerbal Space Program and Dig-N-Rig.
Prompt History
2-d comical space sim. Build rockets with individual parts, try to lift off through the atmosphere to space station. Land on alien planets with different physics and alien features. Explore and find resources to craft more extravagent parts with new features.
Changelog (15 milestones)
M152026-04-20M15 — fix rotation bugs (parts stayed north-up, thrust always vertical, flame fixed downward); use chassis.angle everywhere. Rebalance engin
M15 — fix rotation bugs (parts stayed north-up, thrust always vertical, flame fixed downward); use chassis.angle everywhere. Rebalance engine thrust so starter rockets have TWR 2-3 instead of 17.
M142026-04-20M14 — fix rocket invisible/frozen at launch (Body.create mutated bodies array, clobbering sub-body metadata). Hide empty goal pill, drop dep
M14 — fix rocket invisible/frozen at launch (Body.create mutated bodies array, clobbering sub-body metadata). Hide empty goal pill, drop deprecated slider-vertical.
M132026-04-20M13 — fix black-screen launch regression (Body.translate on compound sub-bodies wrecked rocket spawn); swap in real Font Awesome Pro SVG ico
M13 — fix black-screen launch regression (Body.translate on compound sub-bodies wrecked rocket spawn); swap in real Font Awesome Pro SVG icons.
M122026-04-20M12 — rigid chassis physics (no more noodle rocket), corrected thrust tuning so TWR=1 actually hovers, timeScale slowed to 0.7 for mobile, o
M12 — rigid chassis physics (no more noodle rocket), corrected thrust tuning so TWR=1 actually hovers, timeScale slowed to 0.7 for mobile, out-of-fuel no longer auto-fails, inline SVG icons replace colored emoji on buttons, mobile workshop header wraps, launchpad preview includes mirrored parts, camera shows thrusters + ground, parachute + landing gear + fuel rules now explained on launchpad and How-to-Play.
M112026-04-20M11 — bug fixes: pad spawn-crash eliminated (require liftoff), canvas re-attaches on second flight, Easy Mode checkbox on launchpad forgives
M11 — bug fixes: pad spawn-crash eliminated (require liftoff), canvas re-attaches on second flight, Easy Mode checkbox on launchpad forgives pad/landing crashes.
M102026-04-19M10 — Career Polish: 10-achievement badge system, discoveries codex on tech tree, achievements panel on title, results-screen achievement to
M10 — Career Polish: 10-achievement badge system, discoveries codex on tech tree, achievements panel on title, results-screen achievement toasts.
M92026-04-19M9 — no summary recorded
M9 released 2026-04-19
M82026-04-19M8 — no summary recorded
M8 released 2026-04-19
M72026-04-19M7 — no summary recorded
M7 released 2026-04-19
M62026-04-19M6 — no summary recorded
M6 released 2026-04-19
M52026-04-19M5 — no summary recorded
M5 released 2026-04-19
M42026-04-19M4 — no summary recorded
M4 released 2026-04-19
M32026-04-19M3 — no summary recorded
M3 released 2026-04-19
M22026-04-19M2 — no summary recorded
M2 released 2026-04-19
M12026-04-19Workshop + Launch core: drag parts onto a build grid, save rockets to IndexedDB, launch into a Matter.js physics simulation with thrust, fue
Workshop + Launch core: drag parts onto a build grid, save rockets to IndexedDB, launch into a Matter.js physics simulation with thrust, fuel burn, atmospheric drag, structural stress, and crash/land detection. Neon-tech visual style (Orbitron + cyan/magenta) with parallax starfield. Responsive for iPhone portrait through desktop.
Full changelog (legacy text)
M1 (2026-04-19): Workshop + Launch core — Pixi+Matter boot, 8-part catalog (pod, nose, 2 tanks, 2 engines, fin, decoupler, gear), grid-snap workshop with save/load templates to IndexedDB, mirrored radial placement, launch scene with thrust/drag/structural-stress physics, camera-follow, neon parallax starfield, full HUD with mobile touch pad, crash/land/out-of-fuel/breakup detection, mission summary screen, 14 Playwright tests + 7 Vitest unit tests all passing.
Planned Milestones
M1 (shipped 2026-04-19): Workshop + Launch core — Pixi+Matter boot, 8 core parts, snap assembly, IndexedDB templates, atmosphere physics, crash/land detection, Playwright. M2–M10: planned (see game.md).
Stable Construct
Neon occult action looter-shooter. Sprint through cultist-infested corridors, chain elemental spells, loot fast, die faster, retry.
Prompt History
Top-down twin-stick, sprint through neon corridors blasting cultists with chained spells, grab loot between rooms, die fast and retry. Inspirations: Hotline Miami, Magicka, Diablo. Mobile portrait + desktop, 5-min sessions, single-player casual 16+. Vanilla canvas, localStorage, OpenAI/Spritecook/ElevenLabs for assets. Polished release by milestone 10.
Changelog (20 milestones)
M202026-04-19M20 — no summary recorded
M20 released 2026-04-19
M192026-04-19M19 — no summary recorded
M19 released 2026-04-19
M182026-04-19M18 — no summary recorded
M18 released 2026-04-19
M172026-04-19M17 — no summary recorded
M17 released 2026-04-19
M162026-04-19M16 — no summary recorded
M16 released 2026-04-19
M152026-04-19M15 — no summary recorded
M15 released 2026-04-19
M142026-04-18M14 — no summary recorded
M14 released 2026-04-18
M132026-04-18M13 — no summary recorded
M13 released 2026-04-18
M122026-04-18M12 — no summary recorded
M12 released 2026-04-18
M112026-04-18M11 — no summary recorded
M11 released 2026-04-18
M102026-04-18M10 — no summary recorded
M10 released 2026-04-18
M92026-04-18M9 — no summary recorded
M9 released 2026-04-18
M82026-04-18M8 — no summary recorded
M8 released 2026-04-18
M72026-04-18M7 — no summary recorded
M7 released 2026-04-18
M62026-04-18M6 — no summary recorded
M6 released 2026-04-18
M52026-04-18M5 — no summary recorded
M5 released 2026-04-18
M42026-04-18M4 — no summary recorded
M4 released 2026-04-18
M32026-04-18M3 — no summary recorded
M3 released 2026-04-18
M22026-04-18M2 — no summary recorded
M2 released 2026-04-18
M12026-04-18M1 — no summary recorded
M1 released 2026-04-18
Full changelog (legacy text)
M15: 25 achievements + unlock toasts, cumulative stats tracker (per-slot), achievements screen (grid + progress bar), credits screen (scrollable, M1-M15 highlights), demo mode (?demo=1 autopilot seeded showcase), bug sweep (grunt arena clamp, pause/escape closes shop/loadout/meta, leaderboard runType tag, dev flags guarded in seeded runs), final rebalance (fireball CD 0.90→0.75, AOE 70→80px, frost CD 0.70→0.60, freeze 1.2→1.5s, iframes 700→800ms, nightmare boss HP 1.70→1.60, drop rates tuned), soak test (30s/20 enemy simulation). M14: Boss Architect 4-phase encounter, telegraphed attacks, pulse weaver + choir warden minibosses. M13: Spell crafting system, rune bag, loadout screen, 3 named presets per slot. M12: Miniboss trio (Twinblade, Choir Warden, Pulse Weaver), elite enemy modifiers. M11: Daily seed + share codes, weekly aggregate on title screen. M10: Tutorial overlay, local leaderboard, accessibility settings (reduced motion, chromatic aberration toggle). M9: 3 biomes (Undercroft/Neon Cathedral/Abyss Circuit), 10-room run (3 acts + boss), difficulty curve (normal/hard/nightmare), 3 save slots with legacy migration, slot-selection screen, biome-specific arena art.
Planned Milestones
M1 Vertical slice ✓ • M2 Rooms & enemies ✓ • M3 Spell system ✓ • M4 Loot ✓ • M5 Boss encounter ✓ • M6 Meta progression ✓ • M7 Audio pass ✓ • M8 Art pass ✓ • M9 Biomes + balance ✓ • M10 Polish release ✓ • M11 Daily seed + share codes ✓ • M12 Miniboss trio + elites ✓ • M13 Spell crafting ✓ • M14 Boss Architect ✓ • M15 Final polish ✓
HOOPSHOT
Slingshot basketball vs. CPU. Drag to aim, release to launch, and out-score the computer across 9 progressively wilder rounds with shrinking, moving hoops and wind. Touch + mouse. PixelLab art, OpenAI backgrounds, ElevenLabs sound.
Prompt History
build a basketball game iphone and kbm pc support where you launch a basketball pokemon-go pokeball style with direction and force toward a hoop to earn points against a computer taking turns with progressive difficulty. Like a catapult or angry birds with your finger or mouse. include 2d graphics from pixellab and background graphics from openai and sounds from elevenlabs. Landing page with animated logo. Ship complete in one milestone regardless of size and deploy to GitHub Pages.
Changelog (4 milestones)
M42026-04-13M4 — no summary recorded
M4 released 2026-04-13
M32026-04-13M3 — no summary recorded
M3 released 2026-04-13
M22026-04-13M2 — no summary recorded
M2 released 2026-04-13
M12026-04-13M1 — no summary recorded
M1 released 2026-04-13
Full changelog (legacy text)
M1 (2026-04-13): Shipped complete game — slingshot physics, 9-round you-vs-CPU with progressive difficulty (shrinking / moving hoop, wind), PixelLab ball+hoop+trophy, OpenAI arena+street+logo, 10 ElevenLabs SFX, animated landing page, asset gallery, game-over overlay.
Planned Milestones
M1 COMPLETE — Full game shipped in a single milestone.
Penny Panic
Two players, one phone. Split the screen in half — you own your side. Ten pennies fall into the void. Race your opponent to tap them first. Shoot the bugs that fly at you for bonus points. Miss one and lose a point. When the last penny is gone, highest score wins. First to win two rounds takes the match. Three round types, void events, chaos mode, career stats, and a settings screen — all in 43kB of pure JavaScript. No images. No audio files. Just the void.
Prompt History
give me a prompt for a game, not 3d, don't get me banned lmao — uh — take a penny there's two players player 1 takes a penny player 2 takes a penny there are 10 pennies when all pennies are taken the player with the higher score wins and you can get more points by shooting bugs that fly at you — but the retarded layer of absolutely fucking nothing is absolutely fucking necessary
Changelog (29 milestones)
M292026-04-10M29 — no summary recorded
M29 released 2026-04-10
M282026-04-10M28 — no summary recorded
M28 released 2026-04-10
M272026-04-10M27 — no summary recorded
M27 released 2026-04-10
M262026-04-10M26 — no summary recorded
M26 released 2026-04-10
M252026-04-10M25 — no summary recorded
M25 released 2026-04-10
M242026-04-10M24 — no summary recorded
M24 released 2026-04-10
M232026-04-10M23 — no summary recorded
M23 released 2026-04-10
M222026-04-10M22 — no summary recorded
M22 released 2026-04-10
M212026-04-10M21 — no summary recorded
M21 released 2026-04-10
M202026-04-10M20 — no summary recorded
M20 released 2026-04-10
M192026-04-10M19 — no summary recorded
M19 released 2026-04-10
M182026-04-10M18 — no summary recorded
M18 released 2026-04-10
M172026-04-10M17 — no summary recorded
M17 released 2026-04-10
M162026-04-10M16 — no summary recorded
M16 released 2026-04-10
M152026-04-10M15 — no summary recorded
M15 released 2026-04-10
M142026-04-10M14 — no summary recorded
M14 released 2026-04-10
M132026-04-10M13 — no summary recorded
M13 released 2026-04-10
M122026-04-10M12 — no summary recorded
M12 released 2026-04-10
M112026-04-10M11 — no summary recorded
M11 released 2026-04-10
M102026-04-10M10 — no summary recorded
M10 released 2026-04-10
M92026-04-10M9 — no summary recorded
M9 released 2026-04-10
M82026-04-10M8 — no summary recorded
M8 released 2026-04-10
M72026-04-10M7 — no summary recorded
M7 released 2026-04-10
M62026-04-10M6 — no summary recorded
M6 released 2026-04-10
M52026-04-10M5 — no summary recorded
M5 released 2026-04-10
M42026-04-10M4 — no summary recorded
M4 released 2026-04-10
M32026-04-10M3 — no summary recorded
M3 released 2026-04-10
M22026-04-10M2 — no summary recorded
M2 released 2026-04-10
M12026-04-10M1 — no summary recorded
M1 released 2026-04-10
Full changelog (legacy text)
M24 (2026-04-10): Final Polish — animated letter drop-in title, winner celebration particles (48 gold/copper), round end wipe (400ms fade-to-black), spring-physics series dots, improved bug bezier antennae and elbowed legs with wings. M23 (2026-04-10): Settings Screen — canvas-drawn panel with Sound, Color Blind Mode, Round Variety toggles, Clear History action. M22 (2026-04-10): Sound Overhaul — ambient void hum, richer coin chord, wide stereo spread on match win, void event eerie descending tone. M21 (2026-04-10): Match History — pp_history localStorage (last 5 matches), LAST MATCH comparison, LAST/BEST records on title. M20 (2026-04-10): Void Events — SLOW PENNY, BUG FREEZE, DOUBLE POINTS. M19 (2026-04-10): Performance. M1-M18 (2026-04-10): Core gameplay.
Planned Milestones
M1-M25: ALL COMPLETE (2026-04-10)
Stormtown
Stormtown v1.0 — Survive massive tornadoes and zombie hordes in a procedural city. Rescue Sam, collect power-ups, drive cars, dodge weather events, and escape by helicopter. 20 milestones of content: 6 zombie variants, 6 map zones, night mode, ghost replay, achievements, XP progression, daily challenge seeds, endless survival mode, and a boss zombie.
Prompt History
tornadoes + zombies + rescue friend + helicopter escape
Changelog (7 milestones)
M192026-04-10M19 — no summary recorded
M19 released 2026-04-10
M182026-04-10M18 — no summary recorded
M18 released 2026-04-10
M172026-04-10M17 — no summary recorded
M17 released 2026-04-10
M162026-04-10M16 — no summary recorded
M16 released 2026-04-10
M152026-04-10M15 — no summary recorded
M15 released 2026-04-10
M142026-04-10M14 — no summary recorded
M14 released 2026-04-10
M12026-04-15M1 — no summary recorded
M1 released 2026-04-15
Full changelog (legacy text)
M24-25 (2026-04-10): Level 4 Blackout City — BLACKOUT watermark, emergency flickering lights at every 4th intersection, dark blue world overlay (depth 34), 4 extra power line hazards, level-specific radio messages, music intensity 0.6, second boss zombie 60s after first. Level 5 Eye of the Storm — 1.25x tornado scale, darker tornado base/spin, eye-of-storm dark circle at world center, level-specific radio messages, second boss 50s after first, cinematic camera shake/zoom/pan on escape. Final victory screen for L5 — starfield, 'THE STORM IS GONE' title with pulse, Storm Master badge, 200 XP bonus, achievements unlock. Level select row on title screen (L1-L5, unlock gated by previous level best time). Per-level best time saved to stormtown_best_lN localStorage keys. M22-23 (2026-04-10): Level 2 (Greenfield Suburbs) visual identity — green patches, park zones, yellow road dashes, suburb radio messages. Level 3 (Industrial District) — rust building stripes, chain-link fences, runway center lines, 3 extra gas canisters with warning markings, industrial radio messages. Level-aware zombie thresholds (brutes earlier on L3+, runners earlier on L2+). Level intro banners for L2+. Per-level Sam dialogue. Helipad scales with level. M20 (2026-04-10): Expanded 2-slot inventory — E key to use, double-tap to cycle, all power-ups storable. M19 (2026-04-10): Environmental hazards — power lines (electrocute+stun), gas canisters (tornado-triggered AoE). M18 (2026-04-10): Map neighborhood zones — 6 districts, per-zone colors, zombie density bias, zone HUD indicator. M17 (2026-04-10): Boss Zombie (Mega Brute) — 15 HP, charge attack, enrage phase, world HP bar, achievement. M16 (2026-04-10): XP meta-progression — 20 levels, cosmetic tints, title unlocks, cosmetics selector. M15 (2026-04-10): Night mode — day→night at 90s, player light radius, torch power-up, tornado night glow. M14 (2026-04-10): 12 achievements with persistence, slide-in notifications, gallery on title. M13 (2026-04-10): Survivor chain — rescued NPCs follow player, tornado sacrifice, chain speed penalty. M12 (2026-04-10): Ghost replay — records path, replays as ghost sprite with dissolve on death point. M11 (2026-04-10): Full audio — 3-layer generative music, dynamic intensity, car engine, footsteps. M10 (2026-04-10): Weather events — fog, electrical storm, hailstorm, weather HUD icons. M9 (2026-04-10): Power-ups — medkit, flare, windbreaker, torch. Inventory HUD. M8 (2026-04-10): Zombie variants — Runner, Brute, Screamer. Kill counter. Stomping. M7 (2026-04-10): Visual FX — building collapse particles, enhanced tornado, car fire, flood ripples, lightning. M6 (2026-04-10): Score, endless mode, death recap, daily challenge seeds, ARIA accessibility. M5 (2026-04-10): Cars, building destruction, road flooding. M4 (2026-04-10): Rain, radio broadcasts, panic vignette, tornado trails. M3 (2026-04-10): Random seeds, bonus survivors, zombie scaling, leaderboard, tutorial. M2 (2026-04-10): Tornado AI rework, zombie respawn, Web Audio, sprint button, mini-map. M1 (2026-04-10): Full game foundation.
Planned Milestones
M1–M25 ALL COMPLETE (2026-04-10). See changelog for details. M26+ PLANNED: tornado merge mechanic, companion AI, procedural challenge modes, performance optimization, PWA support, credits screen.
Aethermoor Chronicles
A vibrant action RPG with loot, levelling, skill trees, mining and crafting. Fight enemies in real-time combat across a large open world.
Prompt History
A colorful action RPG with real-time combat set in a world of rolling meadows, stone wastes, and glowing crystal caverns. Explore an open world, mine ores, craft gear, and battle increasingly dangerous enemies. Visual style inspired by Cat Quest — 2D overhead map with upright character sprites.
Changelog (9 milestones)
M92026-04-13M9 — no summary recorded
M9 released 2026-04-13
M82026-04-10M8 — no summary recorded
M8 released 2026-04-10
M72026-04-10M7 — no summary recorded
M7 released 2026-04-10
M62026-04-10M6 — no summary recorded
M6 released 2026-04-10
M52026-04-10M5 — no summary recorded
M5 released 2026-04-10
M42026-04-10M4 — no summary recorded
M4 released 2026-04-10
M32026-04-10M3 — no summary recorded
M3 released 2026-04-10
M22026-04-10M2 — no summary recorded
M2 released 2026-04-10
M12026-04-10M1 — no summary recorded
M1 released 2026-04-10
Full changelog (legacy text)
M1 — Engine Foundation: game loop, Wang-tile tilemap renderer, camera with smooth follow, player movement (WASD/touch), pixel-art sprite sheets, basic HUD M2 — World & Objects: interactive world objects (chests, ore veins, trees), minimap, day/night lighting cycle, object spawn system M3 — Combat Core: melee and ranged attack modes, enemy AI FSM (goblin scout, forest sprite, stone golem), particle hit effects, floating damage numbers M4 — Loot System: item drops on kill, 5 rarity tiers (Common → Legendary), 25 item definitions, inventory panel with grid layout M5 — Equipment & Stats: paper-doll equipment screen, full stat aggregation pipeline, experience and level-up with attribute allocation M6 — Skill Trees: Warrior / Ranger / Mage skill trees (12 nodes each, 36 total), active skills on hotbar, passive stat effects M7 — Mining & Crafting: ore node mining with progress bars, 20 crafting recipes, smelting and crafting benches M8 — Spells & Magic: 10 spell types (fireball, frost nova, blink, chain lightning, meteor, etc.), 6 status effects (burning/frozen/poisoned/shocked/bleeding/stunned), Elder Stone Golem multi-phase boss M9 — World Expansion & Quests: 8 quests with quest log, world map overlay, elite enemy variants M10 — Polish & Save System: save/load system, main menu with class selection, virtual joystick touch controls, gamepad support M16 — Content Expansion II: 4 new world objects (mithril_ore_node, sign_post, animated campfire, waystone); 8 new quests (total 16); ZoneEvents system with 4 rotating events + slide-in HUD notification M17 — Audio System: Web Audio API AudioManager with procedural tones for all game events (melee, spells, mining, loot, level-up, death, boss roar); lazy init on first user gesture M18 — Zones 4-5 + Final Boss: Ember Highlands (orange ambient tint, 4 enemy types, mithril/darkstone ores); The Void (purple tint, final boss arena); BossEmberDrake (3-phase, 2000 HP, fireball patterns, imp summons); BossFinal The Ancient One (4-phase, 4000 HP, spiral orbs, enrage timer, white flash death) M19 — Achievements + Persistence: AchievementSystem with 15 achievements + localStorage persistence + slide-in popup notifications; AchievementsUI panel; player title system (Adventurer/Void Slayer); enemiesKilled + itemsCollected tracking M20 — Feature Complete + QA: GAME_OVER state with You Died screen + respawn/menu buttons; combo counter system (hit streak x1-x10+, XP bonus); pickup range indicator ring; ambient zone tint via Renderer; globalAlpha resets; campfire HP regen (5/s nearby); audioInit on first gesture
Planned Milestones
M1 — Engine Foundation (Game loop, Wang tilemap, camera, player movement) M2 — World & Objects (World objects, minimap, day/night cycle) M3 — Combat Core (Enemy AI FSM, melee/ranged, particles, damage numbers) M4 — Loot System (25 items, 5 rarity tiers, inventory panel, loot drops) M5 — Equipment & Stats (Paper doll, stat aggregation, level-up + attribute points) M6 — Skill Trees (3 paths x 12 nodes, active skills on hotbar, passive effects) M7 — Mining & Crafting (Ore mining with progress bar, 20 crafting recipes) M8 — Spells & Magic (10 spells, status effects, Elder Stone Golem boss) M9 — World Expansion & Quests (8 quests, quest log, world map, elite enemies) M10 — Polish & Save System (Save/load, main menu, touch controls, gamepad) M11-M15 — COMPLETE (see prior releases) M16 — Content Expansion II (4 world objects, 8 quests, ZoneEvents) M17 — Audio System (Web Audio API, procedural SFX, lazy init) M18 — Zones 4-5 + Final Boss (BossEmberDrake, BossFinal/The Ancient One, ambient tints) M19 — Achievements + Persistence (15 achievements, AchievementsUI, player titles) M20 — Feature Complete + QA (Game Over screen, combo system, polish)
Vagrant & Ash
A mobile-first dark fantasy survival RPG. Lead a party of 1–4 across a dying continent. Point-buy character creation, permadeath, emergent storytelling. Every choice costs something.
Prompt History
A mobile-first dark fantasy survival RPG. Lead a party of 1–4 across a dying continent. Point-buy character creation, permadeath, emergent storytelling. Every choice costs something.
Changelog (80 milestones)
M802026-04-10M80 — no summary recorded
M80 released 2026-04-10
M792026-04-10M79 — no summary recorded
M79 released 2026-04-10
M782026-04-10M78 — no summary recorded
M78 released 2026-04-10
M772026-04-10M77 — no summary recorded
M77 released 2026-04-10
M762026-04-10M76 — no summary recorded
M76 released 2026-04-10
M752026-04-10M75 — no summary recorded
M75 released 2026-04-10
M742026-04-10M74 — no summary recorded
M74 released 2026-04-10
M732026-04-10M73 — no summary recorded
M73 released 2026-04-10
M722026-04-10M72 — no summary recorded
M72 released 2026-04-10
M712026-04-10M71 — no summary recorded
M71 released 2026-04-10
M702026-04-10M70 — no summary recorded
M70 released 2026-04-10
M692026-04-10M69 — no summary recorded
M69 released 2026-04-10
M682026-04-10M68 — no summary recorded
M68 released 2026-04-10
M672026-04-10M67 — no summary recorded
M67 released 2026-04-10
M662026-04-10M66 — no summary recorded
M66 released 2026-04-10
M652026-04-10M65 — no summary recorded
M65 released 2026-04-10
M642026-04-10M64 — no summary recorded
M64 released 2026-04-10
M632026-04-10M63 — no summary recorded
M63 released 2026-04-10
M622026-04-10M62 — no summary recorded
M62 released 2026-04-10
M612026-04-10M61 — no summary recorded
M61 released 2026-04-10
M602026-04-10M60 — no summary recorded
M60 released 2026-04-10
M592026-04-10M59 — no summary recorded
M59 released 2026-04-10
M582026-04-09M58 — no summary recorded
M58 released 2026-04-09
M572026-04-09M57 — no summary recorded
M57 released 2026-04-09
M562026-04-09M56 — no summary recorded
M56 released 2026-04-09
M552026-04-09M55 — no summary recorded
M55 released 2026-04-09
M542026-04-09M54 — no summary recorded
M54 released 2026-04-09
M532026-04-09M53 — no summary recorded
M53 released 2026-04-09
M522026-04-09M52 — no summary recorded
M52 released 2026-04-09
M512026-04-09M51 — no summary recorded
M51 released 2026-04-09
M502026-04-09M50 — no summary recorded
M50 released 2026-04-09
M492026-04-09M49 — no summary recorded
M49 released 2026-04-09
M482026-04-09M48 — no summary recorded
M48 released 2026-04-09
M472026-04-09M47 — no summary recorded
M47 released 2026-04-09
M462026-04-09M46 — no summary recorded
M46 released 2026-04-09
M452026-04-09M45 — no summary recorded
M45 released 2026-04-09
M442026-04-09M44 — no summary recorded
M44 released 2026-04-09
M432026-04-09M43 — no summary recorded
M43 released 2026-04-09
M422026-04-09M42 — no summary recorded
M42 released 2026-04-09
M412026-04-09M41 — no summary recorded
M41 released 2026-04-09
M402026-04-09M40 — no summary recorded
M40 released 2026-04-09
M392026-04-09M39 — no summary recorded
M39 released 2026-04-09
M382026-04-09M38 — no summary recorded
M38 released 2026-04-09
M372026-04-09M37 — no summary recorded
M37 released 2026-04-09
M362026-04-09M36 — no summary recorded
M36 released 2026-04-09
M352026-04-09M35 — no summary recorded
M35 released 2026-04-09
M342026-04-09M34 — no summary recorded
M34 released 2026-04-09
M332026-04-09M33 — no summary recorded
M33 released 2026-04-09
M322026-04-09M32 — no summary recorded
M32 released 2026-04-09
M312026-04-09M31 — no summary recorded
M31 released 2026-04-09
M302026-04-09M30 — no summary recorded
M30 released 2026-04-09
M292026-04-09M29 — no summary recorded
M29 released 2026-04-09
M282026-04-09M28 — no summary recorded
M28 released 2026-04-09
M272026-04-09M27 — no summary recorded
M27 released 2026-04-09
M262026-04-09M26 — no summary recorded
M26 released 2026-04-09
M252026-04-09M25 — no summary recorded
M25 released 2026-04-09
M242026-04-09M24 — no summary recorded
M24 released 2026-04-09
M232026-04-09M23 — no summary recorded
M23 released 2026-04-09
M222026-04-09M22 — no summary recorded
M22 released 2026-04-09
M212026-04-09M21 — no summary recorded
M21 released 2026-04-09
M202026-04-09M20 — no summary recorded
M20 released 2026-04-09
M192026-04-09M19 — no summary recorded
M19 released 2026-04-09
M182026-04-09M18 — no summary recorded
M18 released 2026-04-09
M172026-04-09M17 — no summary recorded
M17 released 2026-04-09
M162026-04-09M16 — no summary recorded
M16 released 2026-04-09
M152026-04-09M15 — no summary recorded
M15 released 2026-04-09
M142026-04-09M14 — no summary recorded
M14 released 2026-04-09
M132026-04-09M13 — no summary recorded
M13 released 2026-04-09
M122026-04-09M12 — no summary recorded
M12 released 2026-04-09
M112026-04-09M11 — no summary recorded
M11 released 2026-04-09
M102026-04-09M10 — no summary recorded
M10 released 2026-04-09
M92026-04-09M9 — no summary recorded
M9 released 2026-04-09
M82026-04-09M8 — no summary recorded
M8 released 2026-04-09
M72026-04-09M7 — no summary recorded
M7 released 2026-04-09
M62026-04-09M6 — no summary recorded
M6 released 2026-04-09
M52026-04-09M5 — no summary recorded
M5 released 2026-04-09
M42026-04-09M4 — no summary recorded
M4 released 2026-04-09
M32026-04-09M3 — no summary recorded
M3 released 2026-04-09
M22026-04-09M2 — no summary recorded
M2 released 2026-04-09
M12026-04-09M1 — no summary recorded
M1 released 2026-04-09
Full changelog (legacy text)
M1 — Foundation: Vite 6 + React 19 scaffold, full CSS design system (Ashen Black palette), all game data (7 races, 15 backgrounds, 30 traits, 25 skills, 12 biomes), GameContext + 6 sub-reducers + seeded PRNG, title screen with procedural SVG ash background, character creation (point-buy, party 1–4, synergy detection), journey screen (biome art, HP bars, resource tracking, travel log) M2 — Encounter system: event cards, branching choices, stat checks, 20+ events, outcome resolutions, encounter history M3 — Camp screen + turn-based combat: rest mechanics, watch system, enemy data (20+ enemy types), combat turn order, ability system M4 — Town/settlement system: shop economy, tavern rumours, healer services, town gate & passage M5 — Environment images + mobile polish: OpenAI-generated biome art, responsive layout audit, touch target enforcement M6 — Full event library: 50+ encounter events, biome hazard events, disease/injury conditions, trait-gated outcomes M7 — Game over & epitaph system: 11 unique endings, procedural epitaph generation from journey data, run summary screen M8 — Save/load hardening + PWA + autosave: localStorage + IndexedDB persistence, Workbox offline caching, autosave on every action M9 — Story arcs, companion dialogue & journal: 3 story arc chains, companion voice lines, journal overlay with run chronicle M10 — Balance pass + content audit + 10-milestone report: stat curve tuning, encounter weight rebalancing, full content review M11–M20 — Event system hardening: event deck reshuffling, biome-conditional event pools, item condition effects, disease spread mechanics, morale system integration M21–M30 — Combat depth + town expansion: combo attacks, status effects (burning/stunned/poisoned), town rumour quests, black market, healer recipes, faction reputation seeds M31–M34 — Content expansion: 30+ additional encounters, multi-stage encounter chains, rare legendary item tier, item synergy detection M35 — Win state & journey structure: destination system, final landmark encounter, victory screen with run stats M36 — New Game Setup: difficulty presets, scenario selection, cursed-start modifiers, NG+ unlock tracking M37 — Character depth & morale: bond system, inter-party dialogue, morale thresholds triggering narrative events M38 — World pushback: environmental hazard escalation, faction response events, supply scarcity curves M39 — Boss encounters + player guidance: 3 boss encounter types, contextual hint system, glossary overlay M40 — Chronicle, persistence & polish: run chronicle persistence across sessions, UI animation pass, PWA manifest v2 M41 — Run modifiers & cursed starts: 12 run modifier cards, cursed-start scenarios, modifier synergy detection M42 — Faction memory & story flags: persistent faction reputation, global story flags, flag-gated encounter branches M43 — New Game+ unlock progression: NG+ tier system, unlockable races/scenarios/modifiers, achievement tracking M44 — Encounter pack — The Long Dark: 20 new winter biome encounters, multi-step encounter chains using M42 flags M45 — Combat depth — tactics & enemy variety: flanking bonuses, retreat mechanic, 8 new enemy archetypes, elite variants M46 — Town expansion — rumours, quests & black market: 15 quest chains, black market vendor, faction-gated services M47 — Ambient audio & UI sound design: 5 ambient loops, 12 UI sound effects, audio settings, Howler.js integration M48 — Animation pass & screen transitions: CSS keyframe transitions between all screens, combat hit-flash, death animation M49 — Bundle splitting & PWA offline audit: code splitting by screen, Workbox precache manifest, Lighthouse PWA 100 M50 — v1.0 ship: save reliability hardening, final balance pass, release candidate validation, v1.0 tag M51 — Post-launch fix sprint: save migration for existing runs, encounter weight hot-fixes, mobile layout patches M52 — Accessibility pass: ARIA labels, keyboard navigation for all modals, colour-contrast audit (WCAG AA) M53 — Deepened lore content: expanded race lore in glossary, 10 new trait descriptions, biome flavour text rewrites M54 — Extended encounter library: 40+ new encounters spanning all 12 biomes, including rare cross-biome event chains M55 — Asset optimisation: WebP conversion for all biome art, lazy-loading for large assets, bundle size −30 % M56 — Condition system overhaul: 8 new conditions (frostbite, corruption, blight), condition stacking rules, cure items M57 — Major refactor: state management decomposition, engine/UI boundary hardening, test coverage to 60 % M58 — Voice lines & micro-events: 120 voiced character reactions, 30 micro-event interrupts during travel M59 — Dynamic difficulty & difficulty scaling: adaptive encounter weights based on party health/resources, hard-mode curve M60 — Faction quest chains: 3 full faction story arcs (6 quests each), faction-exclusive endings M61 — Equipment overhaul: 25 new items, set bonuses, item crafting recipes from town alchemist M62 — UI/UX refinement: redesigned inventory panel, drag-and-drop equipment, tooltip system, party sort order M63 — Map system expansion: fog-of-war reveal, discovered location pins, map annotation notes M64 — Scenario pack — The Withered Coast: 5 new biomes, 35 new encounters, coastal faction and unique boss M65 — Performance optimisation: React render audit, memoisation pass, 60 fps on mid-range Android M66 — Narrative endings expansion: 6 new endings (total 17), ending gallery with unlock conditions visible M67 — Polish sprint & current milestone: notification toast system, pause menu, biome transition cards, portrait component
Planned Milestones
M1–M10 — Foundation through first content pass M11–M20 — Event system hardening & morale M21–M34 — Combat depth, towns, content expansion M35–M40 — Win state, difficulty, chronicle & polish M41–M50 — Run modifiers, factions, NG+, audio, v1.0 ship M51–M57 — Post-launch fixes, accessibility, refactor M58–M62 — Voice lines, dynamic difficulty, faction quests, equipment M63–M67 — Map expansion, Withered Coast, performance, endings gallery, polish M68 — Localisation: i18n scaffold, EN/ES/FR/DE string extraction M69 — Controller support: gamepad input mapping, vibration feedback M70 — Multiplayer foundation: shared-seed co-op run synchronisation (experimental)
Wanderlight
A turn-based caravan RPG with branching dialogs. Lead a party of adventurers across a medieval fantasy world threatened by demonic corruption. Features side-scrolling caravan travel, tactical grid combat, 12 skill trees, and context-sensitive dialog options.
Prompt History
A turn-based caravan RPG — lead a party of adventurers across a medieval fantasy world threatened by demonic corruption. Side-scrolling caravan travel, deep branching dialogs, tactical grid combat, and 12 skill trees. Tone: whimsical like Terry Pratchett meets D&D.
Changelog (14 milestones)
M142026-04-13M14 — no summary recorded
M14 released 2026-04-13
M132026-04-05M13 — no summary recorded
M13 released 2026-04-05
M122026-04-06M12 — no summary recorded
M12 released 2026-04-06
M112026-04-06M11 — no summary recorded
M11 released 2026-04-06
M102026-04-06M10 — no summary recorded
M10 released 2026-04-06
M92026-04-05M9 — no summary recorded
M9 released 2026-04-05
M82026-04-05M8 — no summary recorded
M8 released 2026-04-05
M72026-04-05M7 — no summary recorded
M7 released 2026-04-05
M62026-04-05M6 — no summary recorded
M6 released 2026-04-05
M52026-04-05M5 — no summary recorded
M5 released 2026-04-05
M42026-04-05M4 — no summary recorded
M4 released 2026-04-05
M32026-04-05M3 — no summary recorded
M3 released 2026-04-05
M22026-04-05M2 — no summary recorded
M2 released 2026-04-05
M12026-04-05M1 — no summary recorded
M1 released 2026-04-05
Full changelog (legacy text)
- M13: Combat bug fixes — enemy pathfinding, item picker, mobile UI, debug logging - M12: Combat AI & difficulty scaling, sophisticated party AI - M11: Companions & party travel, pack animals, vehicles, caravan visuals - M9: Town & vendors — shops, inn, services - M8: Items & equipment system - M7: Dialog system with branching choices - M6: Skills & abilities — 12 skill trees - M5: Combat core — turn-based grid combat - M4: World travel — side-scrolling caravan - M1: Foundation — PixiJS v8, input system, test harness
Planned Milestones
MVP target: Milestone 15 - M10: Quest system — main/side/companion quests, procedural generation - M13: All 12 regions with unique biomes, encounters, and bosses - M14: Save system & death handling - M15: MVP integration & polish — full game loop playable - M16+: Art generation via PixelLab, additional content
Astral Crypts
A top-down action roguelite with procedural dungeon generation, 4 classes (Ironclad, Riftmage, Phantom, Voidpriest), and meta-progression. Built with PixiJS v8 at 480×270 internal resolution scaled to 3×. Features melee/ranged combat, boss encounters, equipment, and pixel art.
Prompt History
A top-down action roguelite where you descend through procedurally generated ancient crypts floating in a dimensional void. Each run is unique, death is permanent but unlocks persist. A lone adventurer chasing a mysterious signal through ruins of fallen civilizations.
Changelog (27 milestones)
M302026-04-13M30 — no summary recorded
M30 released 2026-04-13
M292026-04-05M29 — no summary recorded
M29 released 2026-04-05
M252026-04-03M25 — no summary recorded
M25 released 2026-04-03
M242026-04-03M24 — no summary recorded
M24 released 2026-04-03
M232026-04-03M23 — no summary recorded
M23 released 2026-04-03
M222026-04-03M22 — no summary recorded
M22 released 2026-04-03
M212026-04-03M21 — no summary recorded
M21 released 2026-04-03
M202026-04-03M20 — no summary recorded
M20 released 2026-04-03
M192026-04-03M19 — no summary recorded
M19 released 2026-04-03
M182026-04-03M18 — no summary recorded
M18 released 2026-04-03
M172026-04-03M17 — no summary recorded
M17 released 2026-04-03
M162026-04-03M16 — no summary recorded
M16 released 2026-04-03
M152026-04-03M15 — no summary recorded
M15 released 2026-04-03
M142026-04-03M14 — no summary recorded
M14 released 2026-04-03
M132026-04-03M13 — no summary recorded
M13 released 2026-04-03
M122026-04-03M12 — no summary recorded
M12 released 2026-04-03
M112026-04-03M11 — no summary recorded
M11 released 2026-04-03
M102026-04-03M10 — no summary recorded
M10 released 2026-04-03
M92026-04-03M9 — no summary recorded
M9 released 2026-04-03
M82026-04-03M8 — no summary recorded
M8 released 2026-04-03
M72026-04-03M7 — no summary recorded
M7 released 2026-04-03
M62026-04-03M6 — no summary recorded
M6 released 2026-04-03
M52026-04-03M5 — no summary recorded
M5 released 2026-04-03
M42026-04-03M4 — no summary recorded
M4 released 2026-04-03
M32026-04-03M3 — no summary recorded
M3 released 2026-04-03
M22026-04-03M2 — no summary recorded
M2 released 2026-04-03
M12026-04-03M1 — no summary recorded
M1 released 2026-04-03
Full changelog (legacy text)
- M25: Character select screen with class descriptions - M24: HUD polish — health/mana/xp bars, class icon, floor display - M23: Minimap with room grid, fog of war, player position - M22: Level-up system with XP and stat point allocation - M21: Relic system — 10 starter relics with passive effects - M17: Boss encounter — Lord of Dust (3-phase fight) - M10: Save/load system with run state and meta-progression - M1: Project bootstrap — Vite + PixiJS v8, debug tools, test harness
Planned Milestones
Phase 3: First Art Pass (M26–M35) - M26: Player class sprites via PixelLab - M27: Stone Crypts enemy sprites - M28: Dungeon tiles - M29: Map objects (chest, torch, shrine, barrel, pillar) - M30–M31: Sprite animations (player + enemy) - M32–M34: Particle effects, dynamic lighting, screen shake - M35: Main menu with animated background Phase 4: Biome 2 — Arcane Archives (M36–M48) - New tileset, enemies, boss (The Archivist) - Secret rooms, challenge rooms, puzzle rooms, traps, lore tablets Phase 5: Biomes 3+4 — Forge of Ruin & Void Sanctum (M49–M63)
Spellroads
An open-world turn-based RPG set in a procedurally generated Norse world. Assemble a party of adventurers, travel the Spellroads — ancient magical highways — and restore them from growing darkness. 2–4 player local co-op, formation-based combat, and deep character progression.
Prompt History
An open-world turn-based RPG in a procedurally generated Norse world. Assemble a party and travel the Spellroads — ancient magical highways — restoring them from growing darkness. 2–4 player local co-op with formation-based combat and deep character progression.
Changelog (33 milestones)
M332026-04-13M33 — no summary recorded
M33 released 2026-04-13
M322026-04-02M32 — no summary recorded
M32 released 2026-04-02
M312026-04-02M31 — no summary recorded
M31 released 2026-04-02
M302026-04-02M30 — no summary recorded
M30 released 2026-04-02
M292026-04-02M29 — no summary recorded
M29 released 2026-04-02
M282026-04-02M28 — no summary recorded
M28 released 2026-04-02
M272026-04-02M27 — no summary recorded
M27 released 2026-04-02
M262026-04-02M26 — no summary recorded
M26 released 2026-04-02
M252026-04-02M25 — no summary recorded
M25 released 2026-04-02
M242026-04-02M24 — no summary recorded
M24 released 2026-04-02
M232026-04-02M23 — no summary recorded
M23 released 2026-04-02
M222026-04-02M22 — no summary recorded
M22 released 2026-04-02
M212026-04-02M21 — no summary recorded
M21 released 2026-04-02
M202026-04-02M20 — no summary recorded
M20 released 2026-04-02
M192026-04-02M19 — no summary recorded
M19 released 2026-04-02
M182026-04-02M18 — no summary recorded
M18 released 2026-04-02
M172026-04-02M17 — no summary recorded
M17 released 2026-04-02
M162026-04-02M16 — no summary recorded
M16 released 2026-04-02
M152026-04-02M15 — no summary recorded
M15 released 2026-04-02
M142026-04-02M14 — no summary recorded
M14 released 2026-04-02
M132026-04-02M13 — no summary recorded
M13 released 2026-04-02
M122026-04-02M12 — no summary recorded
M12 released 2026-04-02
M112026-04-02M11 — no summary recorded
M11 released 2026-04-02
M102026-04-02M10 — no summary recorded
M10 released 2026-04-02
M92026-04-02M9 — no summary recorded
M9 released 2026-04-02
M82026-04-02M8 — no summary recorded
M8 released 2026-04-02
M72026-04-02M7 — no summary recorded
M7 released 2026-04-02
M62026-04-02M6 — no summary recorded
M6 released 2026-04-02
M52026-04-02M5 — no summary recorded
M5 released 2026-04-02
M42026-04-02M4 — no summary recorded
M4 released 2026-04-02
M32026-04-02M3 — no summary recorded
M3 released 2026-04-02
M22026-04-02M2 — no summary recorded
M2 released 2026-04-02
M12026-04-02M1 — no summary recorded
M1 released 2026-04-02
Full changelog (legacy text)
- M32: Companion system — 12 hireable companions with personality traits - M31: Random events & loot tables — 15 Norse travel events, 8 loot tables - M30: Faction & reputation system — 8 factions with standing tiers - M29: Crafting system — 20 recipes - M21: New biomes (swamp, crystal caves, cursed wastes) - M20: Desktop packaging (Electron) - M19: Prestige system + 10 new skill trees (44 total) - M17: Dungeon interiors — room-based procedural dungeons - M15: Save system, achievements, compendium - M6: Full turn-based grid combat with initiative and AI
Planned Milestones
No additional milestones currently defined beyond M32. Future focus areas: - Art generation pass for remaining placeholder sprites - Online co-op via WebSocket - Steam/itch.io release packaging - Additional quest content and regions - Balance pass and endgame content
Roguelike III
A third-person top-down twin-stick action RPG. Full conversion from the isometric Roguelike engine to fast-paced twin-stick combat with 7 classes, 360° aiming, dash/roll mechanics, and mobile virtual joystick support.
Prompt History
Convert the isometric roguelike engine into a fast-paced twin-stick action RPG with 360° aiming, dash and roll mechanics, and mobile virtual joystick support.
Changelog (4 milestones)
M42026-04-13M4 — no summary recorded
M4 released 2026-04-13
M32026-04-01M3 — no summary recorded
M3 released 2026-04-01
M22026-04-01M2 — no summary recorded
M2 released 2026-04-01
M12026-04-01M1 — no summary recorded
M1 released 2026-04-01
Full changelog (legacy text)
- M3: Kill combo system, boss intro cinematic, dedicated boss HP bar, 3 new enemies (Berserker, Hexer, Spider), touch controls polish - M2: Character creation fix, loading screen fix, viewport meta tag, JS/CSS caching - M1: Full engine conversion — top-down twin-stick, 8-dir movement, projectile combat, lighting, 6 enemy types, wave system
Planned Milestones
Continuing twin-stick action RPG development: - Additional enemy types and boss encounters - Loot and equipment system - Town hub and NPC interactions - Mobile touch controls refinement - Multiplayer co-op support
Roguelike
A browser-based 2.5D isometric roguelike with local co-op (1–4 players). Fast runs (3–10 min/map), persistent progression, drop-in/out multiplayer. 9 classes with 5 abilities each, 200+ milestones of content including Mythic items, endless dungeons, arena mode, crafting, mercenaries, and AI pixel art sprites.
Prompt History
A browser-based 2.5D isometric roguelike with local co-op (1–4 players). Fast runs (3–10 min/map), persistent progression, drop-in/out multiplayer. Vivid, playful medieval fantasy with multiple classes.
Changelog (234 milestones)
M2342026-04-13M234 — no summary recorded
M234 released 2026-04-13
M2332026-04-13M233 — no summary recorded
M233 released 2026-04-13
M2322026-04-13M232 — no summary recorded
M232 released 2026-04-13
M2312026-04-10M231 — no summary recorded
M231 released 2026-04-10
M2302026-04-08M230 — no summary recorded
M230 released 2026-04-08
M2292026-04-08M229 — no summary recorded
M229 released 2026-04-08
M2282026-04-08M228 — no summary recorded
M228 released 2026-04-08
M2272026-04-08M227 — no summary recorded
M227 released 2026-04-08
M2262026-04-08M226 — no summary recorded
M226 released 2026-04-08
M2252026-04-07M225 — no summary recorded
M225 released 2026-04-07
M2242026-04-07M224 — no summary recorded
M224 released 2026-04-07
M2232026-04-07M223 — no summary recorded
M223 released 2026-04-07
M2222026-04-07M222 — no summary recorded
M222 released 2026-04-07
M2212026-04-07M221 — no summary recorded
M221 released 2026-04-07
M2202026-04-07M220 — no summary recorded
M220 released 2026-04-07
M2192026-04-07M219 — no summary recorded
M219 released 2026-04-07
M2182026-04-07M218 — no summary recorded
M218 released 2026-04-07
M2172026-04-07M217 — no summary recorded
M217 released 2026-04-07
M2162026-04-07M216 — no summary recorded
M216 released 2026-04-07
M2152026-04-07M215 — no summary recorded
M215 released 2026-04-07
M2142026-04-07M214 — no summary recorded
M214 released 2026-04-07
M2132026-04-07M213 — no summary recorded
M213 released 2026-04-07
M2122026-04-07M212 — no summary recorded
M212 released 2026-04-07
M2112026-04-07M211 — no summary recorded
M211 released 2026-04-07
M2102026-04-07M210 — no summary recorded
M210 released 2026-04-07
M2092026-04-07M209 — no summary recorded
M209 released 2026-04-07
M2082026-04-07M208 — no summary recorded
M208 released 2026-04-07
M2072026-04-07M207 — no summary recorded
M207 released 2026-04-07
M2062026-04-07M206 — no summary recorded
M206 released 2026-04-07
M2052026-04-07M205 — no summary recorded
M205 released 2026-04-07
M2042026-04-07M204 — no summary recorded
M204 released 2026-04-07
M2032026-04-07M203 — no summary recorded
M203 released 2026-04-07
M2022026-04-07M202 — no summary recorded
M202 released 2026-04-07
M2012026-04-07M201 — no summary recorded
M201 released 2026-04-07
M2002026-04-07M200 — no summary recorded
M200 released 2026-04-07
M1992026-04-07M199 — no summary recorded
M199 released 2026-04-07
M1982026-04-07M198 — no summary recorded
M198 released 2026-04-07
M1972026-04-07M197 — no summary recorded
M197 released 2026-04-07
M1962026-04-07M196 — no summary recorded
M196 released 2026-04-07
M1952026-04-07M195 — no summary recorded
M195 released 2026-04-07
M1942026-04-07M194 — no summary recorded
M194 released 2026-04-07
M1932026-04-07M193 — no summary recorded
M193 released 2026-04-07
M1922026-04-07M192 — no summary recorded
M192 released 2026-04-07
M1912026-04-07M191 — no summary recorded
M191 released 2026-04-07
M1902026-04-07M190 — no summary recorded
M190 released 2026-04-07
M1892026-04-07M189 — no summary recorded
M189 released 2026-04-07
M1882026-04-07M188 — no summary recorded
M188 released 2026-04-07
M1872026-04-07M187 — no summary recorded
M187 released 2026-04-07
M1862026-04-07M186 — no summary recorded
M186 released 2026-04-07
M1852026-04-07M185 — no summary recorded
M185 released 2026-04-07
M1842026-04-07M184 — no summary recorded
M184 released 2026-04-07
M1832026-04-07M183 — no summary recorded
M183 released 2026-04-07
M1822026-04-07M182 — no summary recorded
M182 released 2026-04-07
M1812026-04-07M181 — no summary recorded
M181 released 2026-04-07
M1802026-04-06M180 — no summary recorded
M180 released 2026-04-06
M1792026-04-06M179 — no summary recorded
M179 released 2026-04-06
M1782026-04-06M178 — no summary recorded
M178 released 2026-04-06
M1772026-04-06M177 — no summary recorded
M177 released 2026-04-06
M1762026-04-06M176 — no summary recorded
M176 released 2026-04-06
M1752026-04-06M175 — no summary recorded
M175 released 2026-04-06
M1742026-04-06M174 — no summary recorded
M174 released 2026-04-06
M1732026-04-07M173 — no summary recorded
M173 released 2026-04-07
M1722026-04-07M172 — no summary recorded
M172 released 2026-04-07
M1712026-04-07M171 — no summary recorded
M171 released 2026-04-07
M1702026-04-07M170 — no summary recorded
M170 released 2026-04-07
M1692026-04-07M169 — no summary recorded
M169 released 2026-04-07
M1682026-04-07M168 — no summary recorded
M168 released 2026-04-07
M1672026-04-07M167 — no summary recorded
M167 released 2026-04-07
M1662026-04-07M166 — no summary recorded
M166 released 2026-04-07
M1652026-04-05M165 — no summary recorded
M165 released 2026-04-05
M1642026-04-05M164 — no summary recorded
M164 released 2026-04-05
M1632026-04-05M163 — no summary recorded
M163 released 2026-04-05
M1622026-04-05M162 — no summary recorded
M162 released 2026-04-05
M1612026-04-05M161 — no summary recorded
M161 released 2026-04-05
M1602026-04-05M160 — no summary recorded
M160 released 2026-04-05
M1592026-04-06M159 — no summary recorded
M159 released 2026-04-06
M1582026-04-06M158 — no summary recorded
M158 released 2026-04-06
M1572026-04-06M157 — no summary recorded
M157 released 2026-04-06
M1562026-04-06M156 — no summary recorded
M156 released 2026-04-06
M1552026-04-06M155 — no summary recorded
M155 released 2026-04-06
M1542026-04-06M154 — no summary recorded
M154 released 2026-04-06
M1532026-04-06M153 — no summary recorded
M153 released 2026-04-06
M1522026-04-06M152 — no summary recorded
M152 released 2026-04-06
M1512026-04-06M151 — no summary recorded
M151 released 2026-04-06
M1502026-04-06M150 — no summary recorded
M150 released 2026-04-06
M1492026-04-06M149 — no summary recorded
M149 released 2026-04-06
M1482026-04-06M148 — no summary recorded
M148 released 2026-04-06
M1472026-04-06M147 — no summary recorded
M147 released 2026-04-06
M1462026-04-06M146 — no summary recorded
M146 released 2026-04-06
M1452026-04-06M145 — no summary recorded
M145 released 2026-04-06
M1442026-04-06M144 — no summary recorded
M144 released 2026-04-06
M1432026-04-06M143 — no summary recorded
M143 released 2026-04-06
M1422026-04-06M142 — no summary recorded
M142 released 2026-04-06
M1412026-04-06M141 — no summary recorded
M141 released 2026-04-06
M1402026-04-06M140 — no summary recorded
M140 released 2026-04-06
M1392026-04-06M139 — no summary recorded
M139 released 2026-04-06
M1382026-04-06M138 — no summary recorded
M138 released 2026-04-06
M1372026-04-06M137 — no summary recorded
M137 released 2026-04-06
M1362026-04-06M136 — no summary recorded
M136 released 2026-04-06
M1352026-04-06M135 — no summary recorded
M135 released 2026-04-06
M1342026-04-06M134 — no summary recorded
M134 released 2026-04-06
M1332026-04-06M133 — no summary recorded
M133 released 2026-04-06
M1322026-04-06M132 — no summary recorded
M132 released 2026-04-06
M1312026-04-06M131 — no summary recorded
M131 released 2026-04-06
M1302026-04-06M130 — no summary recorded
M130 released 2026-04-06
M1292026-04-06M129 — no summary recorded
M129 released 2026-04-06
M1282026-04-05M128 — no summary recorded
M128 released 2026-04-05
M1272026-04-06M127 — no summary recorded
M127 released 2026-04-06
M1262026-04-06M126 — no summary recorded
M126 released 2026-04-06
M1252026-04-02M125 — no summary recorded
M125 released 2026-04-02
M1242026-04-02M124 — no summary recorded
M124 released 2026-04-02
M1232026-04-02M123 — no summary recorded
M123 released 2026-04-02
M1222026-04-02M122 — no summary recorded
M122 released 2026-04-02
M1212026-04-02M121 — no summary recorded
M121 released 2026-04-02
M1202026-04-02M120 — no summary recorded
M120 released 2026-04-02
M1192026-04-01M119 — no summary recorded
M119 released 2026-04-01
M1182026-03-31M118 — no summary recorded
M118 released 2026-03-31
M1172026-03-31M117 — no summary recorded
M117 released 2026-03-31
M1162026-03-31M116 — no summary recorded
M116 released 2026-03-31
M1152026-03-31M115 — no summary recorded
M115 released 2026-03-31
M1142026-03-31M114 — no summary recorded
M114 released 2026-03-31
M1132026-03-31M113 — no summary recorded
M113 released 2026-03-31
M1122026-03-30M112 — no summary recorded
M112 released 2026-03-30
M1112026-03-30M111 — no summary recorded
M111 released 2026-03-30
M1102026-03-30M110 — no summary recorded
M110 released 2026-03-30
M1092026-03-30M109 — no summary recorded
M109 released 2026-03-30
M1082026-03-30M108 — no summary recorded
M108 released 2026-03-30
M1072026-03-30M107 — no summary recorded
M107 released 2026-03-30
M1062026-03-30M106 — no summary recorded
M106 released 2026-03-30
M1052026-03-30M105 — no summary recorded
M105 released 2026-03-30
M1042026-03-30M104 — no summary recorded
M104 released 2026-03-30
M1032026-03-30M103 — no summary recorded
M103 released 2026-03-30
M1022026-03-30M102 — no summary recorded
M102 released 2026-03-30
M1012026-03-30M101 — no summary recorded
M101 released 2026-03-30
M1002026-03-30M100 — no summary recorded
M100 released 2026-03-30
M992026-03-30M99 — no summary recorded
M99 released 2026-03-30
M982026-03-30M98 — no summary recorded
M98 released 2026-03-30
M972026-03-30M97 — no summary recorded
M97 released 2026-03-30
M962026-03-30M96 — no summary recorded
M96 released 2026-03-30
M952026-03-30M95 — no summary recorded
M95 released 2026-03-30
M942026-03-30M94 — no summary recorded
M94 released 2026-03-30
M932026-03-30M93 — no summary recorded
M93 released 2026-03-30
M922026-03-30M92 — no summary recorded
M92 released 2026-03-30
M912026-03-30M91 — no summary recorded
M91 released 2026-03-30
M902026-03-30M90 — no summary recorded
M90 released 2026-03-30
M892026-03-30M89 — no summary recorded
M89 released 2026-03-30
M882026-03-30M88 — no summary recorded
M88 released 2026-03-30
M872026-03-30M87 — no summary recorded
M87 released 2026-03-30
M862026-03-30M86 — no summary recorded
M86 released 2026-03-30
M852026-03-30M85 — no summary recorded
M85 released 2026-03-30
M842026-03-30M84 — no summary recorded
M84 released 2026-03-30
M832026-03-30M83 — no summary recorded
M83 released 2026-03-30
M822026-03-30M82 — no summary recorded
M82 released 2026-03-30
M812026-03-30M81 — no summary recorded
M81 released 2026-03-30
M802026-03-30M80 — no summary recorded
M80 released 2026-03-30
M792026-03-30M79 — no summary recorded
M79 released 2026-03-30
M782026-03-30M78 — no summary recorded
M78 released 2026-03-30
M772026-03-30M77 — no summary recorded
M77 released 2026-03-30
M762026-03-30M76 — no summary recorded
M76 released 2026-03-30
M752026-03-30M75 — no summary recorded
M75 released 2026-03-30
M742026-03-30M74 — no summary recorded
M74 released 2026-03-30
M732026-03-30M73 — no summary recorded
M73 released 2026-03-30
M722026-03-30M72 — no summary recorded
M72 released 2026-03-30
M712026-03-30M71 — no summary recorded
M71 released 2026-03-30
M702026-03-30M70 — no summary recorded
M70 released 2026-03-30
M692026-03-30M69 — no summary recorded
M69 released 2026-03-30
M682026-03-30M68 — no summary recorded
M68 released 2026-03-30
M672026-03-30M67 — no summary recorded
M67 released 2026-03-30
M662026-03-30M66 — no summary recorded
M66 released 2026-03-30
M652026-03-30M65 — no summary recorded
M65 released 2026-03-30
M642026-03-30M64 — no summary recorded
M64 released 2026-03-30
M632026-03-30M63 — no summary recorded
M63 released 2026-03-30
M622026-03-30M62 — no summary recorded
M62 released 2026-03-30
M612026-03-30M61 — no summary recorded
M61 released 2026-03-30
M602026-03-30M60 — no summary recorded
M60 released 2026-03-30
M592026-03-30M59 — no summary recorded
M59 released 2026-03-30
M582026-03-30M58 — no summary recorded
M58 released 2026-03-30
M572026-03-30M57 — no summary recorded
M57 released 2026-03-30
M562026-03-30M56 — no summary recorded
M56 released 2026-03-30
M552026-03-30M55 — no summary recorded
M55 released 2026-03-30
M542026-03-30M54 — no summary recorded
M54 released 2026-03-30
M532026-03-30M53 — no summary recorded
M53 released 2026-03-30
M522026-03-30M52 — no summary recorded
M52 released 2026-03-30
M512026-03-30M51 — no summary recorded
M51 released 2026-03-30
M502026-03-30M50 — no summary recorded
M50 released 2026-03-30
M492026-03-30M49 — no summary recorded
M49 released 2026-03-30
M482026-03-30M48 — no summary recorded
M48 released 2026-03-30
M472026-03-30M47 — no summary recorded
M47 released 2026-03-30
M462026-03-30M46 — no summary recorded
M46 released 2026-03-30
M452026-03-30M45 — no summary recorded
M45 released 2026-03-30
M442026-03-30M44 — no summary recorded
M44 released 2026-03-30
M432026-03-30M43 — no summary recorded
M43 released 2026-03-30
M422026-03-30M42 — no summary recorded
M42 released 2026-03-30
M412026-03-30M41 — no summary recorded
M41 released 2026-03-30
M402026-03-30M40 — no summary recorded
M40 released 2026-03-30
M392026-03-30M39 — no summary recorded
M39 released 2026-03-30
M382026-03-30M38 — no summary recorded
M38 released 2026-03-30
M372026-03-30M37 — no summary recorded
M37 released 2026-03-30
M362026-03-30M36 — no summary recorded
M36 released 2026-03-30
M352026-03-30M35 — no summary recorded
M35 released 2026-03-30
M342026-03-30M34 — no summary recorded
M34 released 2026-03-30
M332026-03-30M33 — no summary recorded
M33 released 2026-03-30
M322026-03-30M32 — no summary recorded
M32 released 2026-03-30
M312026-03-30M31 — no summary recorded
M31 released 2026-03-30
M302026-03-30M30 — no summary recorded
M30 released 2026-03-30
M292026-03-30M29 — no summary recorded
M29 released 2026-03-30
M282026-03-30M28 — no summary recorded
M28 released 2026-03-30
M272026-03-30M27 — no summary recorded
M27 released 2026-03-30
M262026-03-30M26 — no summary recorded
M26 released 2026-03-30
M252026-03-30M25 — no summary recorded
M25 released 2026-03-30
M242026-03-30M24 — no summary recorded
M24 released 2026-03-30
M232026-03-30M23 — no summary recorded
M23 released 2026-03-30
M222026-03-30M22 — no summary recorded
M22 released 2026-03-30
M212026-03-30M21 — no summary recorded
M21 released 2026-03-30
M202026-04-01M20 — no summary recorded
M20 released 2026-04-01
M192026-03-30M19 — no summary recorded
M19 released 2026-03-30
M182026-03-30M18 — no summary recorded
M18 released 2026-03-30
M172026-03-30M17 — no summary recorded
M17 released 2026-03-30
M162026-03-30M16 — no summary recorded
M16 released 2026-03-30
M152026-03-30M15 — no summary recorded
M15 released 2026-03-30
M142026-03-30M14 — no summary recorded
M14 released 2026-03-30
M132026-03-30M13 — no summary recorded
M13 released 2026-03-30
M122026-03-30M12 — no summary recorded
M12 released 2026-03-30
M112026-03-30M11 — no summary recorded
M11 released 2026-03-30
M102026-03-30M10 — no summary recorded
M10 released 2026-03-30
M92026-03-29M9 — no summary recorded
M9 released 2026-03-29
M82026-03-29M8 — no summary recorded
M8 released 2026-03-29
M72026-03-29M7 — no summary recorded
M7 released 2026-03-29
M62026-03-29M6 — no summary recorded
M6 released 2026-03-29
M52026-03-29M5 — no summary recorded
M5 released 2026-03-29
M42026-03-29M4 — no summary recorded
M4 released 2026-03-29
M32026-03-29M3 — no summary recorded
M3 released 2026-03-29
M22026-03-29M2 — no summary recorded
M2 released 2026-03-29
M12026-04-15M1 — no summary recorded
M1 released 2026-04-15
Full changelog (legacy text)
Recent highlights: - M231: How to Play screen fixed — close button was buried behind the panel (depth bug); added X button in top-right corner for touch/iPhone; ESC and gamepad B button now close the overlay - M230: New enemy sprites — 6 previously blob-shaped enemies now have distinct procedural art: Arcane Specter (glowing purple ghost), Blood Drake (crimson dragon), Mushroom Spore (cap with white spots), Shadow Lurker (dark amorphous with red eyes), Spectral Knight (ghostly armored), Void Lurker (void tentacle entity); added 3 new enemies to spawn pool - M229: UI zoom compensation — scrolling in/out no longer stretches inventory, quest HUD, room progression, or fixed UI panels - M228: Minimap now uses isometric projection — floor area appears as a diamond matching the 2.5D perspective
Planned Milestones
Completed: M1-M231 (231 milestones) M231: How to Play close button depth fix; X corner button for touch; gamepad B closes overlay M230: New distinct enemy sprites for Arcane Specter, Blood Drake, Mushroom Spore, Shadow Lurker, Spectral Knight, Void Lurker M229: UI zoom compensation fix M228: Isometric minimap projection fix M227: Ranged mob VFX fix, effect helpful/harmful visual clarity M226: Bug fix sweep — skill crash, Death Coil aim, HOW TO PLAY ESC, screen close consistency M207-225: Comprehensive mobile UX overhaul Future wishlist: - Online co-op multiplayer - New biomes and tilesets - Seasonal events and challenges - Hardcore permadeath mode - Sound effects and music - Additional classes and abilities - Expanded endgame content