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}