Randoloot/scripts/game/radiation_status.gd
2026-10-25 22:38:13 +01:00

60 lines
2.2 KiB
GDScript

extends Node
const DURATION := 10.0
var remaining := 0.0
var tick_damage := 0.0
var credited_to_player := false
var shield_piercing := 0.0
var _tick_elapsed := 0.0
var _base_color := Color.WHITE
var _sprite: Sprite2D
var _aura: Node2D
var _visual_time := 0.0
static func apply(target: Node, damage_per_second: float, player_hit: bool, piercing: float = 0.0) -> 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 = DURATION
if damage_per_second >= status.tick_damage:
status.tick_damage = damage_per_second
status.shield_piercing = piercing
status.credited_to_player = player_hit
func _ready() -> void:
_aura = Node2D.new()
_aura.set_script(preload("res://scripts/game/radiation_aura.gd"))
_aura.status = self
get_parent().add_child.call_deferred(_aura)
_sprite = get_parent().get_node_or_null("Sprite2D")
if _sprite != null:
_base_color = _sprite.modulate
func _physics_process(delta: float) -> void:
_visual_time += delta
var step := minf(delta, remaining)
remaining = maxf(0.0, remaining - delta)
var target := get_parent()
if _sprite != null:
_sprite.modulate = _base_color.lerp(Color(0.65,1.0,0.55),0.22+0.12*sin(_visual_time*5)) 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_research_dot"):
target.take_research_dot(tick_damage*step,DamageTypes.Type.RADIATION,shield_piercing)
elif credited_to_player and target.has_method("take_piercing_weapon_hit"):
target.take_piercing_weapon_hit(tick_damage * step, false, DamageTypes.Type.RADIATION, shield_piercing)
elif 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