diff --git a/Scenes/Actors/4WayActorEnemyTest.tscn b/Scenes/Actors/4WayActorEnemyTest.tscn index f929c6e3..e64f6c5c 100644 --- a/Scenes/Actors/4WayActorEnemyTest.tscn +++ b/Scenes/Actors/4WayActorEnemyTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=16 format=3 uid="uid://bc054js8ep2b"] +[gd_scene load_steps=18 format=3 uid="uid://bc054js8ep2b"] [ext_resource type="Script" path="res://Scripts/Components/Actors/Actor.cs" id="1_ugrra"] [ext_resource type="SpriteFrames" uid="uid://ch2ll1on8im2p" path="res://Resources/Sprites/FairyGuard.tres" id="2_i2plx"] @@ -12,6 +12,8 @@ [ext_resource type="PackedScene" uid="uid://cj63k0dmk7tl1" path="res://Scenes/Weapons/enemy_weapon_base.tscn" id="10_yktta"] [ext_resource type="Resource" uid="uid://cdfmedtgp2rcn" path="res://Resources/Weapons/EnemyWeapon.tres" id="11_kuimj"] [ext_resource type="Script" path="res://Scripts/Components/Actors/DamageReceiverActorModule.cs" id="12_fu5g7"] +[ext_resource type="Script" path="res://Scripts/Components/Actors/DeathAnimationHandler.cs" id="13_e2vvk"] +[ext_resource type="Resource" uid="uid://dk2rbf88a5irh" path="res://Resources/Bullets/Explosion_Harmless.tres" id="14_881we"] [sub_resource type="CircleShape2D" id="CircleShape2D_2b36v"] radius = 5.0 @@ -75,7 +77,7 @@ debug_path_custom_color = Color(1, 0, 0, 1) [node name="HealthProvider" type="Node2D" parent="."] script = ExtResource("9_fyr27") ResourceName = "Health" -MaxResource = 4.0 +MaxResource = 6.0 [node name="EnemyWeapon" parent="." instance=ExtResource("10_yktta")] WeaponData = ExtResource("11_kuimj") @@ -92,6 +94,10 @@ collision_mask = 8 [node name="CollisionShape2D" type="CollisionShape2D" parent="DamageReceiver/Area2D"] shape = SubResource("CircleShape2D_0tkae") +[node name="DeathAnimation" type="Node2D" parent="."] +script = ExtResource("13_e2vvk") +ExplosionData = ExtResource("14_881we") + [connection signal="area_entered" from="PlayerDetection" to="PlayerDetection" method="_on_area_entered"] [connection signal="area_exited" from="PlayerDetection" to="PlayerDetection" method="_on_area_exited"] [connection signal="velocity_computed" from="NavigationAgent2D" to="NavigationMovementProvider" method="_on_navigation_agent_2d_velocity_computed"] diff --git a/Scenes/Actors/ActorEnemyTest.tscn b/Scenes/Actors/ActorEnemyTest.tscn index 72441fb4..f052395c 100644 --- a/Scenes/Actors/ActorEnemyTest.tscn +++ b/Scenes/Actors/ActorEnemyTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=39 format=3 uid="uid://bqjcwxene73l2"] +[gd_scene load_steps=43 format=3 uid="uid://bqjcwxene73l2"] [ext_resource type="Script" path="res://Scripts/Components/Actors/Actor.cs" id="1_k5cyk"] [ext_resource type="Texture2D" uid="uid://hukxr2e63gky" path="res://Sprites/Actors/Robot3.png" id="2_wt8wl"] @@ -11,6 +11,9 @@ [ext_resource type="Script" path="res://Scripts/Components/Actors/ActorResourceProvider.cs" id="9_2ocwk"] [ext_resource type="PackedScene" uid="uid://cj63k0dmk7tl1" path="res://Scenes/Weapons/enemy_weapon_base.tscn" id="10_ehu1c"] [ext_resource type="Resource" uid="uid://cdfmedtgp2rcn" path="res://Resources/Weapons/EnemyWeapon.tres" id="11_fvpvx"] +[ext_resource type="Script" path="res://Scripts/Components/Actors/DamageReceiverActorModule.cs" id="12_ox1qk"] +[ext_resource type="Script" path="res://Scripts/Components/Actors/DeathAnimationHandler.cs" id="13_cg7c4"] +[ext_resource type="Resource" uid="uid://dk2rbf88a5irh" path="res://Resources/Bullets/Explosion_Harmless.tres" id="14_cojbg"] [sub_resource type="AtlasTexture" id="AtlasTexture_spe0p"] atlas = ExtResource("2_wt8wl") @@ -229,6 +232,9 @@ radius = 5.0 [sub_resource type="CircleShape2D" id="CircleShape2D_sthwe"] radius = 85.0529 +[sub_resource type="CircleShape2D" id="CircleShape2D_xyma2"] +radius = 5.09902 + [node name="ActorEnemyTest" type="CharacterBody2D"] collision_layer = 16 collision_mask = 113 @@ -278,7 +284,6 @@ target_desired_distance = 64.0 path_max_distance = 800.0 path_postprocessing = 1 avoidance_enabled = true -debug_enabled = true debug_path_custom_color = Color(1, 0, 0, 1) [node name="HealthProvider" type="Node2D" parent="."] @@ -288,6 +293,23 @@ ResourceName = "Health" [node name="EnemyWeapon" parent="." instance=ExtResource("10_ehu1c")] WeaponData = ExtResource("11_fvpvx") +[node name="DamageReceiver" type="Node2D" parent="." node_paths=PackedStringArray("HealthProvider")] +script = ExtResource("12_ox1qk") +HealthProvider = NodePath("../HealthProvider") +BulletGroup = 2 + +[node name="Area2D" type="Area2D" parent="DamageReceiver"] +collision_layer = 16 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DamageReceiver/Area2D"] +shape = SubResource("CircleShape2D_xyma2") + +[node name="DeathAnimation" type="Node2D" parent="."] +script = ExtResource("13_cg7c4") +ExplosionData = ExtResource("14_cojbg") + [connection signal="area_entered" from="PlayerDetection" to="PlayerDetection" method="_on_area_entered"] [connection signal="area_exited" from="PlayerDetection" to="PlayerDetection" method="_on_area_exited"] [connection signal="velocity_computed" from="NavigationAgent2D" to="NavigationMovementProvider" method="_on_navigation_agent_2d_velocity_computed"] +[connection signal="area_entered" from="DamageReceiver/Area2D" to="DamageReceiver" method="_on_damage_hitbox_area_entered"] diff --git a/Scenes/Barrel.cs b/Scenes/Barrel.cs index 0ccf92c7..72f43bdb 100644 --- a/Scenes/Barrel.cs +++ b/Scenes/Barrel.cs @@ -115,6 +115,7 @@ public partial class Barrel : Area2D, IDestructible private void CreateDebris() { + if (DebrisScene == null) return; this.CreateSibling(DebrisScene); } diff --git a/Scenes/Maps/NewActorTest.tscn b/Scenes/Maps/NewActorTest.tscn index 3e995a60..44ca4752 100644 --- a/Scenes/Maps/NewActorTest.tscn +++ b/Scenes/Maps/NewActorTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=4 uid="uid://5klhna6pdpss"] +[gd_scene load_steps=24 format=4 uid="uid://5klhna6pdpss"] [ext_resource type="Script" path="res://Scripts/GameManager.cs" id="1_uhxhn"] [ext_resource type="PackedScene" uid="uid://bghghp5ep4w2j" path="res://Scenes/player.tscn" id="2_afebu"] @@ -13,12 +13,24 @@ [ext_resource type="Script" path="res://Scenes/CameraTarget.gd" id="10_86lpq"] [ext_resource type="Script" path="res://Scripts/AlarmManager.cs" id="11_njjjf"] [ext_resource type="PackedScene" uid="uid://bqjcwxene73l2" path="res://Scenes/Actors/ActorEnemyTest.tscn" id="12_8mkvw"] +[ext_resource type="PackedScene" uid="uid://d1h48wgasakk4" path="res://Scenes/Interactable/alarm_box.tscn" id="14_pr50u"] +[ext_resource type="PackedScene" uid="uid://dnbtou2fklyvp" path="res://Scenes/Actors/alarm_sign.tscn" id="15_a8c3x"] +[ext_resource type="PackedScene" uid="uid://byms2dhliyux0" path="res://Scenes/Actors/teleporter.tscn" id="16_5qis2"] +[ext_resource type="PackedScene" uid="uid://crph24e6e0v0q" path="res://Scenes/Interactable/Control_Pad.tscn" id="16_ijcqi"] +[ext_resource type="Script" path="res://Scripts/Actors/AlarmTeleporterActorSpawner.cs" id="17_7pavy"] +[ext_resource type="Script" path="res://Scripts/Activables/ScriptableBase.cs" id="17_wpn2u"] +[ext_resource type="Script" path="res://Scripts/Resources/Events/AlarmEnableEvent.cs" id="18_q3u5g"] +[ext_resource type="LabelSettings" uid="uid://buk3e7bbwmnv1" path="res://Resources/Styles/Hud_Text_Style.tres" id="19_1ywt4"] [sub_resource type="Resource" id="Resource_6wo78"] script = ExtResource("4_7nc7l") EggIndex = 0 StartingEquipment = [] +[sub_resource type="Resource" id="Resource_0a8l3"] +script = ExtResource("18_q3u5g") +WaitForCompletion = true + [node name="GameScene" type="Node2D"] script = ExtResource("1_uhxhn") PlayerTemplate = ExtResource("2_afebu") @@ -80,3 +92,66 @@ position = Vector2(111, 305) [node name="AlarmManager" type="Node2D" parent="."] script = ExtResource("11_njjjf") + +[node name="AlarmBox" parent="." instance=ExtResource("14_pr50u")] +position = Vector2(68, 243) + +[node name="AlarmBox2" parent="." instance=ExtResource("15_a8c3x")] +position = Vector2(68, 231) + +[node name="Teleporter" parent="." instance=ExtResource("16_5qis2")] +position = Vector2(151, 311) +metadata/_edit_group_ = true + +[node name="Spawner" type="Node2D" parent="Teleporter" node_paths=PackedStringArray("Teleporter")] +script = ExtResource("17_7pavy") +Teleporter = NodePath("..") +ActivationRange = 100.0 +ActorPrefab = ExtResource("8_vi7eu") + +[node name="Teleporter2" parent="." instance=ExtResource("16_5qis2")] +position = Vector2(-59, 279) +metadata/_edit_group_ = true + +[node name="Spawner" type="Node2D" parent="Teleporter2" node_paths=PackedStringArray("Teleporter")] +script = ExtResource("17_7pavy") +Teleporter = NodePath("..") +ActivationRange = 100.0 +ActorPrefab = ExtResource("8_vi7eu") + +[node name="Teleporter3" parent="." instance=ExtResource("16_5qis2")] +position = Vector2(72, 391) +metadata/_edit_group_ = true + +[node name="Spawner" type="Node2D" parent="Teleporter3" node_paths=PackedStringArray("Teleporter")] +script = ExtResource("17_7pavy") +Teleporter = NodePath("..") +ActivationRange = 100.0 +ActorPrefab = ExtResource("8_vi7eu") + +[node name="ControlPad" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("16_ijcqi")] +position = Vector2(97, 244) +Target = NodePath("Script") + +[node name="Script" type="Node2D" parent="ControlPad"] +script = ExtResource("17_wpn2u") +Events = Array[Object]([SubResource("Resource_0a8l3")]) + +[node name="Label" type="Label" parent="ControlPad"] +offset_left = -7.0 +offset_top = -13.0 +offset_right = 42.0 +offset_bottom = -2.0 +text = "Activate Alarm" +label_settings = ExtResource("19_1ywt4") + +[node name="ControlPad2" parent="." node_paths=PackedStringArray("Target") instance=ExtResource("16_ijcqi")] +position = Vector2(148, 244) +Target = NodePath("../Teleporter/Spawner") + +[node name="Label" type="Label" parent="ControlPad2"] +offset_right = 40.0 +offset_bottom = 23.0 +text = "Manual +Spawn" +label_settings = ExtResource("19_1ywt4") diff --git a/Scenes/test.tscn b/Scenes/test.tscn index 217f7152..32c78788 100644 --- a/Scenes/test.tscn +++ b/Scenes/test.tscn @@ -142,7 +142,7 @@ ActivationType = 0 Targets = Array[NodePath]([NodePath("../Rumia")]) WaitForCompletion = true -[sub_resource type="Resource" id="Resource_psv6q"] +[sub_resource type="Resource" id="Resource_7hesl"] resource_local_to_scene = true script = ExtResource("49_0si7g") Target = NodePath(".") @@ -678,7 +678,7 @@ Events = Array[Object]([SubResource("Resource_068l7"), SubResource("Resource_l3n [node name="BossBattleStartScript" parent="." instance=ExtResource("43_kf3qc")] position = Vector2(-1487, -396) -Events = Array[Object]([SubResource("Resource_4f4id"), SubResource("Resource_s2o7m"), SubResource("Resource_b1dht"), SubResource("Resource_xrgpy"), SubResource("Resource_psv6q")]) +Events = Array[Object]([SubResource("Resource_4f4id"), SubResource("Resource_s2o7m"), SubResource("Resource_b1dht"), SubResource("Resource_xrgpy"), SubResource("Resource_7hesl")]) [node name="Enemy8" parent="." instance=ExtResource("47_u1ve6")] position = Vector2(-1117, 184) diff --git a/Scripts/Activables/Teleporter.cs b/Scripts/Activables/Teleporter.cs index 0805115e..e6b3d828 100644 --- a/Scripts/Activables/Teleporter.cs +++ b/Scripts/Activables/Teleporter.cs @@ -131,8 +131,8 @@ public partial class Teleporter : Activable await TweenPlayer(player); - - _particles.Emitting = true; + //_particles.Emitting = true; + FireParticles(); await player.Teleport(); diff --git a/Scripts/Actors/ActorSpawner.cs b/Scripts/Actors/ActorSpawner.cs new file mode 100644 index 00000000..e7607375 --- /dev/null +++ b/Scripts/Actors/ActorSpawner.cs @@ -0,0 +1,31 @@ +using Godot; +using Godot.Collections; + +namespace Cirno.Scripts.Actors; + +public partial class ActorSpawner : Node2D, IActivable +{ + [Export] + public PackedScene ActorPrefab { get; set; } + + [Export] public bool WaitForActorDeath { get; private set; } = true; + + public Actor SpawnedActor { get; private set; } + + public virtual void Spawn() + { + SpawnedActor = this.CreateSibling(ActorPrefab); + } + + public void Activate(ActivationType activationType = ActivationType.Toggle) + { + if (!WaitForActorDeath) + { + Spawn(); + } + else if (SpawnedActor == null) + { + Spawn(); + } + } +} \ No newline at end of file diff --git a/Scripts/Actors/AlarmTeleporterActorSpawner.cs b/Scripts/Actors/AlarmTeleporterActorSpawner.cs new file mode 100644 index 00000000..2d79c2e4 --- /dev/null +++ b/Scripts/Actors/AlarmTeleporterActorSpawner.cs @@ -0,0 +1,28 @@ +using Cirno.Scripts.Activables; +using Godot; + +namespace Cirno.Scripts.Actors; + +public partial class AlarmTeleporterActorSpawner : ActorSpawner +{ + private AlarmManager _alarmManager; + + [Export] + public Teleporter Teleporter { get; private set; } + + [Export] + public float ActivationRange { get; private set; } + + public override void _Ready() + { + _alarmManager = this.GetAlarmManager(); + _alarmManager.AlarmEnabled += AlarmManagerOnAlarmEnabled; + } + + private void AlarmManagerOnAlarmEnabled(Vector2 location) + { + if (!(location.DistanceTo(this.GlobalPosition) <= ActivationRange)) return; + Teleporter?.FireParticles(); + Spawn(); + } +} \ No newline at end of file diff --git a/Scripts/Components/Actors/Actor.cs b/Scripts/Components/Actors/Actor.cs index 77b0124c..3b0a6855 100644 --- a/Scripts/Components/Actors/Actor.cs +++ b/Scripts/Components/Actors/Actor.cs @@ -15,6 +15,9 @@ public partial class Actor : CharacterBody2D private GameManager _gameManager; private List _modules = new(); + + [Signal] + public delegate void OnDeathEventHandler(); public bool IsDestroyed { get; set; } @@ -47,4 +50,9 @@ public partial class Actor : CharacterBody2D } } + public void TriggerDeath() + { + EmitSignal(SignalName.OnDeath); + } + } \ No newline at end of file diff --git a/Scripts/Components/Actors/AnimationHandler.cs b/Scripts/Components/Actors/AnimationHandler.cs index c69ddcbd..2cab18a4 100644 --- a/Scripts/Components/Actors/AnimationHandler.cs +++ b/Scripts/Components/Actors/AnimationHandler.cs @@ -15,7 +15,7 @@ public partial class AnimationHandler : ActorModule public override void Init(Actor parent) { _parent = parent; - + _parent.OnDeath += ParentOnOnDeath; // var children = GetChildren(); // foreach (var child in children) { // if (child is InputProvider inputProvider) @@ -25,6 +25,12 @@ public partial class AnimationHandler : ActorModule // } } + protected virtual void ParentOnOnDeath() + { + _animatedSprite.SpeedScale = 0; + _animatedSprite.Hide(); + } + public override void Update(double delta) { if (IsDestroyed) return; diff --git a/Scripts/Components/Actors/DamageReceiverActorModule.cs b/Scripts/Components/Actors/DamageReceiverActorModule.cs index 00d257a3..acb81107 100644 --- a/Scripts/Components/Actors/DamageReceiverActorModule.cs +++ b/Scripts/Components/Actors/DamageReceiverActorModule.cs @@ -18,6 +18,7 @@ public partial class DamageReceiverActorModule : ActorModule { _actor = actor; + HealthProvider.FillResource(); HealthProvider.ResourceDepleted += OnDeath; } @@ -61,6 +62,6 @@ public partial class DamageReceiverActorModule : ActorModule protected void OnDeath() { _actor.IsDestroyed = true; - GD.Print("Actor dead"); + _actor.TriggerDeath(); } } \ No newline at end of file diff --git a/Scripts/Components/Actors/DeathAnimationHandler.cs b/Scripts/Components/Actors/DeathAnimationHandler.cs new file mode 100644 index 00000000..8078ee8d --- /dev/null +++ b/Scripts/Components/Actors/DeathAnimationHandler.cs @@ -0,0 +1,65 @@ +using Cirno.Scripts.Resources; +using Godot; + +namespace Cirno.Scripts.Components.Actors; + +public partial class DeathAnimationHandler : ActorModule +{ + protected Actor _actor; + + [Export] public BulletResource ExplosionData { get; set; } + [Export] public PackedScene ExplosionParticles { get; set; } + [Export] public PackedScene DebrisScene { get; set; } + + public override void Init(Actor actor) + { + _actor = actor; + _actor.OnDeath += ParentOnOnDeath; + } + + protected virtual void ParentOnOnDeath() + { + CreateExplosion(); + CreateParticles(); + CreateDebris(); + + _actor.QueueFree(); + } + + public override void Update(double delta) + { + + } + + public override void PhysicsUpdate(double delta) + { + + } + + private void CreateExplosion() + { + if (ExplosionData == null) return; + + var explosion = _actor.CreateSibling(ExplosionData.BulletScene); + explosion.Speed = 0; + + explosion.Initialize(ExplosionData.MakeBullet(_actor.GlobalPosition), GameManager.Instance); + } + + private void CreateParticles() + { + if (ExplosionParticles == null) { + return; + } + var particle = _actor.CreateSibling(ExplosionParticles); + if (particle == null) return; + + particle.Emitting = true; + } + + private void CreateDebris() + { + if (DebrisScene == null) return; + _actor.CreateSibling(DebrisScene); + } +} \ No newline at end of file diff --git a/Scripts/Resources/Events/AlarmEnableEvent.cs b/Scripts/Resources/Events/AlarmEnableEvent.cs new file mode 100644 index 00000000..59848c74 --- /dev/null +++ b/Scripts/Resources/Events/AlarmEnableEvent.cs @@ -0,0 +1,32 @@ +using Godot; +using Godot.Collections; + +namespace Cirno.Scripts.Resources.Events; + +[GlobalClass] +public partial class AlarmEnableEvent : EventResource +{ + private bool _isComplete = false; + private AlarmManager _alarmManager; + + public override bool IsComplete() + { + return _isComplete; + } + + public override void Init(Node2D parent) + { + _alarmManager = parent.GetAlarmManager(); + } + + public override void Start(Node2D parent) + { + _alarmManager.SoundAlarm(parent.GlobalPosition); + _isComplete = true; + } + + public override void UpdateEvent(double delta) + { + + } +} \ No newline at end of file