diff --git a/Docs/Vault/07_Sessions/2026/2026-07-21_AbilityBar_Recast_Diagnosis_I.md b/Docs/Vault/07_Sessions/2026/2026-07-21_AbilityBar_Recast_Diagnosis_I.md new file mode 100644 index 000000000..edc49ae60 --- /dev/null +++ b/Docs/Vault/07_Sessions/2026/2026-07-21_AbilityBar_Recast_Diagnosis_I.md @@ -0,0 +1,42 @@ +# 2026-07-21 (I) — auto-recast diagnosis + the ability/cooldown bar rework + +**Operator: "after casting an ability - it seems to auto recast - also I want to be able to see the cds of +socketed abilities + dash. do a rework of the ui."** + +## Auto-recast: diagnosed NOT a sim bug — a telegraph misread (fixed) + +- Static analysis: the gather is edge-clean (`Socket0 = default` + `.Set()` only on `wasPressedThisFrame`, + PlayerInputGatherSystem:180-186); the injection system self-expires. No sim path to a refire. +- **Live proof**: one injected socket-0 press → exactly ONE cooldown stamp (tick 1049 → 1469; Vortex cd = 420 t + = 7 s) and exactly ONE zone instantiate, then nothing over an 8 s guardian watch. The sim never recast. +- **Root cause**: the session-H zone telegraph re-GREW its fill from zero every 30-tick pulse — the exact visual + grammar of a fresh cast. **Fix (ZoneTelegraphSystem)**: the ARM phase (before the first pulse) still grows + 0→1 (fill reaches the rim = first damage); the PERSISTENT phase now **DRAINS 1→0** toward each pulse — a + metronome read, not a cast — and the direction split IS the G6/R6 one-shot-vs-persistent fill encoding, + done properly this time. + +## Ability bar (new `AbilityBarSystem`, Client/Presentation) + +- B5 sibling pattern: own `~HUDAbilityBar` UIDocument (MenuUi.LoadPanelSettings, sortingOrder 49), observe-only + `SystemBase` in PresentationSystemGroup, build-once, root pickingMode Ignore; HudUi/HudTheme-factored so it + auto-skins. +- Bottom-center, 5 slots — sockets 1-4 (socket 0 labeled `1·RMB`) + `SHIFT` Dash: Spark initials + full name + from the AbilityDatabase blob, archetype tint (zones teal · movement cool-blue · cone lamp-amber · skillshots + warm-white · dash cyan), a bottom-anchored dark overlay that DRAINS as the cooldown recovers, a seconds + countdown (tenths under ~10 s), and a ready-flash border on the ready edge. Loadout changes (class swap) + re-resolve labels automatically. Empty socket = dimmed "—". +- Cooldown math: sockets = `SocketCooldown.Get(i)` vs `EffectiveSocketStats[i].CooldownTicks`; dash = + `DashCooldown.NextTick` vs `TuningConfig.DashCooldownTicks` with the `Defaults()` fallback (the release rule + from review wf_98bf1268). Owner cooldowns ride the PREDICTED tick (local-player state — deliberately unlike + the zone telegraph's interpolated read). +- **HudSystem**: the old single-socket-0 blue charge strip REMOVED from the vitals block (was the only cooldown + readout; misleading — it tracked one socket and looked like a weapon gauge). + +## Validation + +L1 console clean (edits + full Play session) · L2 429/429 (presentation-only; no sim surface) · L3 screenshot: +bar live with Vortex mid-cooldown ("2.7" countdown + drain overlay, matching a 168-tick probe read), all names/ +tints correct, dash slot present; zone rim + draining fill reading as an ongoing effect. + +**Next:** operator eyes-on the bar layout/tints + the drain-inward pulse read (details in the session report's +gate blocks); the standing eyes-on queue (finisher reach ×1.39 · player hurt flinch · Cone-spark loadout fork).