Death animations and spawner

This commit is contained in:
Marco 2025-02-23 19:19:12 +01:00
commit 16b7d936c9
13 changed files with 286 additions and 11 deletions

View file

@ -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"]

View file

@ -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"]

View file

@ -115,6 +115,7 @@ public partial class Barrel : Area2D, IDestructible
private void CreateDebris()
{
if (DebrisScene == null) return;
this.CreateSibling<Barrel>(DebrisScene);
}

View file

@ -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")

View file

@ -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)

View file

@ -131,8 +131,8 @@ public partial class Teleporter : Activable
await TweenPlayer(player);
_particles.Emitting = true;
//_particles.Emitting = true;
FireParticles();
await player.Teleport();

View file

@ -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<Actor>(ActorPrefab);
}
public void Activate(ActivationType activationType = ActivationType.Toggle)
{
if (!WaitForActorDeath)
{
Spawn();
}
else if (SpawnedActor == null)
{
Spawn();
}
}
}

View file

@ -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();
}
}

View file

@ -15,6 +15,9 @@ public partial class Actor : CharacterBody2D
private GameManager _gameManager;
private List<ActorModule> _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);
}
}

View file

@ -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;

View file

@ -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();
}
}

View file

@ -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<Bullet>(ExplosionData.BulletScene);
explosion.Speed = 0;
explosion.Initialize(ExplosionData.MakeBullet(_actor.GlobalPosition), GameManager.Instance);
}
private void CreateParticles()
{
if (ExplosionParticles == null) {
return;
}
var particle = _actor.CreateSibling<GpuParticles2D>(ExplosionParticles);
if (particle == null) return;
particle.Emitting = true;
}
private void CreateDebris()
{
if (DebrisScene == null) return;
_actor.CreateSibling<Barrel>(DebrisScene);
}
}

View file

@ -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)
{
}
}