Files
initiative/packages/domain/src/events.ts
Lukas 91703ddebc
All checks were successful
CI / check (push) Successful in 45s
CI / build-image (push) Successful in 18s
Add player character management feature
Persistent player character templates (name, AC, HP, color, icon) with
full CRUD, bestiary-style search to add PCs to encounters with pre-filled
stats, and color/icon visual distinction in combatant rows. Also stops
the stat block panel from auto-opening when adding a creature.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 18:11:08 +01:00

146 lines
3.5 KiB
TypeScript

import type { ConditionId } from "./conditions.js";
import type { PlayerCharacterId } from "./player-character-types.js";
import type { CombatantId } from "./types.js";
export interface TurnAdvanced {
readonly type: "TurnAdvanced";
readonly previousCombatantId: CombatantId;
readonly newCombatantId: CombatantId;
readonly roundNumber: number;
}
export interface RoundAdvanced {
readonly type: "RoundAdvanced";
readonly newRoundNumber: number;
}
export interface CombatantAdded {
readonly type: "CombatantAdded";
readonly combatantId: CombatantId;
readonly name: string;
readonly position: number;
}
export interface CombatantRemoved {
readonly type: "CombatantRemoved";
readonly combatantId: CombatantId;
readonly name: string;
}
export interface CombatantUpdated {
readonly type: "CombatantUpdated";
readonly combatantId: CombatantId;
readonly oldName: string;
readonly newName: string;
}
export interface InitiativeSet {
readonly type: "InitiativeSet";
readonly combatantId: CombatantId;
readonly previousValue: number | undefined;
readonly newValue: number | undefined;
}
export interface MaxHpSet {
readonly type: "MaxHpSet";
readonly combatantId: CombatantId;
readonly previousMaxHp: number | undefined;
readonly newMaxHp: number | undefined;
readonly previousCurrentHp: number | undefined;
readonly newCurrentHp: number | undefined;
}
export interface CurrentHpAdjusted {
readonly type: "CurrentHpAdjusted";
readonly combatantId: CombatantId;
readonly previousHp: number;
readonly newHp: number;
readonly delta: number;
}
export interface TurnRetreated {
readonly type: "TurnRetreated";
readonly previousCombatantId: CombatantId;
readonly newCombatantId: CombatantId;
readonly roundNumber: number;
}
export interface RoundRetreated {
readonly type: "RoundRetreated";
readonly newRoundNumber: number;
}
export interface AcSet {
readonly type: "AcSet";
readonly combatantId: CombatantId;
readonly previousAc: number | undefined;
readonly newAc: number | undefined;
}
export interface ConditionAdded {
readonly type: "ConditionAdded";
readonly combatantId: CombatantId;
readonly condition: ConditionId;
}
export interface ConditionRemoved {
readonly type: "ConditionRemoved";
readonly combatantId: CombatantId;
readonly condition: ConditionId;
}
export interface ConcentrationStarted {
readonly type: "ConcentrationStarted";
readonly combatantId: CombatantId;
}
export interface ConcentrationEnded {
readonly type: "ConcentrationEnded";
readonly combatantId: CombatantId;
}
export interface EncounterCleared {
readonly type: "EncounterCleared";
readonly combatantCount: number;
}
export interface PlayerCharacterCreated {
readonly type: "PlayerCharacterCreated";
readonly playerCharacterId: PlayerCharacterId;
readonly name: string;
}
export interface PlayerCharacterUpdated {
readonly type: "PlayerCharacterUpdated";
readonly playerCharacterId: PlayerCharacterId;
readonly oldName: string;
readonly newName: string;
}
export interface PlayerCharacterDeleted {
readonly type: "PlayerCharacterDeleted";
readonly playerCharacterId: PlayerCharacterId;
readonly name: string;
}
export type DomainEvent =
| TurnAdvanced
| RoundAdvanced
| CombatantAdded
| CombatantRemoved
| CombatantUpdated
| InitiativeSet
| MaxHpSet
| CurrentHpAdjusted
| TurnRetreated
| RoundRetreated
| AcSet
| ConditionAdded
| ConditionRemoved
| ConcentrationStarted
| ConcentrationEnded
| EncounterCleared
| PlayerCharacterCreated
| PlayerCharacterUpdated
| PlayerCharacterDeleted;