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