extends Node2D const ELITE_DAMAGE_PCT := 0.75 const FLASH_FADE_DURATION := 0.6 var _build_up_sound = preload("res://assets/music&sfx/sfx/purge_build_up.wav") var _impact_boom_sound = preload("res://assets/music&sfx/sfx/purge_impact_boom.wav") var _sustained_boom_sound = preload("res://assets/music&sfx/sfx/purge_sustained_boom.wav") var _bass_sound = preload("res://assets/music&sfx/sfx/pruge_bass.wav") var _flash_sound = preload("res://assets/music&sfx/sfx/purge_sigil.wav") @onready var summon_circle: AnimatedSprite2D = $SummonCircle/AnimatedSprite2D @onready var camera = get_node("/root/Game/Camera2D") func _ready() -> void: summon_circle.sprite_frames = summon_circle.sprite_frames.duplicate() summon_circle.sprite_frames.set_animation_loop("default", false) summon_circle.animation_finished.connect(_unleash) summon_circle.frame_changed.connect(_on_summon_circle_frame_changed) summon_circle.play("default") camera.shake(2.0, 0.5) _play_sfx(_build_up_sound, "SFX") func _on_summon_circle_frame_changed() -> void: if summon_circle.frame == 77: _play_sfx(_flash_sound, "SFX", -10.0) func _play_sfx(stream: AudioStream, bus: String, volume_db: float = 0.0) -> void: var asp = AudioStreamPlayer.new() asp.stream = stream asp.bus = bus asp.volume_db = volume_db get_parent().add_child(asp) asp.play() asp.finished.connect(asp.queue_free) func _unleash() -> void: for enemy in get_tree().get_nodes_in_group("enemies"): if not is_instance_valid(enemy): continue if enemy.scale.x > 1.0: enemy.take_damage(int(enemy.max_hp * ELITE_DAMAGE_PCT)) else: enemy.take_damage(enemy.hp) _flash() func _flash() -> void: camera.shake(0.4, 8.0) _play_sfx(_impact_boom_sound, "SFX", 3.0) _play_sfx(_sustained_boom_sound, "PurgeReverb") _play_sfx(_bass_sound, "PurgeReverb") var circle_tween = create_tween() circle_tween.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS) circle_tween.tween_property(summon_circle, "modulate:a", 0.0, 0.6) var layer = CanvasLayer.new() layer.layer = 100 add_child(layer) var rect = ColorRect.new() rect.color = Color(1, 1, 1, 1) rect.set_anchors_preset(Control.PRESET_FULL_RECT) rect.mouse_filter = Control.MOUSE_FILTER_IGNORE layer.add_child(rect) var tween = create_tween() tween.set_pause_mode(Tween.TWEEN_PAUSE_PROCESS) tween.tween_property(rect, "color:a", 0.0, FLASH_FADE_DURATION) await tween.finished queue_free()