feat: implement Transference Channel system for Enchanter attunement
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m21s

- Add isChanneling, channelSpeedMultiplier, channelDrainRate to CombatState
- Add startChanneling/stopChanneling actions to combat store
- Add transference-channeling discipline with 3 perks (channel-efficiency, channel-power, channel-mastery)
- Add channelIntensity and channelEfficiency to KNOWN_BONUS_STATS
- Create combat-channel.ts with drain + speed multiplier computation
- Apply channel speed multiplier to equipment spells and melee attacks
- Add Channel Transference hold-button UI to SpireCombatPage
- Add compact channel status indicator to SpireCombatControls
- Channel state resets on spire exit, persists across room transitions
- All 1235 existing tests pass
This commit is contained in:
2026-06-14 21:56:20 +02:00
parent 505481cefc
commit 718aed38b1
16 changed files with 1286 additions and 9 deletions
@@ -0,0 +1,20 @@
// ─── Combat Channel Actions ────────────────────────────────────────────────────
// Extracted from combatStore.ts to keep the store under the 400-line limit.
// Provides startChanneling/stopChanneling action factory for the combat store.
import type { CombatStore, CombatState } from './combat-state.types';
type GetFn = () => CombatStore;
type SetFn = (state: Partial<CombatState>) => void;
export function createChannelActions(get: GetFn, set: SetFn) {
return {
startChanneling: () => {
set({ isChanneling: true });
},
stopChanneling: () => {
set({ isChanneling: false });
},
};
}