Summary
Day 28 follow-up: Hero skills redesigned to be class-specific (each class gets unique skills at every tier) and active skills are now once-per-day rather than once-per-combat. 72 total skills (4 classes × 9 tiers × 2 options). Daily reset fires each in-game hour at day boundary. HeroPanel shows active skills with ⚡ready / ⏳used indicators. 983 tests passing.
Changes
HeroSkillSystem.js — full rewrite with 4 class-specific tables (WARRIOR_SKILLS, ROGUE_SKILLS, MAGE_SKILLS, PALADIN_SKILLS). Each class has 2 skills per tier 2–10. Skill IDs prefixed by class initial (w_, r_, m_, p_). Added skillPoolFor(heroClass, tier) export. checkSkillGrant now uses class table instead of generic pool.
Hero.js — Added dailySkillsUsed: Set, lastSkillDay: -1. New methods: canUseActiveSkill(id), markActiveSkillUsed(id), resetDailySkills(day), serializeDailySkills(), restoreDailySkills(saved, day).
CombatSystem.js — Full rewrite of active skill combat hooks. Per-combat state object cs initialized from hero.canUseActiveSkill(). Handles: mana shield (absorb), smoke bomb (block hit), backstab (3× dmg), spell echo (2× dmg), time warp (attack twice), blade storm/chain lightning (hit all), last stand (2× ATK), endure/unkillable/intervention (survive killing blow), second wind/holy light/lay on hands (heal on low HP), purify (cleanse + heal). Passive damage reduction from w_juggernaut (−20%), w_immortal (−30%), p_aura (−25%), r_phantom (−40%) via passiveDmgMod() helper.
SimEngine.js — Added hero.resetDailySkills(Math.floor(totalHours / 24)) on each hourly tick.
PersistenceManager.js — SAVE_VERSION 18 → 19. Saves/restores skills, dailySkillsUsed, lastSkillDay.
SimSnapshot.js — Added skills and dailySkillsUsed to hero snapshot.
HeroPanel.jsx — Active skills shown in blue, passive in gold. Ready skills show ⚡ready; used skills show ⏳used in grey.
Tests — HeroSkillSystem.test.js updated for class-specific API (skillPoolFor, class prefix assertions). 983 tests passing across 84 files.