Enemy alarm response

This commit is contained in:
Marco 2025-03-21 11:44:08 +01:00
commit dd3d427ac3
5 changed files with 89 additions and 10 deletions

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=21 format=3 uid="uid://clieeuln36a7a"]
[gd_scene load_steps=22 format=3 uid="uid://clieeuln36a7a"]
[ext_resource type="Script" uid="uid://dn6dbog1s2818" path="res://Scripts/Components/FSM/Enemy/EnemyStateMachine.cs" id="1_27djw"]
[ext_resource type="SpriteFrames" uid="uid://bcc5mlwwnkvri" path="res://Resources/Sprites/Fairy.tres" id="1_ho0th"]
@ -17,6 +17,7 @@
[ext_resource type="Script" uid="uid://ik7s65de723k" path="res://Scripts/Components/FSM/Enemy/NavigationMovementModule.cs" id="14_w08b8"]
[ext_resource type="PackedScene" uid="uid://cj63k0dmk7tl1" path="res://Scenes/Weapons/enemy_weapon_base.tscn" id="15_ydpwc"]
[ext_resource type="Resource" uid="uid://csdlihliv4cr8" path="res://Resources/Weapons/EnemyWeapon_simple.tres" id="16_pi7ab"]
[ext_resource type="Script" uid="uid://dhsqsajq537qn" path="res://Scripts/Components/FSM/Enemy/EnemyAlarmModule.cs" id="18_4n750"]
[sub_resource type="CircleShape2D" id="CircleShape2D_pnkma"]
@ -44,11 +45,12 @@ script = ExtResource("4_f112g")
DamageReceiver = NodePath("../../DamageReceiver")
StorageModule = NodePath("../../Storage")
[node name="Idle" type="Node2D" parent="StateMachine" node_paths=PackedStringArray("StorageModule", "PlayerDetection", "DamageReceiver")]
[node name="Idle" type="Node2D" parent="StateMachine" node_paths=PackedStringArray("StorageModule", "PlayerDetection", "DamageReceiver", "_moduleNodes")]
script = ExtResource("4_kjmts")
StorageModule = NodePath("../../Storage")
PlayerDetection = NodePath("../../PlayerDetection")
DamageReceiver = NodePath("../../DamageReceiver")
_moduleNodes = [NodePath("../../AlarmModule")]
[node name="Alert" type="Node2D" parent="StateMachine" node_paths=PackedStringArray("StorageModule", "PlayerDetection", "DamageReceiver", "NavigationModule")]
script = ExtResource("5_f112g")
@ -116,6 +118,10 @@ debug_path_custom_color = Color(1, 0, 0, 1)
[node name="EnemyWeapon" parent="." instance=ExtResource("15_ydpwc")]
WeaponData = ExtResource("16_pi7ab")
[node name="AlarmModule" type="Node2D" parent="." node_paths=PackedStringArray("PlayerDetection")]
script = ExtResource("18_4n750")
PlayerDetection = NodePath("../PlayerDetection")
[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="area_entered" from="DamageReceiver" to="DamageReceiver" method="_on_damage_hitbox_area_entered"]

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,64 @@
using Cirno.Scripts.Enums;
using Godot;
namespace Cirno.Scripts.Components.FSM.Enemy;
public partial class EnemyAlarmModule : ModuleBase<EnemyState, CharacterBody2D>
{
private IStateMachine<EnemyState, CharacterBody2D> _machine;
[Export]
public PlayerDetectionModule PlayerDetection { get; private set; }
private bool _enabled = false;
public override void EnterState(EnemyState state)
{
_enabled = true;
CallDeferred(MethodName.AssignAlarmManagerDeferred);
}
public override void ExitState(EnemyState state)
{
_enabled = false;
AlarmManager.Instance.AlarmEnabled -= InstanceOnAlarmEnabled;
}
private void AssignAlarmManagerDeferred()
{
AlarmManager.Instance.AlarmEnabled += InstanceOnAlarmEnabled;
}
public override void Init(IStateMachine<EnemyState, CharacterBody2D> machine)
{
_machine = machine;
// if (AlarmManager.Instance is not null)
// {
// AlarmManager.Instance.AlarmEnabled += InstanceOnAlarmEnabled;
// }
// else
// {
// GD.Print("Alarm Manager is null");
// }
}
private void InstanceOnAlarmEnabled(Vector2 location)
{
if (_enabled)
{
PlayerDetection.LastKnownPlayerPosition = location;
_machine.SetState(EnemyState.Alert);
}
}
public override void Process(double delta)
{
}
public override void PhysicsProcess(double delta)
{
}
}

View file

@ -0,0 +1 @@
uid://dhsqsajq537qn

View file

@ -15,7 +15,7 @@ public partial class PlayerDetectionModule : Area2D
[Export(PropertyHint.Layers2DPhysics)]
public uint ObstaclesCollisionMask { get; private set; }
public Vector2? LastKnownPlayerPosition { get; private set; }
public Vector2? LastKnownPlayerPosition { get; set; }
//public bool PlayerInActiveArea { get; private set; }
private CollisionShape2D _collisionShape2D;