Randoloot/scripts/game/combat_rolls.gd
2026-10-10 21:21:58 +02:00

18 lines
959 B
GDScript

extends RefCounted
static func weapon_hit(base_damage: float, damage_multiplier: float, critical_chance: float, critical_multiplier: float, roll: float = -1.0) -> Dictionary:
var random_value := randf() if roll < 0.0 else roll
var chance := clampf(critical_chance, 0.0, 1.0)
var critical := base_damage > 0.0 and (chance >= 1.0 or random_value < chance)
var damage := maxf(0.0, base_damage) * maxf(0.0, damage_multiplier)
if critical:
damage *= maxf(1.0, critical_multiplier)
return {"damage": damage, "critical": critical}
static func incoming_hit(amount: float, evasion_chance: float, reduction: float, roll: float = -1.0) -> Dictionary:
var random_value := randf() if roll < 0.0 else roll
var chance := clampf(evasion_chance, 0.0, 1.0)
var evaded := amount > 0.0 and (chance >= 1.0 or random_value < chance)
var damage := 0.0 if evaded else maxf(0.0, amount) * (1.0 - clampf(reduction, 0.0, 1.0))
return {"damage": damage, "evaded": evaded}