Randoloot/scripts/game/radiation_status.gd

44 lines
1.5 KiB
GDScript

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