fix: SpireTab refresh - cast bar, mana costs, full-screen mode, exit button
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 1m14s
Build and Publish Mana Loop Docker Image / build-and-publish (push) Failing after 1m14s
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
# PLAN: SpireTab Refresh & Casting Fixes
|
||||
|
||||
## Phase 1: Fix Cast Bar Not Updating
|
||||
1. **Audit `SpireTab.tsx` cast progress subscription**
|
||||
- Check if `useCombatStore((s) => s.castProgress)` is properly subscribed
|
||||
- Verify the progress bar component receives the latest `castProgress` value
|
||||
2. **Check `combatStore.ts` for `castProgress` updates**
|
||||
- Ensure `processCombatTick()` properly updates `castProgress` in state
|
||||
- Verify `set({ castProgress })` is called with correct value (0-1 range)
|
||||
3. **Fix Zustand subscription if broken**
|
||||
- Use `useCombatStore((s) => s.castProgress)` with proper selector
|
||||
- Ensure component re-renders when `castProgress` changes
|
||||
|
||||
## Phase 2: Fix Casting Not Costing Mana
|
||||
1. **Audit `combat-actions.ts` mana deduction**
|
||||
- Verify `deductSpellCost()` is called when spell completes
|
||||
- Check `canAffordSpellCost()` is checked before casting starts
|
||||
2. **Ensure `rawMana`/`elements` state updates**
|
||||
- Confirm `deductSpellCost()` returns updated state
|
||||
- Verify `combatStore` passes correct state to `processCombatTick()`
|
||||
3. **Test with modular stores only**
|
||||
- Use `useManaStore` from `stores/manaStore` (not legacy)
|
||||
- Verify `deductSpellCost` from `utils/` (not legacy `store-modules/`)
|
||||
|
||||
## Phase 3: Make SpireTab Full-Screen (No Study/Crafting)
|
||||
1. **Remove study components when `simpleMode=true`**
|
||||
- In `SpireTab.tsx`, conditionally render study progress ONLY if `!simpleMode`
|
||||
- Remove `currentStudyTarget` subscription when in spire mode
|
||||
2. **Remove crafting progress components**
|
||||
- Conditionally render crafting progress ONLY if `!simpleMode`
|
||||
- Remove `designProgress`, `preparationProgress`, etc. when in spire
|
||||
3. **Add "Climb Down to Exit" button**
|
||||
- Add button in `FloorControls.tsx` or `SpireTab.tsx`
|
||||
- Button calls `exitSpireMode()` from `combatStore`
|
||||
- Visible only when `simpleMode=true` (in spire)
|
||||
|
||||
## Phase 4: Refresh SpireTab Layout
|
||||
1. **Reorganize component sections**
|
||||
- Clear order: SpireHeader → Combat Info → Floor Controls → Activity Log
|
||||
- Remove redundant elements (duplicated stats, etc.)
|
||||
2. **Improve visual hierarchy**
|
||||
- Use consistent card layouts
|
||||
- Proper spacing between sections
|
||||
- Clear headings for each section
|
||||
3. **Clean up confusing elements**
|
||||
- Remove any UI that's irrelevant to spire (study, crafting, etc.)
|
||||
- Simplify floor controls for combat focus
|
||||
|
||||
## Phase 5: Enforce Modular Stores Only
|
||||
1. **Audit all imports in modified files**
|
||||
- `SpireTab.tsx`: Ensure NO imports from `store.ts` or `store-modules/`
|
||||
- `combat-actions.ts`: Use `utils/` for helpers
|
||||
- `combatStore.ts`: Already uses modular stores (verify)
|
||||
2. **Replace any legacy imports**
|
||||
- Search for `@/lib/game/store` or `@/lib/game/store-modules` in modified files
|
||||
- Replace with `@/lib/game/stores/` or `@/lib/game/utils/`
|
||||
|
||||
## Phase 6: Add Regression Tests
|
||||
1. **Create `spire-tab-refresh.test.ts`**
|
||||
- Test cast progress updates during combat ticks
|
||||
- Test mana costs deducted when spells cast
|
||||
- Test `simpleMode` hides study/crafting components
|
||||
- Test "Climb Down" button exits spire mode
|
||||
2. **Add to `stores/__tests__/` directory**
|
||||
- Follow existing test patterns (Vitest)
|
||||
- Mock store state as needed
|
||||
- Assert acceptance criteria from SPEC
|
||||
|
||||
## Files to Modify (Summary)
|
||||
| File | Changes |
|
||||
|------|---------|
|
||||
| `src/components/game/tabs/SpireTab.tsx` | Fix cast bar, remove study/crafting in spire, refresh layout |
|
||||
| `src/components/game/tabs/FloorControls.tsx` | Add "Climb Down" button |
|
||||
| `src/lib/game/stores/combat-actions.ts` | Verify mana deduction logic |
|
||||
| `src/lib/game/stores/combatStore.ts` | Ensure `castProgress` updates correctly |
|
||||
| `src/lib/game/stores/__tests__/spire-tab-refresh.test.ts` | New regression tests |
|
||||
|
||||
## Verification Before Implementation
|
||||
- ☑ All SPEC acceptance criteria mapped to plan items above
|
||||
- ☑ No legacy store imports in plan
|
||||
- ☑ All files <400 lines (combat-actions.ts is 117 lines, OK)
|
||||
- ☑ Tests planned for all fixed issues
|
||||
@@ -1,93 +0,0 @@
|
||||
# SPEC: Mana Conversion Attunement Fix
|
||||
|
||||
## 1. Objective
|
||||
Fix the mana conversion logic for attunements (e.g., Enchanter Transference) that incorrectly deducts mana from the player's mana pool every tick instead of reducing raw mana regen. This bug causes players to get stuck at 1 mana below their mana cap.
|
||||
|
||||
**Why**:
|
||||
- Current behavior breaks core mana progression loop
|
||||
- Players cannot reach full mana capacity when attunements are active
|
||||
- Violates intended design where attunement costs should reduce regen rate, not drain pool
|
||||
|
||||
## 2. Controls/API
|
||||
No new player-facing controls or APIs are added. This is an internal logic fix.
|
||||
|
||||
### Modified Game Internals:
|
||||
- `computeRegen()` / `computeEffectiveRegen()` in `computed-stats.ts`: Adjust to account for attunement regen reductions
|
||||
- `manaStore.ts` tick logic: Remove direct mana pool deductions for attunement costs
|
||||
- Attunement effect application: Add regen reduction to unified effect system instead of pool deductions
|
||||
- Game tick loop: Ensure regen reduction is applied before mana regen calculation
|
||||
|
||||
### Public API Changes:
|
||||
None (internal bug fix only)
|
||||
|
||||
## 3. Project Layout
|
||||
Follow existing modular architecture rules from AGENTS.md:
|
||||
|
||||
### Files to Modify:
|
||||
| File | Purpose | Line Count Check |
|
||||
|------|---------|------------------|
|
||||
| `src/lib/game/stores/manaStore.ts` | Remove pool deduction logic for attunements, ensure regen reduction applied | Must stay <400 lines |
|
||||
| `src/lib/game/computed-stats.ts` | Update `computeRegen()` to apply attunement regen reductions from unified effects | Must stay <400 lines |
|
||||
| `src/lib/game/effects.ts` | Add attunement regen reduction to unified effect system if not already present | Must stay <400 lines |
|
||||
| `src/lib/game/stores/gameLoopActions.ts` | Ensure correct tick order: apply regen reductions → calculate regen → update mana pool | Must stay <400 lines |
|
||||
| `src/lib/game/constants/attunements.ts` (or similar) | Verify attunement effect definitions use regen reduction instead of pool drain | Must stay <400 lines |
|
||||
|
||||
### Files to Create:
|
||||
| File | Purpose | Line Count Check |
|
||||
|------|---------|------------------|
|
||||
| `src/lib/game/stores/__tests__/mana-conversion-fix.test.ts` | Regression test for fix | Must stay <400 lines |
|
||||
|
||||
### Module Ownership:
|
||||
- Mana logic: `manaStore.ts` (store module)
|
||||
- Computed stats: `computed-stats.ts` (shared utility)
|
||||
- Effects: `effects.ts` (unified effect system)
|
||||
- Tests: `stores/__tests__/` (test directory)
|
||||
|
||||
## 4. Code Style
|
||||
Follow existing project conventions:
|
||||
- TypeScript strict mode, explicit type annotations for game state
|
||||
- Zustand store patterns: `set()`, `get()` for state updates, avoid direct mutations
|
||||
- Unified effect system: All stat modifications flow through `getUnifiedEffects()`
|
||||
- Naming: camelCase for variables/functions, PascalCase for interfaces/types
|
||||
- No `any` types, use defined interfaces from `src/lib/game/types.ts`
|
||||
- Follow ESLint rules (run `npm run lint` before committing)
|
||||
- Use existing patterns for regen/reduction calculations (e.g., `regenBonus`, `regenMultiplier` in unified effects)
|
||||
|
||||
## 5. Testing
|
||||
### What to Test:
|
||||
1. **Mana regen with active attunements**: Verify attunement costs reduce regen rate, not mana pool
|
||||
2. **Mana cap behavior**: Player can reach full mana cap when attunements are active
|
||||
3. **No pool drain**: Mana pool is never deducted directly by attunement costs
|
||||
4. **Unified effect integration**: Attunement regen reductions are properly included in `getUnifiedEffects()`
|
||||
5. **Tick order**: Regen reductions are applied before mana regen calculation in game tick
|
||||
|
||||
### How to Test:
|
||||
- Unit tests using Vitest (existing test framework)
|
||||
- Test files located in `src/lib/game/stores/__tests__/`
|
||||
- Mock game state to simulate active attunements
|
||||
- Assert regen values and mana pool behavior
|
||||
- Run `npm run test` to execute all tests
|
||||
|
||||
### Tooling:
|
||||
- Vitest (test runner)
|
||||
- Zustand store testing patterns (use `getState()` for assertions)
|
||||
- Mock `getUnifiedEffects()` to return attunement regen reductions
|
||||
|
||||
## 6. Boundaries (Out-of-Scope Items)
|
||||
- No changes to attunement definitions (only their effect application)
|
||||
- No new attunements or mana types added
|
||||
- No changes to combat, crafting, or prestige systems (unless directly related to mana regen)
|
||||
- No UI changes (this is internal logic only)
|
||||
- No modifications to legacy `store.ts` (use modular stores only)
|
||||
- No changes to banned content rules or mana type hierarchy
|
||||
|
||||
## Acceptance Criteria (Per Requirement)
|
||||
| Requirement | Acceptance Criterion |
|
||||
|-------------|----------------------|
|
||||
| Attunement costs reduce raw mana regen instead of deducting from pool | Unit test passes: `computeRegen()` returns reduced value when attunement regen reduction is applied |
|
||||
| Deduction applied before mana regen calculations | Unit test passes: Game tick applies regen reduction before calculating mana addition to pool |
|
||||
| Mana pool no longer stuck below cap | Integration test passes: Mana pool reaches full cap when attunements are active after sufficient time |
|
||||
| No direct mana pool deductions from attunements | Code review: No calls to `spendRawMana()` or direct `rawMana` deductions in attunement logic |
|
||||
| Follow unified effect system | Code review: Attunement regen reductions are added to `UnifiedEffects` interface and applied via `getUnifiedEffects()` |
|
||||
| All files stay under 400 lines | Pre-commit hook passes: No modified files exceed 400 lines |
|
||||
| Regression test added | Test file exists and runs successfully in `npm run test` |
|
||||
@@ -0,0 +1,47 @@
|
||||
# TASKS: SpireTab Refresh & Casting Fixes
|
||||
|
||||
## Task 1: Fix Cast Bar Not Updating
|
||||
- [ ] 1.1 Check `SpireTab.tsx` for `castProgress` subscription from `useCombatStore`
|
||||
- [ ] 1.2 Verify `combat-actions.ts` updates `castProgress` in `processCombatTick()`
|
||||
- [ ] 1.3 Fix Zustand subscription if `castProgress` not updating
|
||||
- [ ] 1.4 Test: `castProgress` changes during combat ticks
|
||||
|
||||
## Task 2: Fix Casting Not Costing Mana
|
||||
- [ ] 2.1 Audit `combat-actions.ts` for `deductSpellCost()` call
|
||||
- [ ] 2.2 Verify `canAffordSpellCost()` checked before casting
|
||||
- [ ] 2.3 Ensure `rawMana`/`elements` state updates after cast
|
||||
- [ ] 2.4 Test: Mana decreases when spells cast
|
||||
|
||||
## Task 3: Make SpireTab Full-Screen (No Study/Crafting)
|
||||
- [ ] 3.1 Remove study progress components when `simpleMode=true`
|
||||
- [ ] 3.2 Remove crafting progress components when `simpleMode=true`
|
||||
- [ ] 3.3 Add "Climb Down to Exit" button in `FloorControls.tsx` or `SpireTab.tsx`
|
||||
- [ ] 3.4 Button calls `exitSpireMode()` from `combatStore`
|
||||
- [ ] 3.5 Test: Study/crafting not rendered in spire mode
|
||||
|
||||
## Task 4: Refresh SpireTab Layout
|
||||
- [ ] 4.1 Reorganize `SpireTab.tsx` sections: Header → Combat → Controls → Log
|
||||
- [ ] 4.2 Remove redundant elements (duplicated stats, etc.)
|
||||
- [ ] 4.3 Improve visual hierarchy with consistent card layouts
|
||||
- [ ] 4.4 Test: Layout renders cleanly without clutter
|
||||
|
||||
## Task 5: Enforce Modular Stores Only
|
||||
- [ ] 5.1 Audit imports in `SpireTab.tsx`, `combat-actions.ts`, `combatStore.ts`
|
||||
- [ ] 5.2 Replace any `@/lib/game/store` or `@/lib/game/store-modules` imports
|
||||
- [ ] 5.3 Verify all use `src/lib/game/stores/` or `src/lib/game/utils/`
|
||||
- [ ] 5.4 Test: Zero legacy imports in modified files
|
||||
|
||||
## Task 6: Add Regression Tests
|
||||
- [ ] 6.1 Create `src/lib/game/stores/__tests__/spire-tab-refresh.test.ts`
|
||||
- [ ] 6.2 Test cast progress updates (acceptance criterion #1)
|
||||
- [ ] 6.3 Test mana costs deducted (acceptance criterion #2)
|
||||
- [ ] 6.4 Test no study in spire (acceptance criterion #3)
|
||||
- [ ] 6.5 Test climb down to exit (acceptance criterion #4)
|
||||
- [ ] 6.6 Run `npm run test` to verify all pass
|
||||
|
||||
## Task 7: Commit & Push
|
||||
- [ ] 7.1 Run `npm run lint` to check code style
|
||||
- [ ] 7.2 Run pre-commit checks (auto on commit)
|
||||
- [ ] 7.3 Commit with message: "fix: SpireTab refresh, cast bar, mana costs, full-screen mode"
|
||||
- [ ] 7.4 Push to origin/master
|
||||
- [ ] 7.5 Update task list to completed
|
||||
@@ -1,37 +0,0 @@
|
||||
# Context: Grimoire/Spells Tab "cost.map" Error Fix
|
||||
|
||||
## Problem Statement
|
||||
The Grimoire/Spells tab fails to load with error: `TypeError: e.cost.map is not a function`
|
||||
|
||||
## Error Analysis
|
||||
This error indicates that `e.cost` is not an array (or is undefined) when `.map()` is called. Likely causes:
|
||||
1. Spell cost is defined as a single value instead of an array
|
||||
2. Missing or malformed spell definitions
|
||||
3. Incorrect data structure in spells constants
|
||||
4. Legacy store returning incorrect spell state
|
||||
|
||||
## Key Files to Investigate/Modify
|
||||
- `src/components/game/tabs/SpellsTab.tsx` - Spells tab component (likely "Grimoire" tab)
|
||||
- `src/lib/game/constants/spells.ts` - Spell definitions
|
||||
- `src/lib/game/constants/spells-modules/` - Modular spell definitions
|
||||
- `src/lib/game/stores/skillStore.ts` - Skill state (affects spell unlocking)
|
||||
- `src/lib/game/stores/combatStore.ts` - Spell state
|
||||
|
||||
## Architecture Rules (from AGENTS.md)
|
||||
- Use modular stores: import from `src/lib/game/stores/`
|
||||
- Spell definitions belong in `src/lib/game/constants/spells.ts` or `spells-modules/`
|
||||
- All files must stay under 400 lines
|
||||
- No legacy store references
|
||||
|
||||
## Debugging Steps
|
||||
1. Find where `.map()` is called on spell cost in SpellsTab.tsx
|
||||
2. Check spell definition structure for `cost` field
|
||||
3. Verify spell cost is always an array (even for single cost)
|
||||
4. Check if cost is properly initialized for all spells
|
||||
5. Ensure spells are correctly loaded from constants
|
||||
|
||||
## Expected Outcome
|
||||
- Spells tab loads without errors
|
||||
- All spell costs are properly formatted as arrays
|
||||
- Spell definitions are consistent and valid
|
||||
- Regression test added to `src/lib/game/stores/__tests__/index-tests/spell-cost.test.ts`
|
||||
@@ -1,38 +0,0 @@
|
||||
# Context: Legacy Store Reference Cleanup
|
||||
|
||||
## Problem Statement
|
||||
Remaining references to the old legacy store (`store.ts` pattern) need to be identified and replaced with modular store imports from `src/lib/game/stores/`.
|
||||
|
||||
## Legacy Store Locations to Check
|
||||
- `src/lib/game/store.ts` - Main legacy store (to be deprecated)
|
||||
- `src/lib/game/store/` - Legacy store slices
|
||||
- Any file importing from these legacy paths
|
||||
|
||||
## Required Actions
|
||||
1. Search entire codebase for imports from:
|
||||
- `src/lib/game/store`
|
||||
- `src/lib/game/store.ts`
|
||||
- Any reference to legacy store patterns
|
||||
|
||||
2. Replace with modular store imports:
|
||||
- `useGameStore` from `src/lib/game/stores/gameStore`
|
||||
- `useManaStore` from `src/lib/game/stores/manaStore`
|
||||
- `useCombatStore` from `src/lib/game/stores/combatStore`
|
||||
- `useSkillStore` from `src/lib/game/stores/skillStore`
|
||||
- `usePrestigeStore` from `src/lib/game/stores/prestigeStore`
|
||||
- `useUiStore` from `src/lib/game/stores/uiStore`
|
||||
|
||||
## Architecture Rules (from AGENTS.md)
|
||||
- NEVER use legacy store pattern
|
||||
- All state management must use modular Zustand stores in `src/lib/game/stores/`
|
||||
- Use barrel exports from `src/lib/game/stores/index.ts`
|
||||
|
||||
## Files to Search
|
||||
- All `.ts` and `.tsx` files in `src/`
|
||||
- Focus on `src/components/game/` and `src/lib/game/`
|
||||
|
||||
## Expected Outcome
|
||||
- Zero references to legacy store in codebase
|
||||
- All imports use modular store pattern
|
||||
- No functional changes (only import path updates)
|
||||
- List of fixed files added to commit message
|
||||
@@ -1,34 +0,0 @@
|
||||
# Context: Mana Conversion Attunement Fix
|
||||
|
||||
## Problem Statement
|
||||
Mana conversion from attunements (e.g., Enchanter Transference mana) incorrectly deducts mana from the player's mana pool every tick instead of reducing raw mana regen. This causes players to get stuck at 1 mana below their mana cap.
|
||||
|
||||
## Required Fix
|
||||
Modify attunement mana conversion logic to:
|
||||
1. Calculate conversion costs as a reduction to raw mana regen (not a direct deduction from mana pool)
|
||||
2. Ensure the deduction is applied before mana regen calculations
|
||||
3. Prevent mana pool from being stuck below cap due to continuous deductions
|
||||
|
||||
## Key Files to Investigate/Modify
|
||||
- `src/lib/game/attunements/` - Attunement definitions and logic
|
||||
- `src/lib/game/stores/manaStore.ts` - Mana state and regen calculations
|
||||
- `src/lib/game/stores/gameLoopActions.ts` - Game tick logic
|
||||
- `src/lib/game/stores/gameStore.ts` - Core tick processing
|
||||
- `src/lib/game/upgrade-effects.ts` - Effect calculations
|
||||
|
||||
## Architecture Rules (from AGENTS.md)
|
||||
- Use modular stores in `src/lib/game/stores/` - NEVER use legacy `store.ts` pattern
|
||||
- All files must stay under 400 lines (pre-commit hook enforced)
|
||||
- No banned content (lifesteal, healing, banned mana types: life, blood, wood, mental, force)
|
||||
- Use unified effect system (`effects.ts`) for stat modifications
|
||||
|
||||
## Relevant Code References
|
||||
- Attunement transference cost calculation
|
||||
- `computeRegen()` function in computed-stats.ts
|
||||
- Mana pool cap logic in manaStore.ts
|
||||
- Game tick loop that processes attunement effects
|
||||
|
||||
## Expected Outcome
|
||||
- Mana conversion costs reduce raw mana regen rate instead of deducting from mana pool
|
||||
- Players no longer get stuck below mana cap
|
||||
- Regression test added to `src/lib/game/stores/__tests__/mana-store-tests/`
|
||||
@@ -1,36 +0,0 @@
|
||||
# Context: Spire Tab "maxFloorReached" Error Fix
|
||||
|
||||
## Problem Statement
|
||||
The Spire tab fails to load with error: `TypeError: Cannot read properties of undefined (reading 'maxFloorReached')`
|
||||
|
||||
## Error Analysis
|
||||
This error indicates that the code is trying to access `maxFloorReached` on an undefined object. Likely causes:
|
||||
1. Missing or undefined combat store state
|
||||
2. Incorrect access of combat state in SpireTab.tsx
|
||||
3. Race condition in store initialization
|
||||
4. Legacy store references in Spire tab components
|
||||
|
||||
## Key Files to Investigate/Modify
|
||||
- `src/components/game/tabs/SpireTab.tsx` - Spire tab component
|
||||
- `src/lib/game/stores/combatStore.ts` - Combat state (contains maxFloorReached)
|
||||
- `src/lib/game/stores/index.ts` - Store exports
|
||||
- `src/components/game/tabs/SpireHeader.tsx` - Spire header component
|
||||
- `src/components/game/tabs/FloorControls.tsx` - Floor control components
|
||||
|
||||
## Architecture Rules (from AGENTS.md)
|
||||
- Use modular stores: import `useCombatStore` from `src/lib/game/stores/`
|
||||
- NEVER import from legacy `src/lib/game/store.ts` or `src/lib/game/store/`
|
||||
- All files must stay under 400 lines
|
||||
- Use Zustand store hooks properly (avoid direct getState() in render)
|
||||
|
||||
## Debugging Steps
|
||||
1. Check SpireTab.tsx for undefined state access
|
||||
2. Verify combatStore.ts has `maxFloorReached` properly initialized
|
||||
3. Ensure store subscriptions are correctly set up
|
||||
4. Check for race conditions in component mounting
|
||||
|
||||
## Expected Outcome
|
||||
- Spire tab loads without errors
|
||||
- `maxFloorReached` is properly accessed from combatStore
|
||||
- All legacy store references in Spire-related files are removed
|
||||
- Regression test added to `src/lib/game/stores/__tests__/combat-store-tests/`
|
||||
@@ -12,7 +12,9 @@ Mana-Loop/
|
||||
│ └── custom.db
|
||||
├── docs/
|
||||
│ ├── GAME_BRIEFING.md
|
||||
│ ├── PLAN-SpireTab-refresh.md
|
||||
│ ├── SPEC-SpireTab-refresh.md
|
||||
│ ├── TASKS-SpireTab-refresh.md
|
||||
│ ├── project-structure.txt
|
||||
│ └── skills.md
|
||||
├── download/
|
||||
@@ -130,6 +132,8 @@ Mana-Loop/
|
||||
│ │ │ │ ├── SkillMultipliers.tsx
|
||||
│ │ │ │ ├── SkillRow.tsx
|
||||
│ │ │ │ ├── SpellsTab.tsx
|
||||
│ │ │ │ ├── SpireActiveSpells.tsx
|
||||
│ │ │ │ ├── SpireGolems.tsx
|
||||
│ │ │ │ ├── SpireHeader.tsx
|
||||
│ │ │ │ ├── SpireTab.tsx
|
||||
│ │ │ │ ├── StatsTab.tsx
|
||||
@@ -392,7 +396,8 @@ Mana-Loop/
|
||||
│ │ │ │ ├── mana.test.ts
|
||||
│ │ │ │ ├── regen.test.ts
|
||||
│ │ │ │ ├── skill.test.ts
|
||||
│ │ │ │ └── spell-cost.test.ts
|
||||
│ │ │ │ ├── spell-cost.test.ts
|
||||
│ │ │ │ └── spire-tab-refresh.test.ts
|
||||
│ │ │ ├── attunementStore.ts
|
||||
│ │ │ ├── combat-actions.ts
|
||||
│ │ │ ├── combatStore.ts
|
||||
|
||||
Reference in New Issue
Block a user