import type { DomainEvent } from "./events.js"; import { type CombatantId, type DomainError, type Encounter, findCombatant, isDomainError, } from "./types.js"; export interface SetAcSuccess { readonly encounter: Encounter; readonly events: DomainEvent[]; } export function setAc( encounter: Encounter, combatantId: CombatantId, value: number | undefined, ): SetAcSuccess | DomainError { const found = findCombatant(encounter, combatantId); if (isDomainError(found)) return found; if (value !== undefined && (!Number.isInteger(value) || value < 0)) { return { kind: "domain-error", code: "invalid-ac", message: `AC must be a non-negative integer, got ${value}`, }; } const previousAc = found.combatant.ac; const updatedCombatants = encounter.combatants.map((c) => c.id === combatantId ? { ...c, ac: value } : c, ); return { encounter: { combatants: updatedCombatants, activeIndex: encounter.activeIndex, roundNumber: encounter.roundNumber, }, events: [ { type: "AcSet", combatantId, previousAc, newAc: value, }, ], }; }