60 lines
2.2 KiB
GDScript
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
|