export interface HealingResolution { readonly rawAmount: number; readonly effectiveAmount: number; readonly overheal: number; readonly critical: boolean; } export function resolveHealing( amount: number, currentHealth: number, maximumHealth: number, criticalChance = 0, roll = 1, criticalMultiplier = 1.5, ): HealingResolution { const critical = Number.isFinite(roll) && roll < Math.max(0, Math.min(1, criticalChance)); const rawAmount = Math.max(0, Math.round( (Number.isFinite(amount) ? amount : 0) * (critical ? Math.max(1, criticalMultiplier) : 1), )); const missing = Math.max(0, (Number.isFinite(maximumHealth) ? maximumHealth : 0) - (Number.isFinite(currentHealth) ? currentHealth : 0)); const effectiveAmount = Math.min(rawAmount, missing); return Object.freeze({ rawAmount, effectiveAmount, overheal: rawAmount - effectiveAmount, critical, }); }