73 lines
2.3 KiB
GDScript
73 lines
2.3 KiB
GDScript
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()
|