From 604520cad52059599cc7578abc7b0c5b59581ba3 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 31 Aug 2025 02:08:35 +0200 Subject: [PATCH] Wave enemies (#9) * Add enemy wave management and path following components * cleanup --- objects/entities/flying_enemy.tscn | 8 +- scenes/level_village_4.tscn | 57 ++++-- scripts/components/ChaseLevelComponent.cs | 15 ++ scripts/components/EnemyWaveManager.cs | 86 +++++++++ scripts/components/EnemyWaveManager.cs.uid | 1 + .../components/EnemyWaveTriggerComponent.cs | 51 ------ .../EnemyWaveTriggerComponent.cs.uid | 1 - scripts/components/PathFollowerComponent.cs | 67 +++++++ .../components/PathFollowerComponent.cs.uid | 1 + .../components/PlatformMovementComponent.cs | 172 ------------------ .../PlatformMovementComponent.cs.uid | 1 - scripts/components/ShipMovementComponent.cs | 38 ---- .../components/ShipMovementComponent.cs.uid | 1 - scripts/components/WaveTriggerComponent.cs | 52 ++++++ .../components/WaveTriggerComponent.cs.uid | 1 + 15 files changed, 267 insertions(+), 285 deletions(-) create mode 100644 scripts/components/EnemyWaveManager.cs create mode 100644 scripts/components/EnemyWaveManager.cs.uid delete mode 100644 scripts/components/EnemyWaveTriggerComponent.cs delete mode 100644 scripts/components/EnemyWaveTriggerComponent.cs.uid create mode 100644 scripts/components/PathFollowerComponent.cs create mode 100644 scripts/components/PathFollowerComponent.cs.uid delete mode 100644 scripts/components/PlatformMovementComponent.cs delete mode 100644 scripts/components/PlatformMovementComponent.cs.uid delete mode 100644 scripts/components/ShipMovementComponent.cs delete mode 100644 scripts/components/ShipMovementComponent.cs.uid create mode 100644 scripts/components/WaveTriggerComponent.cs create mode 100644 scripts/components/WaveTriggerComponent.cs.uid diff --git a/objects/entities/flying_enemy.tscn b/objects/entities/flying_enemy.tscn index 773d1d8..2abed2f 100644 --- a/objects/entities/flying_enemy.tscn +++ b/objects/entities/flying_enemy.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=29 format=3 uid="uid://xp4njljog0x2"] +[gd_scene load_steps=30 format=3 uid="uid://xp4njljog0x2"] [ext_resource type="Texture2D" uid="uid://22k1u37j6k8y" path="res://sprites/flying_enemy.png" id="1_30hhw"] [ext_resource type="Shader" uid="uid://bs4xvm4qkurpr" path="res://shaders/hit_flash.tres" id="1_uyhuj"] @@ -17,6 +17,7 @@ [ext_resource type="PackedScene" uid="uid://dx80ivlvuuew4" path="res://objects/fxs/fire_fx.tscn" id="14_mrjm6"] [ext_resource type="Script" uid="uid://d1388lhp2gpgr" path="res://scripts/components/IceEffectComponent.cs" id="14_pkino"] [ext_resource type="PackedScene" uid="uid://ck6nml06tm6ue" path="res://objects/fxs/ice_fx.tscn" id="15_pkino"] +[ext_resource type="Script" uid="uid://b4hvq2i66fjhi" path="res://scripts/components/PathFollowerComponent.cs" id="18_q78ru"] [sub_resource type="CapsuleShape2D" id="CapsuleShape2D_hil2i"] radius = 6.0 @@ -190,3 +191,8 @@ collision_mask = 20 [node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"] position = Vector2(0, 2) shape = SubResource("RectangleShape2D_cmp1h") + +[node name="PathFollowerComponent" type="Node2D" parent="."] +script = ExtResource("18_q78ru") +ShouldRotate = false +metadata/_custom_type_script = "uid://b4hvq2i66fjhi" diff --git a/scenes/level_village_4.tscn b/scenes/level_village_4.tscn index fd714e4..13a9489 100644 --- a/scenes/level_village_4.tscn +++ b/scenes/level_village_4.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=34 format=4 uid="uid://bhad760x3vvco"] +[gd_scene load_steps=37 format=4 uid="uid://bhad760x3vvco"] [ext_resource type="PackedScene" uid="uid://bqi5s710xb1ju" path="res://objects/entities/brick_player.tscn" id="1_k3uyd"] [ext_resource type="PackedScene" uid="uid://bon6raeddf3tu" path="res://objects/entities/chaser.tscn" id="1_xraal"] @@ -16,6 +16,8 @@ [ext_resource type="PackedScene" uid="uid://lpovacvt3yyj" path="res://objects/entities/spaceship_enter.tscn" id="14_bajwe"] [ext_resource type="PackedScene" uid="uid://d0s2abysa86rq" path="res://objects/entities/child.tscn" id="15_3iocp"] [ext_resource type="PackedScene" uid="uid://xp4njljog0x2" path="res://objects/entities/flying_enemy.tscn" id="18_162yw"] +[ext_resource type="Script" uid="uid://dogp7ehihnw3s" path="res://scripts/components/EnemyWaveManager.cs" id="19_l8w2k"] +[ext_resource type="Script" uid="uid://ctg4awndvgfd8" path="res://scripts/components/WaveTriggerComponent.cs" id="20_e6jir"] [ext_resource type="PackedScene" uid="uid://to2xnqev0pu1" path="res://objects/entities/cage.tscn" id="20_l8w2k"] [ext_resource type="PackedScene" uid="uid://dkqa3q6j2gof4" path="res://objects/entities/spaceship_exit.tscn" id="21_e6jir"] @@ -101,6 +103,9 @@ _data = { } point_count = 7 +[sub_resource type="RectangleShape2D" id="RectangleShape2D_o1yb3"] +size = Vector2(413, 1110) + [node name="World" type="Node2D"] [node name="Camera Range" type="Sprite2D" parent="."] @@ -158,7 +163,7 @@ metadata/_custom_type_script = "uid://d23haq52m7ulv" [node name="Background Layer" type="TileMapLayer" parent="."] self_modulate = Color(0.877616, 0.877616, 0.877616, 1) -tile_map_data = PackedByteArray("AAB/AAEAAQACAAIAAAB/AAIAAQACAAIAAAB/AAMAAQADAAsAAAB/AAQAAQAAAAsAAAB/AAUAAQACAAIAAAB/AAYAAQAAAAsAAAB/AAcAAQACAAIAAAB/AAgAAQAAAAsAAAB/AAkAAQAAAAsAAAB/AAoAAQAAAAsAAACAAAEAAQAAAAsAAACAAAIAAQACAAsAAACAAAMAAQAAAAsAAACAAAQAAQACAAIAAACAAAUAAQACAAIAAACAAAYAAQACAAIAAACAAAcAAQACAAIAAACAAAgAAQACAAIAAACAAAkAAQACAAsAAACAAAoAAQACAAIAAACBAAEAAQACAAIAAACBAAIAAQACAAIAAACBAAMAAQAAAAsAAACBAAQAAQACAAIAAACBAAUAAQACAAIAAACBAAYAAQACAAIAAACBAAcAAQAAAAsAAACBAAgAAQACAAIAAACBAAkAAQAAAAsAAACBAAoAAQACAAIAAACCAAEAAQACAAsAAACCAAIAAQAAAAsAAACCAAMAAQACAAIAAACCAAQAAQACAAIAAACCAAUAAQACAAIAAACCAAYAAQACAAIAAACCAAcAAQACAAIAAACCAAgAAQACAAsAAACCAAkAAQACAAIAAACCAAoAAQAAAAsAAACDAAEAAQACAAIAAACDAAIAAQACAAsAAACDAAMAAQAAAAsAAACDAAQAAQAAAAsAAACDAAUAAQACAAIAAACDAAYAAQABAAsAAACDAAcAAQADAAsAAACDAAgAAQACAAIAAACDAAkAAQACAAIAAACDAAoAAQACAAIAAACEAAEAAQAAAAsAAACEAAIAAQAAAAsAAACEAAMAAQACAAsAAACEAAQAAQACAAIAAACEAAUAAQAAAAsAAACEAAYAAQACAAIAAACEAAcAAQACAAIAAACEAAgAAQAAAAsAAACEAAkAAQACAAIAAACEAAoAAQAAAAsAAACFAAEAAQACAAIAAACFAAIAAQACAAIAAACFAAMAAQACAAIAAACFAAQAAQACAAIAAACFAAUAAQAAAAsAAACFAAYAAQACAAIAAACFAAcAAQABAAsAAACFAAgAAQAAAAsAAACFAAkAAQADAAsAAACFAAoAAQACAAsAAACGAAEAAQACAAIAAACGAAIAAQACAAIAAACGAAMAAQACAAsAAACGAAQAAQAAAAsAAACGAAUAAQAAAAsAAACGAAYAAQADAAsAAACGAAcAAQAAAAsAAACGAAgAAQACAAIAAACGAAkAAQAAAAsAAACGAAoAAQACAAIAAACHAAEAAQACAAsAAACHAAIAAQACAAsAAACHAAMAAQACAAIAAACHAAQAAQACAAsAAACHAAUAAQACAAIAAACHAAYAAQACAAIAAACHAAcAAQADAAsAAACHAAgAAQAAAAsAAACHAAkAAQACAAIAAACHAAoAAQACAAsAAACIAAEAAQADAAsAAACIAAIAAQACAAIAAACIAAMAAQACAAIAAACIAAQAAQACAAsAAACIAAUAAQADAAsAAACIAAYAAQAAAAsAAACIAAcAAQAAAAsAAACIAAgAAQACAAIAAACIAAkAAQACAAIAAACIAAoAAQACAAIAAACJAAEAAQACAAIAAACJAAIAAQACAAIAAACJAAMAAQACAAIAAACJAAQAAQAAAAsAAACJAAUAAQACAAIAAACJAAYAAQACAAIAAACJAAcAAQACAAsAAACJAAgAAQACAAIAAACJAAkAAQAAAAsAAACJAAoAAQACAAsAAACKAAEAAQAAAAsAAACKAAIAAQAAAAsAAACKAAMAAQABAAsAAACKAAQAAQAAAAsAAACKAAUAAQACAAsAAACKAAYAAQACAAIAAACKAAcAAQACAAIAAACKAAgAAQACAAIAAACKAAkAAQAAAAsAAACKAAoAAQAAAAsAAACLAAEAAQACAAIAAACLAAIAAQAAAAsAAACLAAMAAQACAAIAAACLAAQAAQAAAAsAAACLAAUAAQACAAsAAACLAAYAAQACAAIAAACLAAcAAQACAAIAAACLAAgAAQAAAAsAAACLAAkAAQAAAAsAAACLAAoAAQACAAIAAACMAAEAAQACAAIAAACMAAIAAQAAAAsAAACMAAMAAQAAAAsAAACMAAQAAQAAAAsAAACMAAUAAQACAAIAAACMAAYAAQACAAsAAACMAAcAAQACAAIAAACMAAgAAQAAAAsAAACMAAkAAQADAAsAAACMAAoAAQACAAIAAACNAAEAAQADAAsAAACNAAIAAQACAAsAAACNAAMAAQAAAAsAAACNAAQAAQAAAAsAAACNAAUAAQABAAsAAACNAAYAAQAAAAsAAACNAAcAAQACAAIAAACNAAgAAQAAAAsAAACNAAkAAQAAAAsAAACNAAoAAQACAAIAAACOAAEAAQAAAAsAAACOAAIAAQACAAIAAACOAAMAAQACAAIAAACOAAQAAQAAAAsAAACOAAUAAQACAAIAAACOAAYAAQACAAIAAACOAAcAAQAAAAsAAACOAAgAAQAAAAsAAACOAAkAAQACAAsAAACOAAoAAQACAAIAAACPAAEAAQACAAIAAACPAAIAAQACAAIAAACPAAMAAQAAAAsAAACPAAQAAQACAAIAAACPAAUAAQACAAIAAACPAAYAAQAAAAsAAACPAAcAAQAAAAsAAACPAAgAAQAAAAsAAACPAAkAAQACAAsAAACPAAoAAQAAAAsAAACQAAEAAQACAAIAAACQAAIAAQACAAIAAACQAAMAAQACAAIAAACQAAQAAQAAAAsAAACQAAUAAQACAAIAAACQAAYAAQACAAIAAACQAAcAAQACAAIAAACQAAgAAQAAAAsAAACQAAkAAQACAAIAAACQAAoAAQAAAAsAAACRAAEAAQAAAAsAAACRAAIAAQACAAIAAACRAAMAAQACAAIAAACRAAQAAQACAAIAAACRAAUAAQACAAIAAACRAAYAAQACAAIAAACRAAcAAQACAAIAAACRAAgAAQACAAsAAACRAAkAAQACAAIAAACRAAoAAQABAAsAAACSAAEAAQACAAIAAACSAAIAAQACAAsAAACSAAMAAQACAAsAAACSAAQAAQACAAIAAACSAAUAAQACAAIAAACSAAYAAQADAAsAAACSAAcAAQAAAAsAAACSAAgAAQAAAAsAAACSAAkAAQACAAIAAACSAAoAAQAAAAsAAACTAAEAAQADAAsAAACTAAIAAQACAAsAAACTAAMAAQAAAAsAAACTAAQAAQAAAAsAAACTAAUAAQACAAIAAACTAAYAAQAAAAsAAACTAAcAAQAAAAsAAACTAAgAAQACAAIAAACTAAkAAQACAAIAAACTAAoAAQACAAIAAACUAAEAAQACAAIAAACUAAIAAQAAAAsAAACUAAMAAQACAAIAAACUAAQAAQACAAsAAACUAAUAAQACAAIAAACUAAYAAQACAAIAAACUAAcAAQAAAAsAAACUAAgAAQACAAIAAACUAAkAAQACAAIAAACUAAoAAQACAAIAAACVAAEAAQACAAsAAACVAAIAAQAAAAsAAACVAAMAAQAAAAsAAACVAAQAAQACAAIAAACVAAUAAQACAAIAAACVAAYAAQACAAIAAACVAAcAAQACAAIAAACVAAgAAQACAAIAAACVAAkAAQAAAAsAAACVAAoAAQACAAIAAACWAAEAAQACAAIAAACWAAIAAQACAAsAAACWAAMAAQACAAsAAACWAAQAAQACAAIAAACWAAUAAQACAAIAAACWAAYAAQADAAsAAACWAAcAAQACAAIAAACWAAgAAQACAAsAAACWAAkAAQACAAIAAACWAAoAAQAAAAsAAAB/APz/AQACAAIAAAB/AP3/AQAAAAsAAAB/AP7/AQACAAIAAAB/AP//AQACAAIAAAB/AAAAAQACAAIAAACAAPz/AQACAAsAAACAAP3/AQADAAsAAACAAP7/AQACAAIAAACAAP//AQACAAIAAACAAAAAAQACAAIAAACBAPz/AQACAAIAAACBAP3/AQACAAsAAACBAP7/AQACAAIAAACBAP//AQACAAIAAACBAAAAAQAAAAsAAACCAPz/AQACAAIAAACCAP3/AQACAAIAAACCAP7/AQACAAIAAACCAP//AQACAAsAAACCAAAAAQACAAsAAACDAPz/AQACAAIAAACDAP3/AQAAAAsAAACDAP7/AQACAAIAAACDAP//AQAAAAsAAACDAAAAAQABAAsAAACEAPz/AQACAAIAAACEAP3/AQAAAAsAAACEAP7/AQACAAIAAACEAP//AQACAAsAAACEAAAAAQAAAAsAAACFAPz/AQAAAAsAAACFAP3/AQACAAsAAACFAP7/AQACAAIAAACFAP//AQACAAIAAACFAAAAAQAAAAsAAACGAPz/AQAAAAsAAACGAP3/AQACAAIAAACGAP7/AQABAAsAAACGAP//AQAAAAsAAACGAAAAAQACAAIAAACHAPz/AQACAAsAAACHAP3/AQACAAIAAACHAP7/AQAAAAsAAACHAP//AQACAAsAAACHAAAAAQAAAAsAAACIAPz/AQACAAIAAACIAP3/AQAAAAsAAACIAP7/AQACAAIAAACIAP//AQACAAIAAACIAAAAAQAAAAsAAACJAPz/AQAAAAsAAACJAP3/AQAAAAsAAACJAP7/AQAAAAsAAACJAP//AQACAAsAAACJAAAAAQAAAAsAAACKAPz/AQACAAIAAACKAP3/AQACAAsAAACKAP7/AQACAAIAAACKAP//AQACAAIAAACKAAAAAQACAAsAAACLAPz/AQACAAIAAACLAP3/AQADAAsAAACLAP7/AQACAAIAAACLAP//AQAAAAsAAACLAAAAAQACAAIAAACMAPz/AQACAAIAAACMAP3/AQACAAIAAACMAP7/AQACAAIAAACMAP//AQAAAAsAAACMAAAAAQACAAIAAACNAPz/AQACAAIAAACNAP3/AQACAAsAAACNAP7/AQAAAAsAAACNAP//AQACAAIAAACNAAAAAQACAAIAAACOAPz/AQACAAIAAACOAP3/AQACAAIAAACOAP7/AQACAAIAAACOAP//AQAAAAsAAACOAAAAAQACAAsAAACPAPz/AQAAAAsAAACPAP3/AQAAAAsAAACPAP7/AQACAAsAAACPAP//AQAAAAsAAACPAAAAAQACAAIAAACQAPz/AQACAAIAAACQAP3/AQACAAIAAACQAP7/AQAAAAsAAACQAP//AQACAAIAAACQAAAAAQADAAsAAACRAPz/AQAAAAsAAACRAP3/AQACAAIAAACRAP7/AQACAAIAAACRAP//AQAAAAsAAACRAAAAAQACAAIAAACSAPz/AQACAAIAAACSAP3/AQACAAIAAACSAP7/AQACAAIAAACSAP//AQACAAIAAACSAAAAAQACAAsAAACTAPz/AQACAAIAAACTAP3/AQACAAIAAACTAP7/AQAAAAsAAACTAP//AQAAAAsAAACTAAAAAQAAAAsAAACUAPz/AQACAAsAAACUAP3/AQACAAIAAACUAP7/AQACAAsAAACUAP//AQACAAIAAACUAAAAAQACAAIAAACVAPz/AQACAAsAAACVAP3/AQAAAAsAAACVAP7/AQAAAAsAAACVAP//AQAAAAsAAACVAAAAAQACAAIAAACWAPz/AQAAAAsAAACWAP3/AQAAAAsAAACWAP7/AQACAAIAAACWAP//AQACAAIAAACWAAAAAQACAAIAAACXAPz/AQAAAAsAAACXAP3/AQAAAAsAAACXAP7/AQAAAAsAAACXAP//AQAAAAsAAACXAAAAAQACAAsAAACXAAEAAQACAAIAAACXAAIAAQADAAsAAACXAAMAAQAAAAsAAACXAAQAAQAAAAsAAACXAAUAAQACAAsAAACXAAYAAQACAAsAAACXAAcAAQACAAIAAACXAAgAAQACAAsAAACXAAkAAQAAAAsAAACXAAoAAQACAAIAAACYAPz/AQACAAIAAACYAP3/AQAAAAsAAACYAP7/AQAAAAsAAACYAP//AQAAAAsAAACYAAAAAQACAAIAAACYAAEAAQACAAIAAACYAAIAAQACAAIAAACYAAMAAQACAAIAAACYAAQAAQACAAIAAACYAAUAAQAAAAsAAACYAAYAAQACAAIAAACYAAcAAQAAAAsAAACYAAgAAQAAAAsAAACYAAkAAQACAAIAAACYAAoAAQACAAIAAACZAPz/AQAAAAsAAACZAP3/AQACAAIAAACZAP7/AQACAAIAAACZAP//AQACAAIAAACZAAAAAQAAAAsAAACZAAEAAQACAAIAAACZAAIAAQAAAAsAAACZAAMAAQACAAsAAACZAAQAAQAAAAsAAACZAAUAAQAAAAsAAACZAAYAAQACAAIAAACZAAcAAQACAAIAAACZAAgAAQACAAIAAACZAAkAAQAAAAsAAACZAAoAAQACAAIAAACaAPz/AQAAAAsAAACaAP3/AQACAAIAAACaAP7/AQAAAAsAAACaAP//AQAAAAsAAACaAAAAAQACAAIAAACaAAEAAQACAAsAAACaAAIAAQACAAIAAACaAAMAAQACAAIAAACaAAQAAQACAAIAAACaAAUAAQACAAsAAACaAAYAAQACAAsAAACaAAcAAQAAAAsAAACaAAgAAQACAAsAAACaAAkAAQACAAIAAACaAAoAAQACAAIAAACbAPz/AQACAAIAAACbAP3/AQACAAIAAACbAP7/AQACAAIAAACbAP//AQAAAAsAAACbAAAAAQAAAAsAAACbAAEAAQACAAsAAACbAAIAAQACAAIAAACbAAMAAQACAAsAAACbAAQAAQAAAAsAAACbAAUAAQAAAAsAAACbAAYAAQACAAIAAACbAAcAAQACAAsAAACbAAgAAQACAAIAAACbAAkAAQACAAsAAACbAAoAAQADAAsAAACcAPz/AQAAAAsAAACcAP3/AQAAAAsAAACcAP7/AQACAAIAAACcAP//AQACAAIAAACcAAAAAQAAAAsAAACcAAEAAQAAAAsAAACcAAIAAQACAAIAAACcAAMAAQACAAsAAACcAAQAAQACAAIAAACcAAUAAQAAAAsAAACcAAYAAQADAAsAAACcAAcAAQACAAIAAACcAAgAAQADAAsAAACcAAkAAQAAAAsAAACcAAoAAQACAAIAAACXAPn/AQACAAIAAACXAPr/AQACAAIAAACXAPv/AQAAAAsAAACYAPn/AQAAAAsAAACYAPr/AQAAAAsAAACYAPv/AQAAAAsAAACZAPn/AQACAAsAAACZAPr/AQABAAsAAACZAPv/AQACAAsAAACaAPn/AQACAAIAAACaAPr/AQAAAAsAAACaAPv/AQAAAAsAAACbAPn/AQAAAAsAAACbAPr/AQADAAsAAACbAPv/AQACAAIAAACcAPn/AQACAAIAAACcAPr/AQACAAIAAACcAPv/AQACAAIAAAB2AAMAAQAAAAsAAAB2AAQAAQAAAAsAAAB2AAUAAQACAAIAAAB3AAMAAQACAAsAAAB3AAQAAQACAAsAAAB3AAUAAQAAAAsAAAB4AAMAAQAAAAsAAAB4AAQAAQACAAIAAAB4AAUAAQACAAsAAAB5AAMAAQACAAIAAAB5AAQAAQACAAsAAAB5AAUAAQACAAsAAAB6AAMAAQACAAIAAAB6AAQAAQACAAIAAAB6AAUAAQACAAIAAAB7AAMAAQAAAAsAAAB7AAQAAQAAAAsAAAB7AAUAAQACAAIAAAB8AAMAAQACAAIAAAB8AAQAAQACAAIAAAB8AAUAAQACAAIAAAB9AAMAAQAAAAsAAAB9AAQAAQACAAIAAAB9AAUAAQAAAAsAAAB+AAMAAQACAAIAAAB+AAQAAQADAAsAAAB+AAUAAQACAAIAAAB2AAIAAQACAAIAAAB3AAIAAQACAAIAAAB4AAIAAQAAAAsAAAB5AAIAAQACAAIAAAB6AAIAAQACAAIAAAB7AAIAAQACAAIAAAB8AAIAAQAAAAsAAAB9AAIAAQAAAAsAAAB+AAIAAQACAAIAAAA=") +tile_map_data = PackedByteArray("AAB/AAEAAQACAAIAAAB/AAIAAQAAAAsAAAB/AAMAAQAAAAsAAAB/AAQAAQADAAsAAAB/AAUAAQACAAIAAAB/AAYAAQAAAAsAAAB/AAcAAQACAAIAAAB/AAgAAQACAAIAAAB/AAkAAQACAAIAAAB/AAoAAQAAAAsAAACAAAEAAQACAAIAAACAAAIAAQACAAsAAACAAAMAAQACAAIAAACAAAQAAQACAAIAAACAAAUAAQAAAAsAAACAAAYAAQACAAsAAACAAAcAAQACAAIAAACAAAgAAQACAAIAAACAAAkAAQACAAIAAACAAAoAAQAAAAsAAACBAAEAAQACAAIAAACBAAIAAQACAAIAAACBAAMAAQACAAIAAACBAAQAAQAAAAsAAACBAAUAAQACAAsAAACBAAYAAQACAAIAAACBAAcAAQAAAAsAAACBAAgAAQACAAIAAACBAAkAAQACAAsAAACBAAoAAQAAAAsAAACCAAEAAQACAAsAAACCAAIAAQADAAsAAACCAAMAAQACAAsAAACCAAQAAQACAAsAAACCAAUAAQACAAIAAACCAAYAAQACAAIAAACCAAcAAQAAAAsAAACCAAgAAQACAAIAAACCAAkAAQACAAIAAACCAAoAAQAAAAsAAACDAAEAAQACAAIAAACDAAIAAQACAAsAAACDAAMAAQACAAIAAACDAAQAAQADAAsAAACDAAUAAQACAAsAAACDAAYAAQACAAIAAACDAAcAAQACAAIAAACDAAgAAQADAAsAAACDAAkAAQADAAsAAACDAAoAAQAAAAsAAACEAAEAAQACAAsAAACEAAIAAQAAAAsAAACEAAMAAQACAAsAAACEAAQAAQAAAAsAAACEAAUAAQACAAIAAACEAAYAAQAAAAsAAACEAAcAAQACAAIAAACEAAgAAQACAAsAAACEAAkAAQACAAIAAACEAAoAAQAAAAsAAACFAAEAAQACAAIAAACFAAIAAQACAAIAAACFAAMAAQACAAsAAACFAAQAAQACAAIAAACFAAUAAQACAAsAAACFAAYAAQADAAsAAACFAAcAAQABAAsAAACFAAgAAQAAAAsAAACFAAkAAQADAAsAAACFAAoAAQACAAIAAACGAAEAAQAAAAsAAACGAAIAAQACAAIAAACGAAMAAQACAAIAAACGAAQAAQAAAAsAAACGAAUAAQADAAsAAACGAAYAAQAAAAsAAACGAAcAAQAAAAsAAACGAAgAAQACAAIAAACGAAkAAQAAAAsAAACGAAoAAQACAAIAAACHAAEAAQAAAAsAAACHAAIAAQAAAAsAAACHAAMAAQACAAIAAACHAAQAAQACAAIAAACHAAUAAQACAAIAAACHAAYAAQACAAIAAACHAAcAAQADAAsAAACHAAgAAQAAAAsAAACHAAkAAQACAAIAAACHAAoAAQAAAAsAAACIAAEAAQACAAIAAACIAAIAAQACAAsAAACIAAMAAQAAAAsAAACIAAQAAQACAAIAAACIAAUAAQACAAIAAACIAAYAAQACAAIAAACIAAcAAQAAAAsAAACIAAgAAQACAAIAAACIAAkAAQACAAIAAACIAAoAAQACAAIAAACJAAEAAQACAAsAAACJAAIAAQAAAAsAAACJAAMAAQACAAIAAACJAAQAAQACAAsAAACJAAUAAQACAAIAAACJAAYAAQAAAAsAAACJAAcAAQACAAsAAACJAAgAAQACAAIAAACJAAkAAQAAAAsAAACJAAoAAQAAAAsAAACKAAEAAQAAAAsAAACKAAIAAQAAAAsAAACKAAMAAQACAAIAAACKAAQAAQAAAAsAAACKAAUAAQACAAIAAACKAAYAAQACAAIAAACKAAcAAQACAAIAAACKAAgAAQACAAIAAACKAAkAAQAAAAsAAACKAAoAAQACAAIAAACLAAEAAQABAAsAAACLAAIAAQACAAIAAACLAAMAAQACAAsAAACLAAQAAQAAAAsAAACLAAUAAQACAAIAAACLAAYAAQAAAAsAAACLAAcAAQACAAIAAACLAAgAAQAAAAsAAACLAAkAAQAAAAsAAACLAAoAAQAAAAsAAACMAAEAAQACAAIAAACMAAIAAQACAAsAAACMAAMAAQAAAAsAAACMAAQAAQAAAAsAAACMAAUAAQACAAIAAACMAAYAAQACAAIAAACMAAcAAQACAAIAAACMAAgAAQAAAAsAAACMAAkAAQADAAsAAACMAAoAAQACAAIAAACNAAEAAQACAAsAAACNAAIAAQACAAIAAACNAAMAAQACAAIAAACNAAQAAQACAAIAAACNAAUAAQACAAsAAACNAAYAAQAAAAsAAACNAAcAAQACAAIAAACNAAgAAQAAAAsAAACNAAkAAQAAAAsAAACNAAoAAQAAAAsAAACOAAEAAQAAAAsAAACOAAIAAQACAAIAAACOAAMAAQAAAAsAAACOAAQAAQAAAAsAAACOAAUAAQACAAsAAACOAAYAAQAAAAsAAACOAAcAAQAAAAsAAACOAAgAAQAAAAsAAACOAAkAAQACAAsAAACOAAoAAQAAAAsAAACPAAEAAQADAAsAAACPAAIAAQACAAIAAACPAAMAAQAAAAsAAACPAAQAAQACAAIAAACPAAUAAQAAAAsAAACPAAYAAQACAAIAAACPAAcAAQAAAAsAAACPAAgAAQAAAAsAAACPAAkAAQACAAsAAACPAAoAAQACAAIAAACQAAEAAQAAAAsAAACQAAIAAQAAAAsAAACQAAMAAQACAAIAAACQAAQAAQAAAAsAAACQAAUAAQAAAAsAAACQAAYAAQACAAIAAACQAAcAAQACAAIAAACQAAgAAQAAAAsAAACQAAkAAQACAAIAAACQAAoAAQAAAAsAAACRAAEAAQACAAIAAACRAAIAAQACAAIAAACRAAMAAQACAAIAAACRAAQAAQACAAIAAACRAAUAAQACAAsAAACRAAYAAQAAAAsAAACRAAcAAQACAAIAAACRAAgAAQACAAsAAACRAAkAAQACAAIAAACRAAoAAQABAAsAAACSAAEAAQACAAIAAACSAAIAAQACAAIAAACSAAMAAQADAAsAAACSAAQAAQAAAAsAAACSAAUAAQACAAIAAACSAAYAAQACAAIAAACSAAcAAQAAAAsAAACSAAgAAQAAAAsAAACSAAkAAQACAAIAAACSAAoAAQAAAAsAAACTAAEAAQAAAAsAAACTAAIAAQACAAIAAACTAAMAAQAAAAsAAACTAAQAAQAAAAsAAACTAAUAAQACAAIAAACTAAYAAQACAAIAAACTAAcAAQAAAAsAAACTAAgAAQACAAIAAACTAAkAAQACAAIAAACTAAoAAQADAAsAAACUAAEAAQACAAsAAACUAAIAAQAAAAsAAACUAAMAAQAAAAsAAACUAAQAAQACAAIAAACUAAUAAQACAAIAAACUAAYAAQAAAAsAAACUAAcAAQAAAAsAAACUAAgAAQACAAIAAACUAAkAAQACAAIAAACUAAoAAQAAAAsAAACVAAEAAQAAAAsAAACVAAIAAQAAAAsAAACVAAMAAQACAAIAAACVAAQAAQACAAIAAACVAAUAAQAAAAsAAACVAAYAAQAAAAsAAACVAAcAAQACAAIAAACVAAgAAQACAAIAAACVAAkAAQAAAAsAAACVAAoAAQACAAsAAACWAAEAAQACAAIAAACWAAIAAQAAAAsAAACWAAMAAQAAAAsAAACWAAQAAQACAAsAAACWAAUAAQACAAsAAACWAAYAAQACAAsAAACWAAcAAQACAAIAAACWAAgAAQACAAsAAACWAAkAAQACAAIAAACWAAoAAQACAAIAAAB/APz/AQADAAsAAAB/AP3/AQACAAIAAAB/AP7/AQACAAIAAAB/AP//AQACAAIAAAB/AAAAAQAAAAsAAACAAPz/AQACAAIAAACAAP3/AQACAAIAAACAAP7/AQAAAAsAAACAAP//AQACAAIAAACAAAAAAQACAAsAAACBAPz/AQAAAAsAAACBAP3/AQADAAsAAACBAP7/AQACAAIAAACBAP//AQACAAsAAACBAAAAAQAAAAsAAACCAPz/AQADAAsAAACCAP3/AQACAAIAAACCAP7/AQACAAIAAACCAP//AQACAAIAAACCAAAAAQACAAIAAACDAPz/AQACAAIAAACDAP3/AQACAAIAAACDAP7/AQACAAsAAACDAP//AQACAAIAAACDAAAAAQACAAsAAACEAPz/AQACAAIAAACEAP3/AQADAAsAAACEAP7/AQACAAIAAACEAP//AQADAAsAAACEAAAAAQACAAIAAACFAPz/AQACAAIAAACFAP3/AQACAAIAAACFAP7/AQAAAAsAAACFAP//AQADAAsAAACFAAAAAQACAAIAAACGAPz/AQAAAAsAAACGAP3/AQACAAIAAACGAP7/AQAAAAsAAACGAP//AQAAAAsAAACGAAAAAQADAAsAAACHAPz/AQACAAsAAACHAP3/AQACAAIAAACHAP7/AQACAAIAAACHAP//AQAAAAsAAACHAAAAAQACAAIAAACIAPz/AQAAAAsAAACIAP3/AQACAAsAAACIAP7/AQABAAsAAACIAP//AQAAAAsAAACIAAAAAQACAAIAAACJAPz/AQACAAIAAACJAP3/AQACAAIAAACJAP7/AQACAAIAAACJAP//AQACAAsAAACJAAAAAQAAAAsAAACKAPz/AQACAAIAAACKAP3/AQACAAIAAACKAP7/AQACAAIAAACKAP//AQACAAIAAACKAAAAAQACAAsAAACLAPz/AQAAAAsAAACLAP3/AQACAAIAAACLAP7/AQACAAIAAACLAP//AQAAAAsAAACLAAAAAQACAAIAAACMAPz/AQACAAIAAACMAP3/AQACAAIAAACMAP7/AQACAAIAAACMAP//AQACAAIAAACMAAAAAQACAAIAAACNAPz/AQACAAIAAACNAP3/AQACAAIAAACNAP7/AQACAAIAAACNAP//AQACAAIAAACNAAAAAQAAAAsAAACOAPz/AQAAAAsAAACOAP3/AQACAAIAAACOAP7/AQACAAsAAACOAP//AQAAAAsAAACOAAAAAQACAAIAAACPAPz/AQACAAIAAACPAP3/AQACAAIAAACPAP7/AQAAAAsAAACPAP//AQAAAAsAAACPAAAAAQADAAsAAACQAPz/AQACAAIAAACQAP3/AQACAAIAAACQAP7/AQACAAIAAACQAP//AQACAAIAAACQAAAAAQAAAAsAAACRAPz/AQACAAIAAACRAP3/AQAAAAsAAACRAP7/AQACAAIAAACRAP//AQABAAsAAACRAAAAAQACAAsAAACSAPz/AQACAAsAAACSAP3/AQACAAIAAACSAP7/AQADAAsAAACSAP//AQAAAAsAAACSAAAAAQADAAsAAACTAPz/AQADAAsAAACTAP3/AQAAAAsAAACTAP7/AQACAAIAAACTAP//AQACAAIAAACTAAAAAQACAAIAAACUAPz/AQACAAsAAACUAP3/AQADAAsAAACUAP7/AQACAAIAAACUAP//AQAAAAsAAACUAAAAAQACAAIAAACVAPz/AQACAAIAAACVAP3/AQACAAIAAACVAP7/AQAAAAsAAACVAP//AQACAAsAAACVAAAAAQACAAsAAACWAPz/AQADAAsAAACWAP3/AQACAAIAAACWAP7/AQACAAsAAACWAP//AQACAAIAAACWAAAAAQAAAAsAAACXAPz/AQAAAAsAAACXAP3/AQAAAAsAAACXAP7/AQACAAIAAACXAP//AQAAAAsAAACXAAAAAQAAAAsAAACXAAEAAQAAAAsAAACXAAIAAQACAAsAAACXAAMAAQAAAAsAAACXAAQAAQACAAIAAACXAAUAAQACAAIAAACXAAYAAQAAAAsAAACXAAcAAQACAAIAAACXAAgAAQACAAsAAACXAAkAAQAAAAsAAACXAAoAAQACAAIAAACYAPz/AQACAAsAAACYAP3/AQAAAAsAAACYAP7/AQACAAIAAACYAP//AQADAAsAAACYAAAAAQACAAsAAACYAAEAAQAAAAsAAACYAAIAAQACAAIAAACYAAMAAQAAAAsAAACYAAQAAQACAAsAAACYAAUAAQADAAsAAACYAAYAAQACAAIAAACYAAcAAQAAAAsAAACYAAgAAQACAAIAAACYAAkAAQACAAIAAACYAAoAAQADAAsAAACZAPz/AQACAAIAAACZAP3/AQACAAIAAACZAP7/AQACAAIAAACZAP//AQACAAsAAACZAAAAAQACAAIAAACZAAEAAQACAAIAAACZAAIAAQACAAsAAACZAAMAAQACAAIAAACZAAQAAQACAAIAAACZAAUAAQAAAAsAAACZAAYAAQADAAsAAACZAAcAAQACAAIAAACZAAgAAQACAAsAAACZAAkAAQAAAAsAAACZAAoAAQAAAAsAAACaAPz/AQACAAsAAACaAP3/AQAAAAsAAACaAP7/AQAAAAsAAACaAP//AQAAAAsAAACaAAAAAQACAAIAAACaAAEAAQACAAsAAACaAAIAAQACAAIAAACaAAMAAQACAAIAAACaAAQAAQACAAIAAACaAAUAAQACAAsAAACaAAYAAQACAAIAAACaAAcAAQAAAAsAAACaAAgAAQAAAAsAAACaAAkAAQAAAAsAAACaAAoAAQACAAsAAACbAPz/AQACAAsAAACbAP3/AQAAAAsAAACbAP7/AQACAAIAAACbAP//AQADAAsAAACbAAAAAQACAAIAAACbAAEAAQACAAIAAACbAAIAAQAAAAsAAACbAAMAAQAAAAsAAACbAAQAAQACAAsAAACbAAUAAQACAAIAAACbAAYAAQAAAAsAAACbAAcAAQAAAAsAAACbAAgAAQADAAsAAACbAAkAAQACAAIAAACbAAoAAQACAAIAAACcAPz/AQACAAIAAACcAP3/AQACAAIAAACcAP7/AQACAAIAAACcAP//AQACAAIAAACcAAAAAQABAAsAAACcAAEAAQACAAIAAACcAAIAAQADAAsAAACcAAMAAQACAAIAAACcAAQAAQAAAAsAAACcAAUAAQACAAIAAACcAAYAAQADAAsAAACcAAcAAQACAAIAAACcAAgAAQAAAAsAAACcAAkAAQADAAsAAACcAAoAAQADAAsAAACXAPn/AQACAAsAAACXAPr/AQACAAIAAACXAPv/AQACAAIAAACYAPn/AQAAAAsAAACYAPr/AQABAAsAAACYAPv/AQACAAIAAACZAPn/AQACAAIAAACZAPr/AQAAAAsAAACZAPv/AQADAAsAAACaAPn/AQACAAIAAACaAPr/AQACAAIAAACaAPv/AQACAAsAAACbAPn/AQACAAIAAACbAPr/AQACAAIAAACbAPv/AQACAAIAAACcAPn/AQACAAIAAACcAPr/AQABAAsAAACcAPv/AQACAAIAAAB2AAMAAQACAAIAAAB2AAQAAQACAAIAAAB2AAUAAQADAAsAAAB3AAMAAQACAAIAAAB3AAQAAQACAAIAAAB3AAUAAQACAAIAAAB4AAMAAQACAAsAAAB4AAQAAQACAAIAAAB4AAUAAQADAAsAAAB5AAMAAQACAAIAAAB5AAQAAQACAAIAAAB5AAUAAQADAAsAAAB6AAMAAQACAAIAAAB6AAQAAQACAAIAAAB6AAUAAQACAAIAAAB7AAMAAQACAAsAAAB7AAQAAQAAAAsAAAB7AAUAAQACAAIAAAB8AAMAAQAAAAsAAAB8AAQAAQACAAIAAAB8AAUAAQAAAAsAAAB9AAMAAQAAAAsAAAB9AAQAAQAAAAsAAAB9AAUAAQACAAIAAAB+AAMAAQACAAIAAAB+AAQAAQAAAAsAAAB+AAUAAQACAAIAAAB2AAIAAQACAAIAAAB3AAIAAQACAAIAAAB4AAIAAQACAAIAAAB5AAIAAQAAAAsAAAB6AAIAAQACAAIAAAB7AAIAAQACAAIAAAB8AAIAAQACAAIAAAB9AAIAAQACAAIAAAB+AAIAAQACAAsAAACeAPf/AQACAAIAAACeAPj/AQAAAAsAAACeAPn/AQACAAsAAACeAPr/AQADAAsAAACeAPv/AQACAAsAAACeAPz/AQACAAsAAACeAP3/AQAAAAsAAACeAP7/AQACAAsAAACeAP//AQACAAIAAACeAAAAAQACAAIAAACeAAEAAQACAAIAAACeAAIAAQACAAsAAACeAAMAAQACAAIAAACeAAQAAQACAAIAAACeAAUAAQAAAAsAAACeAAYAAQACAAIAAACeAAcAAQACAAIAAACeAAgAAQAAAAsAAACeAAkAAQAAAAsAAACfAPf/AQAAAAsAAACfAPj/AQACAAIAAACfAPn/AQAAAAsAAACfAPr/AQACAAIAAACfAPv/AQACAAsAAACfAPz/AQACAAIAAACfAP3/AQACAAIAAACfAP7/AQAAAAsAAACfAP//AQAAAAsAAACfAAAAAQACAAIAAACfAAEAAQAAAAsAAACfAAIAAQACAAsAAACfAAMAAQADAAsAAACfAAQAAQAAAAsAAACfAAUAAQAAAAsAAACfAAYAAQACAAIAAACfAAcAAQAAAAsAAACfAAgAAQAAAAsAAACfAAkAAQAAAAsAAACgAPf/AQAAAAsAAACgAPj/AQACAAIAAACgAPn/AQACAAsAAACgAPr/AQACAAIAAACgAPv/AQACAAIAAACgAPz/AQAAAAsAAACgAP3/AQACAAIAAACgAP7/AQACAAsAAACgAP//AQAAAAsAAACgAAAAAQACAAIAAACgAAEAAQADAAsAAACgAAIAAQAAAAsAAACgAAMAAQACAAsAAACgAAQAAQACAAIAAACgAAUAAQAAAAsAAACgAAYAAQACAAIAAACgAAcAAQACAAIAAACgAAgAAQACAAIAAACgAAkAAQAAAAsAAAChAPf/AQAAAAsAAAChAPj/AQAAAAsAAAChAPn/AQADAAsAAAChAPr/AQAAAAsAAAChAPv/AQACAAIAAAChAPz/AQACAAIAAAChAP3/AQACAAsAAAChAP7/AQAAAAsAAAChAP//AQACAAsAAAChAAAAAQACAAIAAAChAAEAAQACAAIAAAChAAIAAQADAAsAAAChAAMAAQACAAIAAAChAAQAAQADAAsAAAChAAUAAQACAAIAAAChAAYAAQACAAsAAAChAAcAAQADAAsAAAChAAgAAQACAAIAAAChAAkAAQACAAIAAACiAPf/AQADAAsAAACiAPj/AQADAAsAAACiAPn/AQACAAIAAACiAPr/AQACAAIAAACiAPv/AQACAAIAAACiAPz/AQAAAAsAAACiAP3/AQACAAIAAACiAP7/AQAAAAsAAACiAP//AQAAAAsAAACiAAAAAQACAAIAAACiAAEAAQAAAAsAAACiAAIAAQACAAIAAACiAAMAAQACAAIAAACiAAQAAQACAAIAAACiAAUAAQACAAIAAACiAAYAAQACAAIAAACiAAcAAQACAAsAAACiAAgAAQACAAIAAACiAAkAAQAAAAsAAACjAPf/AQACAAIAAACjAPj/AQACAAsAAACjAPn/AQACAAIAAACjAPr/AQADAAsAAACjAPv/AQACAAIAAACjAPz/AQACAAIAAACjAP3/AQACAAsAAACjAP7/AQAAAAsAAACjAP//AQAAAAsAAACjAAAAAQACAAsAAACjAAEAAQACAAsAAACjAAIAAQACAAsAAACjAAMAAQACAAIAAACjAAQAAQACAAIAAACjAAUAAQACAAIAAACjAAYAAQAAAAsAAACjAAcAAQACAAsAAACjAAgAAQACAAIAAACjAAkAAQACAAsAAACkAPf/AQAAAAsAAACkAPj/AQACAAIAAACkAPn/AQACAAIAAACkAPr/AQAAAAsAAACkAPv/AQAAAAsAAACkAPz/AQACAAIAAACkAP3/AQACAAIAAACkAP7/AQAAAAsAAACkAP//AQACAAIAAACkAAAAAQACAAIAAACkAAEAAQACAAIAAACkAAIAAQACAAsAAACkAAMAAQAAAAsAAACkAAQAAQACAAIAAACkAAUAAQACAAIAAACkAAYAAQAAAAsAAACkAAcAAQACAAIAAACkAAgAAQACAAIAAACkAAkAAQACAAIAAAClAPf/AQAAAAsAAAClAPj/AQAAAAsAAAClAPn/AQACAAsAAAClAPr/AQACAAsAAAClAPv/AQACAAIAAAClAPz/AQAAAAsAAAClAP3/AQACAAIAAAClAP7/AQACAAIAAAClAP//AQABAAsAAAClAAAAAQAAAAsAAAClAAEAAQACAAIAAAClAAIAAQAAAAsAAAClAAMAAQACAAIAAAClAAQAAQACAAIAAAClAAUAAQAAAAsAAAClAAYAAQACAAIAAAClAAcAAQACAAIAAAClAAgAAQAAAAsAAAClAAkAAQACAAIAAACmAPf/AQAAAAsAAACmAPj/AQACAAIAAACmAPn/AQAAAAsAAACmAPr/AQAAAAsAAACmAPv/AQACAAIAAACmAPz/AQACAAIAAACmAP3/AQAAAAsAAACmAP7/AQACAAIAAACmAP//AQAAAAsAAACmAAAAAQACAAsAAACmAAEAAQAAAAsAAACmAAIAAQAAAAsAAACmAAMAAQAAAAsAAACmAAQAAQAAAAsAAACmAAUAAQACAAIAAACmAAYAAQAAAAsAAACmAAcAAQACAAIAAACmAAgAAQACAAIAAACmAAkAAQACAAIAAACnAPf/AQACAAIAAACnAPj/AQAAAAsAAACnAPn/AQACAAIAAACnAPr/AQACAAsAAACnAPv/AQACAAIAAACnAPz/AQACAAsAAACnAP3/AQACAAIAAACnAP7/AQAAAAsAAACnAP//AQACAAsAAACnAAAAAQACAAIAAACnAAEAAQAAAAsAAACnAAIAAQAAAAsAAACnAAMAAQACAAIAAACnAAQAAQACAAIAAACnAAUAAQADAAsAAACnAAYAAQACAAIAAACnAAcAAQACAAsAAACnAAgAAQACAAIAAACnAAkAAQACAAIAAACcAPX/AQACAAIAAACcAPb/AQAAAAsAAACcAPf/AQAAAAsAAACcAPj/AQACAAIAAACcAAsAAQACAAsAAACdAPX/AQAAAAsAAACdAPb/AQACAAsAAACdAPf/AQAAAAsAAACdAPj/AQAAAAsAAACdAPn/AQAAAAsAAACdAPr/AQAAAAsAAACdAPv/AQAAAAsAAACdAPz/AQACAAIAAACdAP3/AQACAAsAAACdAP7/AQACAAIAAACdAP//AQADAAsAAACdAAAAAQACAAIAAACdAAEAAQAAAAsAAACdAAIAAQADAAsAAACdAAMAAQACAAsAAACdAAQAAQACAAIAAACdAAUAAQACAAIAAACdAAYAAQACAAIAAACdAAcAAQACAAIAAACdAAgAAQACAAIAAACdAAkAAQACAAIAAACdAAoAAQACAAIAAACdAAsAAQAAAAsAAACeAPX/AQACAAIAAACeAPb/AQACAAIAAACeAAoAAQAAAAsAAACeAAsAAQACAAsAAACfAPX/AQAAAAsAAACfAPb/AQACAAIAAACfAAoAAQAAAAsAAACfAAsAAQADAAsAAACgAPX/AQACAAIAAACgAPb/AQACAAIAAACgAAoAAQACAAIAAACgAAsAAQAAAAsAAAChAPX/AQACAAIAAAChAPb/AQAAAAsAAAChAAoAAQAAAAsAAAChAAsAAQACAAIAAACiAPX/AQACAAsAAACiAPb/AQACAAIAAACiAAoAAQACAAIAAACiAAsAAQACAAIAAACjAPX/AQACAAIAAACjAPb/AQACAAIAAACjAAoAAQAAAAsAAACjAAsAAQAAAAsAAACkAPX/AQACAAIAAACkAPb/AQACAAIAAACkAAoAAQACAAIAAACkAAsAAQAAAAsAAAClAPX/AQABAAsAAAClAPb/AQACAAsAAAClAAoAAQACAAIAAAClAAsAAQACAAsAAACmAPX/AQACAAsAAACmAPb/AQACAAIAAACmAAoAAQAAAAsAAACmAAsAAQAAAAsAAACnAPX/AQADAAsAAACnAPb/AQAAAAsAAACnAAoAAQACAAIAAACnAAsAAQAAAAsAAACYAO//AQADAAsAAACYAPD/AQACAAIAAACYAPH/AQAAAAsAAACYAPP/AQACAAsAAACYAPT/AQAAAAsAAACYAPX/AQACAAIAAACYAPb/AQACAAIAAACYAPf/AQACAAsAAACYAPj/AQACAAIAAACYAAsAAQACAAIAAACYAAwAAQAAAAsAAACYAA0AAQADAAsAAACYAA4AAQACAAIAAACYAA8AAQAAAAsAAACYABAAAQACAAsAAACZAO//AQACAAIAAACZAPD/AQAAAAsAAACZAPH/AQACAAsAAACZAPL/AQACAAIAAACZAPP/AQACAAIAAACZAPT/AQACAAIAAACZAPX/AQACAAIAAACZAPb/AQAAAAsAAACZAPf/AQACAAsAAACZAPj/AQACAAIAAACZAAsAAQAAAAsAAACZAAwAAQACAAIAAACZAA0AAQACAAIAAACZAA4AAQAAAAsAAACZAA8AAQAAAAsAAACZABAAAQACAAIAAACaAO//AQACAAIAAACaAPD/AQACAAsAAACaAPH/AQACAAIAAACaAPL/AQACAAIAAACaAPP/AQAAAAsAAACaAPT/AQACAAIAAACaAPX/AQAAAAsAAACaAPb/AQAAAAsAAACaAPf/AQAAAAsAAACaAPj/AQADAAsAAACaAAsAAQAAAAsAAACaAAwAAQACAAIAAACaAA0AAQACAAIAAACaAA4AAQACAAIAAACaAA8AAQAAAAsAAACaABAAAQACAAsAAACbAO//AQAAAAsAAACbAPD/AQACAAIAAACbAPH/AQACAAIAAACbAPL/AQAAAAsAAACbAPP/AQACAAIAAACbAPT/AQACAAIAAACbAPX/AQACAAIAAACbAPb/AQACAAIAAACbAPf/AQAAAAsAAACbAPj/AQADAAsAAACbAAsAAQACAAIAAACbAAwAAQADAAsAAACbAA0AAQACAAIAAACbAA4AAQACAAIAAACbAA8AAQAAAAsAAACbABAAAQACAAIAAACcAO//AQACAAIAAACcAPD/AQACAAsAAACcAPH/AQACAAIAAACcAPL/AQADAAsAAACcAPP/AQAAAAsAAACcAPT/AQACAAIAAACcAAwAAQADAAsAAACcAA0AAQACAAIAAACcAA4AAQACAAIAAACcAA8AAQACAAIAAACcABAAAQACAAIAAACdAO//AQACAAIAAACdAPD/AQAAAAsAAACdAPH/AQACAAIAAACdAPL/AQAAAAsAAACdAPP/AQACAAsAAACdAPT/AQACAAIAAACdAAwAAQACAAIAAACdAA0AAQACAAIAAACdAA4AAQACAAIAAACdAA8AAQACAAsAAACdABAAAQACAAIAAACeAO//AQACAAIAAACeAPD/AQACAAIAAACeAPH/AQACAAIAAACeAPL/AQACAAIAAACeAPP/AQADAAsAAACeAPT/AQACAAIAAACeAAwAAQACAAsAAACeAA0AAQACAAIAAACeAA4AAQACAAIAAACeAA8AAQAAAAsAAACeABAAAQAAAAsAAACfAO//AQAAAAsAAACfAPD/AQAAAAsAAACfAPH/AQACAAIAAACfAPL/AQAAAAsAAACfAPP/AQAAAAsAAACfAPT/AQAAAAsAAACfAAwAAQACAAIAAACfAA0AAQACAAIAAACfAA4AAQABAAsAAACfAA8AAQAAAAsAAACfABAAAQACAAIAAACgAO//AQACAAsAAACgAPD/AQACAAIAAACgAPH/AQAAAAsAAACgAPL/AQACAAIAAACgAPP/AQACAAIAAACgAPT/AQACAAIAAACgAAwAAQACAAIAAACgAA0AAQACAAIAAACgAA4AAQACAAIAAACgAA8AAQAAAAsAAACgABAAAQAAAAsAAAChAO//AQACAAIAAAChAPD/AQABAAsAAAChAPH/AQACAAsAAAChAPL/AQAAAAsAAAChAPP/AQACAAIAAAChAPT/AQACAAsAAAChAAwAAQACAAsAAAChAA0AAQABAAsAAAChAA4AAQACAAIAAAChAA8AAQACAAsAAAChABAAAQABAAsAAACiAO//AQAAAAsAAACiAPD/AQACAAsAAACiAPH/AQACAAIAAACiAPL/AQACAAIAAACiAPP/AQACAAIAAACiAPT/AQACAAIAAACiAAwAAQACAAIAAACiAA0AAQACAAIAAACiAA4AAQACAAsAAACiAA8AAQACAAIAAACiABAAAQACAAIAAACjAO//AQAAAAsAAACjAPD/AQACAAIAAACjAPH/AQAAAAsAAACjAPL/AQAAAAsAAACjAPP/AQACAAIAAACjAPT/AQAAAAsAAACjAAwAAQACAAsAAACjAA0AAQACAAIAAACjAA4AAQACAAIAAACjAA8AAQACAAIAAACjABAAAQACAAIAAACkAO//AQAAAAsAAACkAPD/AQACAAIAAACkAPH/AQADAAsAAACkAPL/AQAAAAsAAACkAPP/AQACAAsAAACkAPT/AQADAAsAAACkAAwAAQACAAsAAACkAA0AAQAAAAsAAACkAA4AAQACAAIAAACkAA8AAQACAAIAAACkABAAAQACAAIAAAClAO//AQACAAIAAAClAPD/AQACAAsAAAClAPH/AQAAAAsAAAClAPL/AQACAAIAAAClAPP/AQACAAIAAAClAPT/AQAAAAsAAAClAAwAAQABAAsAAAClAA0AAQACAAIAAAClAA4AAQACAAIAAAClAA8AAQACAAsAAAClABAAAQAAAAsAAACmAO//AQAAAAsAAACmAPD/AQACAAIAAACmAPH/AQACAAIAAACmAPL/AQADAAsAAACmAPP/AQACAAsAAACmAPT/AQACAAIAAACmAAwAAQAAAAsAAACmAA0AAQACAAIAAACmAA4AAQACAAIAAACmAA8AAQACAAIAAACmABAAAQACAAIAAACnAO//AQACAAIAAACnAPD/AQADAAsAAACnAPH/AQACAAIAAACnAPL/AQACAAIAAACnAPP/AQACAAIAAACnAPT/AQAAAAsAAACnAAwAAQACAAsAAACnAA0AAQAAAAsAAACnAA4AAQACAAIAAACnAA8AAQADAAsAAACnABAAAQACAAIAAAB/AAsAAQAAAAsAAAB/AAwAAQACAAIAAAB/AA0AAQACAAIAAAB/AA4AAQAAAAsAAAB/AA8AAQAAAAsAAAB/ABAAAQAAAAsAAACAAAsAAQACAAIAAACAAAwAAQACAAsAAACAAA0AAQACAAIAAACAAA4AAQAAAAsAAACAAA8AAQACAAIAAACAABAAAQACAAIAAACBAAsAAQACAAIAAACBAAwAAQAAAAsAAACBAA0AAQACAAIAAACBAA4AAQAAAAsAAACBAA8AAQACAAIAAACBABAAAQACAAsAAACCAAsAAQAAAAsAAACCAAwAAQACAAIAAACCAA0AAQACAAsAAACCAA4AAQACAAIAAACCAA8AAQACAAIAAACCABAAAQACAAIAAACDAAsAAQACAAIAAACDAAwAAQAAAAsAAACDAA0AAQACAAsAAACDAA4AAQADAAsAAACDAA8AAQACAAIAAACDABAAAQACAAIAAACEAAsAAQACAAIAAACEAAwAAQACAAIAAACEAA0AAQAAAAsAAACEAA4AAQAAAAsAAACEAA8AAQACAAIAAACEABAAAQAAAAsAAACFAAsAAQACAAsAAACFAAwAAQACAAIAAACFAA0AAQACAAIAAACFAA4AAQACAAIAAACFAA8AAQACAAIAAACFABAAAQAAAAsAAACGAAsAAQACAAsAAACGAAwAAQACAAIAAACGAA0AAQACAAIAAACGAA4AAQACAAIAAACGAA8AAQACAAIAAACGABAAAQACAAsAAACHAAsAAQAAAAsAAACHAAwAAQACAAIAAACHAA0AAQAAAAsAAACHAA4AAQADAAsAAACHAA8AAQACAAsAAACHABAAAQAAAAsAAACIAAsAAQAAAAsAAACIAAwAAQACAAIAAACIAA0AAQACAAIAAACIAA4AAQAAAAsAAACIAA8AAQACAAIAAACIABAAAQAAAAsAAACJAAsAAQACAAIAAACJAAwAAQACAAsAAACJAA0AAQAAAAsAAACJAA4AAQACAAsAAACJAA8AAQACAAIAAACJABAAAQACAAIAAACKAAsAAQACAAIAAACKAAwAAQAAAAsAAACKAA0AAQACAAsAAACKAA4AAQACAAIAAACKAA8AAQACAAIAAACKABAAAQACAAIAAACLAAsAAQACAAsAAACLAAwAAQACAAIAAACLAA0AAQACAAIAAACLAA4AAQACAAIAAACLAA8AAQACAAIAAACLABAAAQAAAAsAAACMAAsAAQAAAAsAAACMAAwAAQACAAIAAACMAA0AAQACAAIAAACMAA4AAQACAAsAAACMAA8AAQAAAAsAAACMABAAAQACAAIAAACNAAsAAQAAAAsAAACNAAwAAQACAAIAAACNAA0AAQACAAsAAACNAA4AAQACAAIAAACNAA8AAQACAAIAAACNABAAAQAAAAsAAACOAAsAAQAAAAsAAACOAAwAAQAAAAsAAACOAA0AAQACAAIAAACOAA4AAQACAAIAAACOAA8AAQACAAsAAACOABAAAQAAAAsAAACPAAsAAQACAAIAAACPAAwAAQACAAIAAACPAA0AAQACAAIAAACPAA4AAQAAAAsAAACPAA8AAQAAAAsAAACPABAAAQACAAsAAACQAAsAAQAAAAsAAACQAAwAAQACAAIAAACQAA0AAQACAAIAAACQAA4AAQACAAIAAACQAA8AAQACAAIAAACQABAAAQACAAsAAACRAAsAAQACAAIAAACRAAwAAQACAAIAAACRAA0AAQAAAAsAAACRAA4AAQAAAAsAAACRAA8AAQACAAIAAACRABAAAQACAAsAAACSAAsAAQACAAIAAACSAAwAAQACAAIAAACSAA0AAQACAAIAAACSAA4AAQAAAAsAAACSAA8AAQACAAsAAACSABAAAQAAAAsAAACTAAsAAQAAAAsAAACTAAwAAQACAAIAAACTAA0AAQACAAIAAACTAA4AAQACAAIAAACTAA8AAQADAAsAAACTABAAAQACAAIAAACUAAsAAQACAAIAAACUAAwAAQACAAIAAACUAA0AAQAAAAsAAACUAA4AAQACAAIAAACUAA8AAQADAAsAAACUABAAAQACAAsAAACVAAsAAQACAAIAAACVAAwAAQAAAAsAAACVAA0AAQADAAsAAACVAA4AAQACAAIAAACVAA8AAQACAAIAAACVABAAAQACAAIAAACWAAsAAQAAAAsAAACWAAwAAQACAAIAAACWAA0AAQACAAIAAACWAA4AAQAAAAsAAACWAA8AAQAAAAsAAACWABAAAQADAAsAAACXAAsAAQAAAAsAAACXAAwAAQACAAsAAACXAA0AAQACAAIAAACXAA4AAQADAAsAAACXAA8AAQAAAAsAAACXABAAAQACAAIAAAB/APr/AQAAAAsAAAB/APv/AQAAAAsAAACAAPr/AQADAAsAAACAAPv/AQAAAAsAAACBAPr/AQACAAIAAACBAPv/AQAAAAsAAACCAPr/AQACAAIAAACCAPv/AQACAAIAAACDAPr/AQAAAAsAAACDAPv/AQACAAIAAACEAPr/AQACAAIAAACEAPv/AQACAAsAAACFAPr/AQACAAIAAACFAPv/AQACAAIAAACGAPr/AQACAAIAAACGAPv/AQAAAAsAAACHAPr/AQAAAAsAAACHAPv/AQACAAIAAACIAPr/AQAAAAsAAACIAPv/AQACAAIAAACJAPr/AQACAAIAAACJAPv/AQAAAAsAAACKAPr/AQACAAIAAACKAPv/AQACAAIAAACLAPr/AQACAAIAAACLAPv/AQAAAAsAAACMAPr/AQACAAIAAACMAPv/AQAAAAsAAACNAPr/AQAAAAsAAACNAPv/AQACAAIAAACOAPr/AQACAAIAAACOAPv/AQACAAIAAACPAPr/AQACAAIAAACPAPv/AQACAAIAAACQAPr/AQAAAAsAAACQAPv/AQACAAIAAACRAPr/AQAAAAsAAACRAPv/AQACAAIAAACSAPr/AQABAAsAAACSAPv/AQAAAAsAAACTAPr/AQACAAsAAACTAPv/AQACAAIAAACUAPr/AQAAAAsAAACUAPv/AQACAAIAAACVAPr/AQAAAAsAAACVAPv/AQADAAsAAACWAPr/AQAAAAsAAACWAPv/AQACAAIAAAB9AP7/AQACAAIAAAB9AP//AQACAAIAAAB9AAAAAQACAAIAAAB9AAEAAQAAAAsAAAB9AAYAAQACAAsAAAB9AAcAAQACAAsAAAB9AAgAAQAAAAsAAAB9AAkAAQACAAIAAAB9AAoAAQACAAIAAAB+AP7/AQACAAIAAAB+AP//AQAAAAsAAAB+AAAAAQACAAIAAAB+AAEAAQAAAAsAAAB+AAYAAQACAAIAAAB+AAcAAQACAAsAAAB+AAgAAQACAAIAAAB+AAkAAQACAAIAAAB+AAoAAQACAAIAAAB4AP3/AQACAAIAAAB4AP7/AQADAAsAAAB4AP//AQACAAIAAAB4AAAAAQACAAIAAAB4AAEAAQACAAIAAAB4AAYAAQADAAsAAAB4AAcAAQADAAsAAAB4AAgAAQADAAsAAAB4AAkAAQAAAAsAAAB4AAoAAQACAAIAAAB5AP3/AQACAAIAAAB5AP7/AQABAAsAAAB5AP//AQAAAAsAAAB5AAAAAQACAAIAAAB5AAEAAQACAAIAAAB5AAYAAQACAAsAAAB5AAcAAQACAAsAAAB5AAgAAQABAAsAAAB5AAkAAQAAAAsAAAB5AAoAAQACAAsAAAB6AP3/AQACAAIAAAB6AP7/AQACAAIAAAB6AP//AQACAAIAAAB6AAAAAQACAAIAAAB6AAEAAQAAAAsAAAB6AAYAAQAAAAsAAAB6AAcAAQACAAIAAAB6AAgAAQAAAAsAAAB6AAkAAQACAAIAAAB6AAoAAQACAAIAAAB7AP3/AQACAAsAAAB7AP7/AQAAAAsAAAB7AP//AQACAAIAAAB7AAAAAQACAAIAAAB7AAEAAQACAAIAAAB7AAYAAQAAAAsAAAB7AAcAAQACAAsAAAB7AAgAAQACAAIAAAB7AAkAAQACAAIAAAB7AAoAAQACAAIAAAB8AP3/AQACAAIAAAB8AP7/AQAAAAsAAAB8AP//AQACAAIAAAB8AAAAAQAAAAsAAAB8AAEAAQACAAsAAAB8AAYAAQAAAAsAAAB8AAcAAQACAAIAAAB8AAgAAQACAAsAAAB8AAkAAQACAAIAAAB8AAoAAQACAAIAAAB9AP3/AQAAAAsAAAB+AP3/AQAAAAsAAAB1AAEAAQADAAsAAAB1AAIAAQACAAIAAAB1AAMAAQACAAIAAAB1AAQAAQAAAAsAAAB1AAUAAQADAAsAAAB1AAYAAQAAAAsAAAB1AAcAAQACAAsAAAB1AAgAAQAAAAsAAAB1AAkAAQAAAAsAAAB1AAoAAQAAAAsAAAB2AAEAAQACAAsAAAB2AAYAAQABAAsAAAB2AAcAAQACAAIAAAB2AAgAAQAAAAsAAAB2AAkAAQAAAAsAAAB2AAoAAQAAAAsAAAB3AAEAAQACAAsAAAB3AAYAAQACAAIAAAB3AAcAAQAAAAsAAAB3AAgAAQAAAAsAAAB3AAkAAQACAAIAAAB3AAoAAQACAAsAAAB8APr/AQAAAAsAAAB8APv/AQACAAIAAAB8APz/AQAAAAsAAAB9APr/AQACAAIAAAB9APv/AQADAAsAAAB9APz/AQACAAIAAAB+APr/AQAAAAsAAAB+APv/AQACAAsAAAB+APz/AQAAAAsAAAB9APj/AQACAAIAAAB9APn/AQADAAsAAAB+APj/AQAAAAsAAAB+APn/AQAAAAsAAAB/APj/AQACAAIAAAB/APn/AQACAAIAAACAAPj/AQACAAIAAACAAPn/AQACAAIAAACBAPj/AQACAAIAAACBAPn/AQACAAsAAACCAPj/AQACAAIAAACCAPn/AQACAAsAAACDAPj/AQACAAIAAACDAPn/AQACAAIAAACEAPj/AQACAAsAAACEAPn/AQACAAIAAACFAPL/AQACAAIAAACFAPP/AQACAAIAAACFAPT/AQAAAAsAAACFAPX/AQACAAIAAACFAPb/AQACAAIAAACFAPf/AQACAAIAAACFAPj/AQABAAsAAACFAPn/AQAAAAsAAACGAPL/AQACAAIAAACGAPP/AQAAAAsAAACGAPT/AQADAAsAAACGAPX/AQACAAIAAACGAPb/AQACAAsAAACGAPf/AQACAAsAAACGAPj/AQAAAAsAAACGAPn/AQAAAAsAAACHAPL/AQACAAIAAACHAPP/AQACAAIAAACHAPT/AQABAAsAAACHAPX/AQAAAAsAAACHAPb/AQACAAIAAACHAPf/AQACAAIAAACHAPj/AQACAAIAAACHAPn/AQACAAIAAACIAPL/AQAAAAsAAACIAPP/AQAAAAsAAACIAPT/AQACAAIAAACIAPX/AQAAAAsAAACIAPb/AQACAAsAAACIAPf/AQACAAIAAACIAPj/AQACAAIAAACIAPn/AQAAAAsAAACJAPL/AQACAAsAAACJAPP/AQAAAAsAAACJAPT/AQAAAAsAAACJAPX/AQACAAsAAACJAPb/AQACAAIAAACJAPf/AQAAAAsAAACJAPj/AQACAAIAAACJAPn/AQACAAIAAACKAPL/AQACAAsAAACKAPP/AQAAAAsAAACKAPT/AQACAAIAAACKAPX/AQACAAsAAACKAPb/AQACAAIAAACKAPf/AQACAAIAAACKAPj/AQACAAIAAACKAPn/AQACAAIAAACLAPL/AQACAAsAAACLAPP/AQACAAsAAACLAPT/AQACAAIAAACLAPX/AQAAAAsAAACLAPb/AQAAAAsAAACLAPf/AQAAAAsAAACLAPj/AQACAAsAAACLAPn/AQACAAIAAACMAPL/AQACAAIAAACMAPP/AQACAAIAAACMAPT/AQACAAIAAACMAPX/AQACAAIAAACMAPb/AQADAAsAAACMAPf/AQADAAsAAACMAPj/AQACAAIAAACMAPn/AQACAAsAAACNAPL/AQACAAIAAACNAPP/AQABAAsAAACNAPT/AQACAAIAAACNAPX/AQACAAIAAACNAPb/AQAAAAsAAACNAPf/AQACAAIAAACNAPj/AQADAAsAAACNAPn/AQACAAsAAACOAPL/AQAAAAsAAACOAPP/AQACAAIAAACOAPT/AQACAAsAAACOAPX/AQACAAIAAACOAPb/AQACAAIAAACOAPf/AQACAAsAAACOAPj/AQACAAIAAACOAPn/AQACAAIAAACPAPL/AQADAAsAAACPAPP/AQACAAIAAACPAPT/AQACAAsAAACPAPX/AQACAAIAAACPAPb/AQACAAIAAACPAPf/AQAAAAsAAACPAPj/AQACAAIAAACPAPn/AQACAAIAAACQAPL/AQACAAIAAACQAPP/AQAAAAsAAACQAPT/AQAAAAsAAACQAPX/AQACAAIAAACQAPb/AQACAAIAAACQAPf/AQAAAAsAAACQAPj/AQACAAsAAACQAPn/AQACAAsAAACRAPL/AQACAAIAAACRAPP/AQAAAAsAAACRAPT/AQAAAAsAAACRAPX/AQACAAIAAACRAPb/AQAAAAsAAACRAPf/AQACAAsAAACRAPj/AQACAAIAAACRAPn/AQACAAsAAACSAPP/AQADAAsAAACSAPT/AQACAAIAAACSAPX/AQADAAsAAACSAPb/AQACAAIAAACSAPf/AQACAAIAAACSAPj/AQACAAIAAACSAPn/AQAAAAsAAACTAPP/AQACAAIAAACTAPT/AQAAAAsAAACTAPX/AQACAAIAAACTAPb/AQACAAsAAACTAPf/AQACAAsAAACTAPj/AQACAAsAAACTAPn/AQACAAsAAACUAPP/AQACAAIAAACUAPT/AQACAAIAAACUAPX/AQACAAsAAACUAPb/AQACAAIAAACUAPf/AQACAAIAAACUAPj/AQACAAsAAACUAPn/AQADAAsAAACVAPP/AQACAAIAAACVAPT/AQAAAAsAAACVAPX/AQACAAIAAACVAPb/AQAAAAsAAACVAPf/AQACAAIAAACVAPj/AQACAAIAAACVAPn/AQACAAIAAACWAPP/AQACAAIAAACWAPT/AQAAAAsAAACWAPX/AQACAAIAAACWAPb/AQACAAIAAACWAPf/AQACAAsAAACWAPj/AQACAAsAAACWAPn/AQACAAIAAACXAPP/AQACAAIAAACXAPT/AQACAAIAAACXAPX/AQAAAAsAAACXAPb/AQACAAsAAACXAPf/AQAAAAsAAACXAPj/AQACAAIAAACXAPL/AQAAAAsAAACYAPL/AQACAAsAAACSAPL/AQACAAIAAACTAPL/AQAAAAsAAACUAPL/AQACAAsAAACVAPL/AQACAAIAAACWAPL/AQACAAIAAAA=") tile_set = ExtResource("8_m2u8u") [node name="Terrain Layer" type="TileMapLayer" parent="."] @@ -201,6 +206,9 @@ metadata/_edit_group_ = true [node name="Sprite2D" parent="Enemies/Flying Enemy" index="1"] flip_h = true +[node name="PeriodicShootingComponent" parent="Enemies/Flying Enemy" index="8"] +ShootDirection = Vector2(-1, 0) + [node name="HitParticles" parent="Enemies/Flying Enemy" index="15"] process_material = SubResource("ParticleProcessMaterial_qxfb0") @@ -214,6 +222,10 @@ metadata/_edit_group_ = true [node name="Sprite2D" parent="Enemies/Flying Enemy2" index="1"] flip_h = true +[node name="PeriodicShootingComponent" parent="Enemies/Flying Enemy2" index="8"] +ShootDirection = Vector2(-1, 0) +ShootingIntervalVariation = 0.615 + [node name="HitParticles" parent="Enemies/Flying Enemy2" index="15"] process_material = SubResource("ParticleProcessMaterial_qxfb0") @@ -255,23 +267,6 @@ position = Vector2(3492, -23) [node name="Enemies mid section path" type="Path2D" parent="."] curve = SubResource("Curve2D_l8w2k") -[node name="PathFollow2D" type="PathFollow2D" parent="Enemies mid section path"] -position = Vector2(5283, 220) -rotation = -1.59373 - -[node name="Flying Enemy" parent="Enemies mid section path/PathFollow2D" instance=ExtResource("18_162yw")] -position = Vector2(-1120.11, 1155.36) -metadata/_edit_group_ = true - -[node name="Sprite2D" parent="Enemies mid section path/PathFollow2D/Flying Enemy" index="1"] -flip_h = true - -[node name="HitParticles" parent="Enemies mid section path/PathFollow2D/Flying Enemy" index="15"] -process_material = SubResource("ParticleProcessMaterial_qxfb0") - -[node name="laser spawn point left" parent="Enemies mid section path/PathFollow2D/Flying Enemy" index="19"] -position = Vector2(-12, -2) - [node name="Spaceship Enter" parent="." instance=ExtResource("14_bajwe")] position = Vector2(559, 15) @@ -281,6 +276,29 @@ position = Vector2(7148, 22) [node name="CollisionShape2D" parent="Spaceship exit" index="0"] position = Vector2(16.5, -10) +[node name="EnemyWaveManager" type="Node" parent="." node_paths=PackedStringArray("EnemyPath")] +script = ExtResource("19_l8w2k") +EnemyPath = NodePath("../Enemies mid section path") +EnemyScenes = Array[PackedScene]([ExtResource("18_162yw"), ExtResource("18_162yw"), ExtResource("18_162yw"), ExtResource("18_162yw"), ExtResource("18_162yw"), ExtResource("18_162yw"), ExtResource("18_162yw"), ExtResource("18_162yw"), ExtResource("18_162yw")]) +SpawnInterval = 0.2 +metadata/_custom_type_script = "uid://dogp7ehihnw3s" + +[node name="WaveTriggerComponent" type="Node" parent="." node_paths=PackedStringArray("TriggerArea", "WaveManager", "ChaserToPause")] +script = ExtResource("20_e6jir") +TriggerArea = NodePath("../First Wave Area") +WaveManager = NodePath("../EnemyWaveManager") +ChaserToPause = NodePath("../Chaser/ChaseLevelComponent") +PauseChaser = false +metadata/_custom_type_script = "uid://ctg4awndvgfd8" + +[node name="First Wave Area" type="Area2D" parent="."] +position = Vector2(2655, -82) +collision_layer = 0 +collision_mask = 4 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="First Wave Area"] +shape = SubResource("RectangleShape2D_o1yb3") + [connection signal="Death" from="Brick Player/HealthComponent" to="UI Layer/DeathScreen" method="OnPlayerDeath"] [connection signal="Death" from="Brick Player/HealthComponent" to="UI Layer/GameOverScreen" method="OnPlayerDeath"] [connection signal="SpaceshipEntered" from="Spaceship Enter" to="Chaser/ChaseLevelComponent" method="OnShipEntered"] @@ -297,6 +315,5 @@ position = Vector2(16.5, -10) [editable path="Enemies/Flying Enemy2"] [editable path="Enemies/Flying Enemy3"] [editable path="Enemies/Flying Enemy4"] -[editable path="Enemies mid section path/PathFollow2D/Flying Enemy"] [editable path="Spaceship Enter"] [editable path="Spaceship exit"] diff --git a/scripts/components/ChaseLevelComponent.cs b/scripts/components/ChaseLevelComponent.cs index 1595155..f2da62e 100644 --- a/scripts/components/ChaseLevelComponent.cs +++ b/scripts/components/ChaseLevelComponent.cs @@ -86,4 +86,19 @@ public partial class ChaseLevelComponent : Node EmitSignalChaseStopped(); _isChasing = false; } + + public void SetChasing(bool shouldChase) + { + if (shouldChase && !_isChasing) + { + _previousCameraFollowTarget = _phantomCamera.FollowTarget; + _phantomCamera.FollowTarget = _root; + EmitSignalChaseStarted(); + _isChasing = true; + } + else if (!shouldChase && _isChasing) + { + StopChasing(); + } + } } \ No newline at end of file diff --git a/scripts/components/EnemyWaveManager.cs b/scripts/components/EnemyWaveManager.cs new file mode 100644 index 0000000..d9fed7e --- /dev/null +++ b/scripts/components/EnemyWaveManager.cs @@ -0,0 +1,86 @@ +using Godot; +using Godot.Collections; + +namespace Mr.BrickAdventures.scripts.components; + +[GlobalClass] +public partial class EnemyWaveManager : Node +{ + [Export] public Path2D EnemyPath { get; set; } + [Export] public Array EnemyScenes { get; set; } = []; + [Export] public float SpawnInterval { get; set; } = 1.0f; // Time between each enemy spawn + + private int _enemiesToSpawn; + private int _activeEnemies; + private Timer _spawnTimer; + + [Signal] + public delegate void WaveCompletedEventHandler(); + + public override void _Ready() + { + _spawnTimer = new Timer(); + _spawnTimer.WaitTime = SpawnInterval; + _spawnTimer.OneShot = false; + _spawnTimer.Timeout += SpawnNextEnemy; + AddChild(_spawnTimer); + } + + public void StartWave() + { + if (EnemyScenes.Count == 0 || EnemyPath == null) + { + GD.PrintErr("EnemyWaveManager: Enemy scenes or path not set!"); + return; + } + + _enemiesToSpawn = EnemyScenes.Count; + _activeEnemies = 0; + _spawnTimer.Start(); + } + + private void SpawnNextEnemy() + { + if (_enemiesToSpawn <= 0) + { + _spawnTimer.Stop(); + return; + } + + var enemyIndex = EnemyScenes.Count - _enemiesToSpawn; + var enemyScene = EnemyScenes[enemyIndex]; + + var pathFollowNode = new PathFollow2D(); + EnemyPath.AddChild(pathFollowNode); + + var enemyInstance = enemyScene.Instantiate(); + pathFollowNode.AddChild(enemyInstance); + + var pathFollowerComponent = enemyInstance.GetNodeOrNull("PathFollowerComponent"); + if (pathFollowerComponent == null) + { + GD.PrintErr($"Enemy scene '{enemyScene.ResourcePath}' is missing a PathFollowerComponent."); + pathFollowNode.QueueFree(); + _enemiesToSpawn--; + return; + } + + pathFollowNode.Rotates = pathFollowerComponent.ShouldRotate; + pathFollowerComponent.Initialize(pathFollowNode); + pathFollowerComponent.StartFollowing(); + pathFollowerComponent.EnemyDestroyed += OnEnemyDestroyed; + + _enemiesToSpawn--; + _activeEnemies++; + } + + private void OnEnemyDestroyed() + { + _activeEnemies--; + + if (_enemiesToSpawn == 0 && _activeEnemies == 0) + { + EmitSignalWaveCompleted(); + } + } +} \ No newline at end of file diff --git a/scripts/components/EnemyWaveManager.cs.uid b/scripts/components/EnemyWaveManager.cs.uid new file mode 100644 index 0000000..f5d1604 --- /dev/null +++ b/scripts/components/EnemyWaveManager.cs.uid @@ -0,0 +1 @@ +uid://dogp7ehihnw3s diff --git a/scripts/components/EnemyWaveTriggerComponent.cs b/scripts/components/EnemyWaveTriggerComponent.cs deleted file mode 100644 index 972454c..0000000 --- a/scripts/components/EnemyWaveTriggerComponent.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Godot; - -namespace Mr.BrickAdventures.scripts.components; - -public partial class EnemyWaveTriggerComponent : Node -{ - [Export] public Area2D Area2D { get; set; } - [Export] public PathFollow2D PathFollowNode { get; set; } - [Export] public float Speed { get; set; } = 100f; - [Export] public bool Loop { get; set; } = false; - [Export] public bool ActivateOnEnter { get; set; } = true; - - private bool _isActive = false; - - public override void _Ready() - { - Area2D.BodyEntered += OnBodyEntered; - - if (PathFollowNode == null) return; - - PathFollowNode.SetProgress(0f); - PathFollowNode.SetProcess(false); - } - - public override void _Process(double delta) - { - if (!_isActive || PathFollowNode == null) return; - - var progress = PathFollowNode.Progress; - progress += (float)(delta * Speed); - PathFollowNode.SetProgress(progress); - - if (!(PathFollowNode.ProgressRatio >= 1f) || Loop) return; - - _isActive = false; - PathFollowNode.SetProcess(false); - } - - private void OnBodyEntered(Node2D body) - { - if (ActivateOnEnter) StartWave(); - } - - private void StartWave() - { - if (PathFollowNode == null) return; - - PathFollowNode.SetProcess(true); - _isActive = true; - } -} \ No newline at end of file diff --git a/scripts/components/EnemyWaveTriggerComponent.cs.uid b/scripts/components/EnemyWaveTriggerComponent.cs.uid deleted file mode 100644 index c4b0029..0000000 --- a/scripts/components/EnemyWaveTriggerComponent.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://d3fpwddc2j41x diff --git a/scripts/components/PathFollowerComponent.cs b/scripts/components/PathFollowerComponent.cs new file mode 100644 index 0000000..d7b95fc --- /dev/null +++ b/scripts/components/PathFollowerComponent.cs @@ -0,0 +1,67 @@ +using Godot; + +namespace Mr.BrickAdventures.scripts.components; + +[GlobalClass] +public partial class PathFollowerComponent : Node2D +{ + [Export] public float Speed { get; set; } = 200f; + [Export] public bool ShouldRotate { get; set; } = true; + + private PathFollow2D _pathFollowNode; + private HealthComponent _healthComponent; + private bool _isActive = false; + + [Signal] + public delegate void PathCompletedEventHandler(); + [Signal] + public delegate void EnemyDestroyedEventHandler(); + + public override void _Ready() + { + _healthComponent = GetOwner().GetNodeOrNull("HealthComponent"); + if (_healthComponent != null) + { + _healthComponent.Death += OnDeath; + } + } + + public override void _Process(double delta) + { + if (!_isActive || _pathFollowNode == null) return; + + _pathFollowNode.Progress += Speed * (float)delta; + + if (_pathFollowNode.ProgressRatio >= 1.0f) + { + _isActive = false; + EmitSignalPathCompleted(); + _pathFollowNode.QueueFree(); + } + } + + public void Initialize(PathFollow2D pathFollowNode) + { + _pathFollowNode = pathFollowNode; + if (ShouldRotate) + { + _pathFollowNode.Rotates = true; + } + else + { + _pathFollowNode.Rotates = false; + } + + _pathFollowNode.Loop = false; + } + + public void StartFollowing() + { + _isActive = true; + } + + private void OnDeath() + { + EmitSignalEnemyDestroyed(); + } +} \ No newline at end of file diff --git a/scripts/components/PathFollowerComponent.cs.uid b/scripts/components/PathFollowerComponent.cs.uid new file mode 100644 index 0000000..f6b45e5 --- /dev/null +++ b/scripts/components/PathFollowerComponent.cs.uid @@ -0,0 +1 @@ +uid://b4hvq2i66fjhi diff --git a/scripts/components/PlatformMovementComponent.cs b/scripts/components/PlatformMovementComponent.cs deleted file mode 100644 index 03028fa..0000000 --- a/scripts/components/PlatformMovementComponent.cs +++ /dev/null @@ -1,172 +0,0 @@ -using Godot; -using Mr.BrickAdventures.scripts.interfaces; - -namespace Mr.BrickAdventures.scripts.components; - -public partial class PlatformMovementComponent : Node2D, IMovement -{ - [Export] - public float Speed { get; set; } = 300.0f; - - [Export] - public float JumpHeight { get; set; } = 100f; - - [Export] - public float JumpTimeToPeak { get; set; } = 0.5f; - - [Export] - public float JumpTimeToDescent { get; set; } = 0.4f; - - [Export] - public int CoyoteFrames { get; set; } = 6; - - [Export] - public AudioStreamPlayer2D JumpSfx { get; set; } - - [Export] - public Node2D RotationTarget { get; set; } - - [Export] - public CharacterBody2D Body { get; set; } - - private float _gravity; - private bool _wasLastFloor = false; - private bool _coyoteMode = false; - private Timer _coyoteTimer; - private Vector2 _lastDirection = new Vector2(1, 0); - - private float _jumpVelocity; - private float _jumpGravity; - private float _fallGravity; - - public Vector2 LastDirection => _lastDirection; - - public override void _Ready() - { - base._Ready(); - - if (Body == null) - return; - - _gravity = (float)ProjectSettings.GetSetting("physics/2d/default_gravity"); - _jumpVelocity = ((2.0f * JumpHeight) / JumpTimeToPeak) * -1.0f; - _jumpGravity = ((-2.0f * JumpHeight) / (JumpTimeToPeak * JumpTimeToPeak)) * -1.0f; - _fallGravity = ((-2.0f * JumpHeight) / (JumpTimeToDescent * JumpTimeToDescent)) * -1.0f; - - _coyoteTimer = new Timer - { - OneShot = true, - WaitTime = CoyoteFrames / 60.0f - }; - _coyoteTimer.Timeout += OnCoyoteTimerTimeout; - AddChild(_coyoteTimer); - } - - public string MovementType { get; } = "platform"; - public bool Enabled { get; set; } - public Vector2 PreviousVelocity { get; set; } - - public override void _Process(double delta) - { - base._Process(delta); - - if (Body == null || !Enabled) - return; - - if (Body.Velocity.X > 0.0f) - RotationTarget.Rotation = Mathf.DegToRad(-10); - else if (Body.Velocity.X < 0.0f) - RotationTarget.Rotation = Mathf.DegToRad(10); - else - RotationTarget.Rotation = 0; - - CalculateJumpVars(); - } - - public override void _PhysicsProcess(double delta) - { - base._PhysicsProcess(delta); - - if (Body == null || !Enabled) - return; - - if (Body.IsOnFloor()) - { - _wasLastFloor = true; - _coyoteMode = false; // Reset coyote mode when back on the floor - _coyoteTimer.Stop(); // Stop timer when grounded - } - else - { - if (_wasLastFloor) // Start coyote timer only once - { - _coyoteMode = true; - _coyoteTimer.Start(); - } - _wasLastFloor = false; - } - - if (!Body.IsOnFloor()) - Body.Velocity += new Vector2(0, CalculateGravity()) * (float)delta; - - if (Input.IsActionPressed("jump") && (Body.IsOnFloor() || _coyoteMode)) - Jump(); - - if (Input.IsActionJustPressed("down")) - Body.Position += new Vector2(0, 1); - - float direction = Input.GetAxis("left", "right"); - if (direction != 0) - _lastDirection = HandleDirection(direction); - - if (direction != 0) - Body.Velocity = new Vector2(direction * Speed, Body.Velocity.Y); - else - Body.Velocity = new Vector2(Mathf.MoveToward(Body.Velocity.X, 0, Speed), Body.Velocity.Y); - - PreviousVelocity = Body.Velocity; - Body.MoveAndSlide(); - } - - private void Jump() - { - if (Body == null) - return; - - Body.Velocity = new Vector2(Body.Velocity.X, _jumpVelocity); - _coyoteMode = false; - if (JumpSfx != null) - JumpSfx.Play(); - } - - private float CalculateGravity() - { - return Body.Velocity.Y < 0.0f ? _jumpGravity : _fallGravity; - } - - private void OnCoyoteTimerTimeout() - { - _coyoteMode = false; - } - - private Vector2 HandleDirection(float inputDir) - { - if (inputDir > 0) - return new Vector2(1, 0); - else if (inputDir < 0) - return new Vector2(-1, 0); - return _lastDirection; - } - - public void OnShipEntered() - { - RotationTarget.Rotation = 0; - } - - private void CalculateJumpVars() - { - _jumpVelocity = ((2.0f * JumpHeight) / JumpTimeToPeak) * -1.0f; - _jumpGravity = ((-2.0f * JumpHeight) / (JumpTimeToPeak * JumpTimeToPeak)) * -1.0f; - _fallGravity = ((-2.0f * JumpHeight) / (JumpTimeToDescent * JumpTimeToDescent)) * -1.0f; - } -} \ No newline at end of file diff --git a/scripts/components/PlatformMovementComponent.cs.uid b/scripts/components/PlatformMovementComponent.cs.uid deleted file mode 100644 index 6a641b5..0000000 --- a/scripts/components/PlatformMovementComponent.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://btlm1f3l70il diff --git a/scripts/components/ShipMovementComponent.cs b/scripts/components/ShipMovementComponent.cs deleted file mode 100644 index 8ac70ac..0000000 --- a/scripts/components/ShipMovementComponent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Godot; -using Mr.BrickAdventures.scripts.interfaces; - -namespace Mr.BrickAdventures.scripts.components; - -public partial class ShipMovementComponent : Node, IMovement -{ - [Export] public float MaxSpeed { get; set; } = 200f; - [Export] public float Acceleration { get; set; } = 100f; - [Export] public float Friction { get; set; } = 50f; - [Export] public CharacterBody2D Body { get; set; } - - public string MovementType { get; } = "ship"; - public bool Enabled { get; set; } - public Vector2 PreviousVelocity { get; set; } - - private Vector2 _velocity = Vector2.Zero; - - public Vector2 Velocity => _velocity; - public Vector2 LastDirection => _velocity.Normalized(); - - public override void _PhysicsProcess(double delta) - { - if (Body == null || !Enabled) return; - - var inputVector = new Vector2( - Input.GetActionStrength("right") - Input.GetActionStrength("left"), - Input.GetActionStrength("down") - Input.GetActionStrength("up") - ).Normalized(); - - _velocity = inputVector != Vector2.Zero ? _velocity.MoveToward(inputVector * MaxSpeed, Acceleration * (float)delta) : _velocity.MoveToward(Vector2.Zero, Friction * (float)delta); - - _velocity = _velocity.LimitLength(MaxSpeed); - Body.Velocity = _velocity; - PreviousVelocity = Body.Velocity; - Body.MoveAndSlide(); - } -} \ No newline at end of file diff --git a/scripts/components/ShipMovementComponent.cs.uid b/scripts/components/ShipMovementComponent.cs.uid deleted file mode 100644 index 818ec4b..0000000 --- a/scripts/components/ShipMovementComponent.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cty54itmnudfm diff --git a/scripts/components/WaveTriggerComponent.cs b/scripts/components/WaveTriggerComponent.cs new file mode 100644 index 0000000..5e8eb3c --- /dev/null +++ b/scripts/components/WaveTriggerComponent.cs @@ -0,0 +1,52 @@ +using Godot; + +namespace Mr.BrickAdventures.scripts.components; + +[GlobalClass] +public partial class WaveTriggerComponent : Node +{ + [Export] public Area2D TriggerArea { get; set; } + [Export] public EnemyWaveManager WaveManager { get; set; } + [Export] public ChaseLevelComponent ChaserToPause { get; set; } // Optional + [Export] public bool PauseChaser { get; set; } = true; + + private bool _hasBeenTriggered = false; + + public override void _Ready() + { + if (TriggerArea == null || WaveManager == null) + { + GD.PrintErr("WaveTriggerComponent is missing a TriggerArea or WaveManager."); + SetProcess(false); + return; + } + + TriggerArea.BodyEntered += OnPlayerEntered; + WaveManager.WaveCompleted += OnWaveCompleted; + } + + private void OnPlayerEntered(Node2D body) + { + if (body is PlayerController && !_hasBeenTriggered) + { + _hasBeenTriggered = true; + + if (PauseChaser && ChaserToPause != null) + { + ChaserToPause.SetChasing(false); + } + + WaveManager.StartWave(); + TriggerArea.QueueFree(); + } + } + + private void OnWaveCompleted() + { + GD.Print("Wave completed!"); + if (PauseChaser && ChaserToPause != null) + { + ChaserToPause.SetChasing(true); + } + } +} \ No newline at end of file diff --git a/scripts/components/WaveTriggerComponent.cs.uid b/scripts/components/WaveTriggerComponent.cs.uid new file mode 100644 index 0000000..1083f4d --- /dev/null +++ b/scripts/components/WaveTriggerComponent.cs.uid @@ -0,0 +1 @@ +uid://ctg4awndvgfd8