diff --git a/scenes/purge.tscn b/scenes/purge.tscn new file mode 100644 index 0000000..ce259f8 --- /dev/null +++ b/scenes/purge.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3] + +[ext_resource type="PackedScene" path="res://scenes/summon_circle.tscn" id="1_summon"] +[ext_resource type="Script" path="res://scripts/purge.gd" id="2_script"] + +[node name="Purge" type="Node2D"] +script = ExtResource("2_script") + +[node name="SummonCircle" parent="." instance=ExtResource("1_summon")] +position = Vector2(0, 8) \ No newline at end of file diff --git a/scripts/purge.gd b/scripts/purge.gd new file mode 100644 index 0000000..db72763 --- /dev/null +++ b/scripts/purge.gd @@ -0,0 +1,42 @@ +extends Node2D + +const ELITE_DAMAGE_PCT := 0.75 +const FLASH_FADE_DURATION := 0.6 + +@onready var summon_circle: AnimatedSprite2D = $SummonCircle/AnimatedSprite2D + +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 _unleash() -> void: + var camera = get_node("/root/Game/Camera2D") + camera.shake(0.5, 1.5) + + 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.tween_property(rect, "color:a", 0.0, FLASH_FADE_DURATION) + await tween.finished + queue_free() \ No newline at end of file