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

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))