gae_wild_jam/scripts/purge.gd

56 lines
1.5 KiB
GDScript

extends Node2D
const ELITE_DAMAGE_PCT := 0.75
const FLASH_FADE_DURATION := 0.6
const SUMMON_SHAKE := 2.0
@onready var summon_circle: AnimatedSprite2D = $SummonCircle/AnimatedSprite2D
@onready var camera = get_node("/root/Game/Camera2D")
var is_summoning := true
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.play("default")
func _process(delta: float) -> void:
if is_summoning:
camera.offset = Vector2(
randf_range(-SUMMON_SHAKE, SUMMON_SHAKE),
randf_range(-SUMMON_SHAKE, SUMMON_SHAKE)
)
func _unleash() -> void:
is_summoning = false
set_process(false)
camera.offset = Vector2.ZERO
camera.shake(0.2, 6.0)
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:
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()