export type CardAwakeningState = { owned?: boolean; awakening?: number; }; function normalizeAwakening(value: unknown): number { return Math.max(0, Math.min(5, Number.isFinite(value) ? Math.round(Number(value)) : 0)); } /** * 현재 보유 상태에서 목표 개화까지 필요한 횟수. * 미보유 카드를 처음 획득하는 과정은 1회의 개화로 계산한다. */ export function additionalAwakeningsRequired( state: CardAwakeningState | undefined, targetAwakening: number ): number { const target = normalizeAwakening(targetAwakening); if (state?.owned !== true) return target + 1; return Math.max(0, target - normalizeAwakening(state.awakening)); }