44 lines
1.7 KiB
Markdown
44 lines
1.7 KiB
Markdown
# Data Model: 023-clear-encounter
|
|
|
|
## Entities
|
|
|
|
### Encounter (existing — no schema changes)
|
|
|
|
The `Encounter` type is unchanged. The clear operation produces an encounter with:
|
|
|
|
| Field | Cleared Value | Notes |
|
|
|---------------|---------------|--------------------------------|
|
|
| `combatants` | `[]` | Empty readonly array |
|
|
| `activeIndex` | `0` | Reset to initial |
|
|
| `roundNumber` | `1` | Reset to initial |
|
|
|
|
No new fields or types are added to the data model.
|
|
|
|
## Events
|
|
|
|
### EncounterCleared (new)
|
|
|
|
| Field | Type | Description |
|
|
|-------------------|----------|--------------------------------------------------|
|
|
| `type` | `string` | Discriminant: `"EncounterCleared"` |
|
|
| `combatantCount` | `number` | Number of combatants that were removed |
|
|
|
|
Minimal event shape — captures the count of cleared combatants for observability. No need to record the full pre-clear state (MVP baseline does not include undo).
|
|
|
|
## State Transitions
|
|
|
|
```
|
|
clearEncounter(encounter: Encounter) → ClearEncounterSuccess | DomainError
|
|
|
|
Input: Any Encounter with combatants.length > 0
|
|
Output: { encounter: { combatants: [], activeIndex: 0, roundNumber: 1 },
|
|
events: [EncounterCleared] }
|
|
|
|
Error: encounter.combatants.length === 0 → DomainError("encounter-already-empty")
|
|
```
|
|
|
|
## Persistence Impact
|
|
|
|
- `saveEncounter()`: No changes — already serializes any `Encounter` to JSON.
|
|
- `loadEncounter()`: Must handle `combatants: []` case by returning the empty encounter directly instead of routing through `createEncounter()` (which rejects empty combatant arrays).
|