import type { DomainEvent } from "./events.js"; import { type CombatantId, type DomainError, type Encounter, findCombatant, isDomainError, } from "./types.js"; export interface SetSideSuccess { readonly encounter: Encounter; readonly events: DomainEvent[]; } const VALID_SIDES = new Set(["party", "enemy"]); export function setSide( encounter: Encounter, combatantId: CombatantId, value: "party" | "enemy", ): SetSideSuccess | DomainError { const found = findCombatant(encounter, combatantId); if (isDomainError(found)) return found; if (!VALID_SIDES.has(value)) { return { kind: "domain-error", code: "invalid-side", message: `Side must be "party" or "enemy", got "${value}"`, }; } const previousSide = found.combatant.side; const updatedCombatants = encounter.combatants.map((c) => c.id === combatantId ? { ...c, side: value } : c, ); return { encounter: { combatants: updatedCombatants, activeIndex: encounter.activeIndex, roundNumber: encounter.roundNumber, }, events: [ { type: "SideSet", combatantId, previousSide, newSide: value, }, ], }; }