2.3 KiB
2.3 KiB
Quickstart: Combat Conditions
Prerequisites
pnpm install # install dependencies (no new packages needed)
pnpm --filter web dev # start dev server at localhost:5173
Implementation Order
-
Domain: Condition types & registry (
packages/domain/src/conditions.ts)- Define
ConditionIdunion type andConditionDefinitioninterface - Create
CONDITION_DEFINITIONSstatic array with all 15 entries - Export
VALID_CONDITION_IDSset for validation
- Define
-
Domain: Extend Combatant (
packages/domain/src/types.ts)- Add
readonly conditions?: readonly ConditionId[]toCombatant
- Add
-
Domain: Events (
packages/domain/src/events.ts)- Add
ConditionAddedandConditionRemovedevent types - Add to
DomainEventunion
- Add
-
Domain: Operations (
packages/domain/src/toggle-condition.ts)toggleCondition(encounter, combatantId, conditionId)— add if absent, remove if present- Maintains sorted order and emits
ConditionAddedorConditionRemovedevent
-
Domain: Tests (
packages/domain/src/__tests__/)- Test toggle on/off, ordering, duplicate prevention, unknown condition rejection, immutability
-
Application: Use case (
packages/application/src/)toggleConditionUseCasefollowingsetAcUseCasepattern
-
Web: Persistence (
apps/web/src/persistence/encounter-storage.ts)- Add conditions rehydration with validation against
VALID_CONDITION_IDS
- Add conditions rehydration with validation against
-
Web: Components (
apps/web/src/components/)condition-tags.tsx— renders icon tags + "+" buttoncondition-picker.tsx— popover with all 15 conditions for toggling- Update
combatant-row.tsxto include condition area below name
-
Web: Hook (
apps/web/src/hooks/use-encounter.ts)- Add
toggleConditioncallback
- Add
Verification
pnpm check # must pass: knip + format + lint + typecheck + test
Key Patterns to Follow
- Domain operations: See
packages/domain/src/set-ac.tsfor the exact pattern - Use cases: See
packages/application/src/set-ac-use-case.ts - UI components: See
combatant-row.tsxAcInput for inline editing pattern - Persistence: See
encounter-storage.tsAC validation for rehydration pattern - Hook integration: See
use-encounter.tssetAc callback for wiring pattern