70 lines
2.6 KiB
GDScript
70 lines
2.6 KiB
GDScript
extends Node2D
|
|
const DURATION := 5.0
|
|
const RADIUS := 95.0
|
|
var damage_per_second := 0.0
|
|
var shield_piercing := 0.0
|
|
var remaining := DURATION
|
|
var _age := 0.0
|
|
var _tick_elapsed := 0.0
|
|
var _material: ShaderMaterial
|
|
var _phase := 0.0
|
|
|
|
func _ready() -> void:
|
|
add_to_group("burning_gas")
|
|
z_index = 8
|
|
_phase = fmod(float(get_instance_id()),137.0)*0.17
|
|
var cloud := ColorRect.new()
|
|
cloud.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
|
cloud.show_behind_parent = true
|
|
cloud.position = -Vector2.ONE*RADIUS*1.35
|
|
cloud.size = Vector2.ONE*RADIUS*2.7
|
|
_material = ShaderMaterial.new()
|
|
_material.shader = preload("res://scripts/game/burning_gas.gdshader")
|
|
_material.set_shader_parameter("phase",_phase)
|
|
_material.set_shader_parameter("strength",0.0)
|
|
cloud.material = _material
|
|
add_child(cloud)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
var step := minf(delta,remaining)
|
|
remaining = maxf(0.0,remaining-delta)
|
|
_tick_elapsed += step
|
|
if _tick_elapsed >= 0.25 or remaining <= 0.0:
|
|
_deal_damage(_tick_elapsed)
|
|
_tick_elapsed = 0.0
|
|
if remaining <= 0.0: queue_free()
|
|
|
|
func _deal_damage(step: float) -> void:
|
|
for target in get_tree().get_nodes_in_group("enemies"):
|
|
if target.is_queued_for_deletion() or float(target.get("hull")) <= 0 or bool(target.get("virus_controlled")): continue
|
|
if global_position.distance_to(target.global_position) > RADIUS: continue
|
|
var stronger := false
|
|
for cloud in get_tree().get_nodes_in_group("burning_gas"):
|
|
if cloud == self or cloud.is_queued_for_deletion(): continue
|
|
if cloud.damage_per_second < damage_per_second: continue
|
|
if cloud.damage_per_second == damage_per_second and cloud.get_instance_id() > get_instance_id(): continue
|
|
if cloud.global_position.distance_to(target.global_position) <= RADIUS:
|
|
stronger = true
|
|
break
|
|
if not stronger: target.take_research_dot(damage_per_second*step,DamageTypes.Type.KINETIC,shield_piercing)
|
|
|
|
func _process(delta: float) -> void:
|
|
_age += delta
|
|
if _material != null:
|
|
_material.set_shader_parameter("age",_age)
|
|
_material.set_shader_parameter("strength",minf(1.0,_age*7.0)*smoothstep(0.0,0.9,remaining))
|
|
queue_redraw()
|
|
|
|
func _draw() -> void:
|
|
var fade := minf(1.0,remaining)*minf(1.0,_age*7.0)
|
|
# Short-lived embers move outward through the rolling flame field.
|
|
for i in 28:
|
|
var life := fposmod(_age*(0.65+float(i%4)*0.11)+i*0.618,1.0)
|
|
var angle := i*2.39996+_phase+sin(_age*0.7+i)*0.15
|
|
var direction := Vector2.RIGHT.rotated(angle)
|
|
var tip := direction*(25.0+life*80.0)
|
|
tip += Vector2(sin(life*5+i)*7,-life*12)
|
|
var alpha := sin(life*PI)*fade
|
|
draw_line(tip-direction*(2+life*4),tip,Color(1,0.52,0.1,alpha),1.3,true)
|
|
draw_circle(tip,0.9,Color(1,0.9,0.5,alpha))
|