44 lines
1.5 KiB
GDScript
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
|