extends Node var remaining := 0.0 var tick_damage := 0.0 var credited_to_player := false var _tick_elapsed := 0.0 var _base_color := Color.WHITE var _sprite: Sprite2D static func apply(target: Node, damage_per_second: float, player_hit: bool) -> void: if not target.has_method("take_damage") or not target is CharacterBody2D: return var status := target.get_node_or_null("RadiationStatus") if status == null: status = Node.new() status.set_script(load("res://scripts/game/radiation_status.gd")) status.name = "RadiationStatus" target.add_child(status) status.remaining = 3.0 status.tick_damage = maxf(status.tick_damage, damage_per_second) status.credited_to_player = player_hit func _ready() -> void: _sprite = get_parent().get_node_or_null("Sprite2D") if _sprite != null: _base_color = _sprite.modulate func _physics_process(delta: float) -> void: var step := minf(delta, remaining) remaining = maxf(0.0, remaining - delta) var target := get_parent() if _sprite != null: _sprite.modulate = Color(0.3, 1.0, 0.35) if remaining > 0.0 else _base_color _tick_elapsed += step if _tick_elapsed >= 0.5 or (remaining <= 0.0 and _tick_elapsed > 0.0): step = _tick_elapsed _tick_elapsed = 0.0 if credited_to_player and target.has_method("take_weapon_hit"): target.take_weapon_hit(tick_damage * step, false, DamageTypes.Type.RADIATION) else: target.take_damage(tick_damage * step, false, DamageTypes.Type.RADIATION) if remaining <= 0.0: tick_damage = 0.0