29 lines
913 B
TypeScript
29 lines
913 B
TypeScript
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,
|
|
});
|
|
}
|