diff --git a/Scenes/Actors/Generic_Enemy_FSM_3D.tscn b/Scenes/Actors/Generic_Enemy_FSM_3D.tscn index 361b5e62..bc44ff54 100644 --- a/Scenes/Actors/Generic_Enemy_FSM_3D.tscn +++ b/Scenes/Actors/Generic_Enemy_FSM_3D.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=25 format=3 uid="uid://bh3vxmqflijgj"] +[gd_scene load_steps=32 format=3 uid="uid://bh3vxmqflijgj"] [ext_resource type="Script" uid="uid://dwregubt4iila" path="res://Scripts/Components/FSM/Enemy/3D/EnemyProxy3D.cs" id="1_a3crc"] [ext_resource type="Resource" uid="uid://ccym6mcq4fbul" path="res://Resources/Enemies/Fairy_Guard_3D.tres" id="2_jgarc"] @@ -9,7 +9,12 @@ [ext_resource type="Script" uid="uid://crahxykgis2bp" path="res://Scripts/Components/FSM/Enemy/3D/Shooting.cs" id="7_rg1hb"] [ext_resource type="Script" uid="uid://3irm5sccr2fc" path="res://Scripts/Components/FSM/Enemy/3D/Dead.cs" id="8_5j04l"] [ext_resource type="Script" uid="uid://mpws3eyrmx0q" path="res://Scripts/Components/FSM/Enemy/3D/Controlled.cs" id="9_dm2sd"] +[ext_resource type="Shader" uid="uid://b8up3g1w7uqey" path="res://Shaders/Blink_3D.gdshader" id="10_2xi0r"] +[ext_resource type="Script" uid="uid://cq1joxgoj3jdp" path="res://Scripts/Components/Actors/3D/PlayerAnimationProvider3D.cs" id="10_5gcuf"] +[ext_resource type="Material" uid="uid://dsrsfpcpwmaql" path="res://Resources/Materials/Player_Blink_Teleport_Material_3D.tres" id="10_05pdu"] +[ext_resource type="Script" uid="uid://ts64slgd7twt" path="res://Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs" id="10_d6h7c"] [ext_resource type="SpriteFrames" uid="uid://ch2ll1on8im2p" path="res://Resources/Sprites/FairyGuard.tres" id="10_hew1j"] +[ext_resource type="Texture2D" uid="uid://xhwfgbv0fjbr" path="res://Sprites/Actors/FairyGuard.png" id="11_2xi0r"] [ext_resource type="Script" uid="uid://de31afbiua8xu" path="res://Scripts/Components/FSM/Enemy/3D/EnemyFSMAnimatedSprite3D.cs" id="11_jgarc"] [ext_resource type="Script" uid="uid://chq5a73kw0c0m" path="res://Scripts/Components/FSM/Enemy/3D/EnemyStorage3D.cs" id="11_xne4s"] [ext_resource type="Script" uid="uid://extjdng8nk6r" path="res://Scripts/Components/FSM/Enemy/3D/PlayerDetection3D.cs" id="13_rg1hb"] @@ -24,6 +29,20 @@ radius = 0.264547 height = 0.935884 +[sub_resource type="AtlasTexture" id="AtlasTexture_ad5n8"] +atlas = ExtResource("11_2xi0r") +region = Rect2(32, 0, 16, 16) + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_d6h7c"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("10_2xi0r") +shader_parameter/tex = SubResource("AtlasTexture_ad5n8") +shader_parameter/blink_color = Color(0.954799, 0.00675169, 0, 1) +shader_parameter/blink_intensity = 0.0 +shader_parameter/teleport_progress = 0.0 +shader_parameter/scanline_density = 0.0 + [sub_resource type="CylinderShape3D" id="CylinderShape3D_5j04l"] height = 1.91858 radius = 3.04834 @@ -54,17 +73,18 @@ shape = SubResource("CapsuleShape3D_jgarc") [node name="StateMachine" type="Node" parent="."] script = ExtResource("2_xne4s") -[node name="Init" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "DetectionProvider")] +[node name="Init" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "DetectionProvider", "_moduleNodes")] script = ExtResource("4_jgarc") Storage = NodePath("../../Storage") DetectionProvider = NodePath("../../PlayerDetectionProvider") +_moduleNodes = [NodePath("../../AnimationModule")] [node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "_moduleNodes")] script = ExtResource("5_rg1hb") Storage = NodePath("../../Storage") PlayerDetection = NodePath("../../PlayerDetectionProvider") DebugEnabled = true -_moduleNodes = [NodePath("../../DamageModule")] +_moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")] [node name="Alert" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "NavigationModule", "_moduleNodes")] script = ExtResource("6_jgarc") @@ -72,7 +92,7 @@ Storage = NodePath("../../Storage") PlayerDetection = NodePath("../../PlayerDetectionProvider") NavigationModule = NodePath("../../NavigationProvider") DebugEnabled = true -_moduleNodes = [NodePath("../../DamageModule")] +_moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")] [node name="Shooting" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage", "PlayerDetection", "EquippedWeapon", "NavigationModule", "_moduleNodes")] script = ExtResource("7_rg1hb") @@ -80,7 +100,7 @@ Storage = NodePath("../../Storage") PlayerDetection = NodePath("../../PlayerDetectionProvider") EquippedWeapon = NodePath("../../Weapon") NavigationModule = NodePath("../../NavigationProvider") -_moduleNodes = [NodePath("../../DamageModule")] +_moduleNodes = [NodePath("../../DamageModule"), NodePath("../../AnimationModule")] [node name="Dead" type="Node" parent="StateMachine" node_paths=PackedStringArray("Storage")] script = ExtResource("8_5j04l") @@ -91,14 +111,32 @@ script = ExtResource("9_dm2sd") Storage = NodePath("../../Storage") _moduleNodes = [NodePath("../../DamageModule")] -[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="." node_paths=PackedStringArray("EnemyProxy")] +[node name="AnimationModule" type="Node" parent="." node_paths=PackedStringArray("AnimationProvider", "Storage", "HealthProvider")] +script = ExtResource("10_d6h7c") +AnimationProvider = NodePath("../AnimationProvider") +Storage = NodePath("../Storage") +HealthProvider = NodePath("../DamageReceiver/HealthProvider") + +[node name="AnimationProvider" type="Node3D" parent="." node_paths=PackedStringArray("AnimatedSprite")] +script = ExtResource("10_5gcuf") +AnimatedSprite = NodePath("../AnimatedSprite3D") +WalkRightAnimationName = &"right" +WalkLeftAnimationName = &"left" +WalkDownAnimationName = &"down" +WalkUpAnimationName = &"up" +BlinkMaterial = ExtResource("10_05pdu") + +[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="."] +transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0) +material_override = SubResource("ShaderMaterial_d6h7c") pixel_size = 0.05 billboard = 1 texture_filter = 0 sprite_frames = ExtResource("10_hew1j") animation = &"down" +frame = 2 +frame_progress = 0.92087 script = ExtResource("11_jgarc") -EnemyProxy = NodePath("..") [node name="Storage" type="Node" parent="." node_paths=PackedStringArray("Root")] script = ExtResource("11_xne4s") @@ -125,10 +163,11 @@ debug_enabled = true [node name="Weapon" parent="." instance=ExtResource("15_27vgy")] -[node name="DamageModule" type="Node" parent="." node_paths=PackedStringArray("DamageReceiver", "StorageModule")] +[node name="DamageModule" type="Node" parent="." node_paths=PackedStringArray("DamageReceiver", "StorageModule", "AnimationProvider")] script = ExtResource("16_27vgy") DamageReceiver = NodePath("../DamageReceiver") StorageModule = NodePath("../Storage") +AnimationProvider = NodePath("../AnimationProvider") [node name="DamageReceiver" type="Area3D" parent="." node_paths=PackedStringArray("HealthProvider")] collision_layer = 64 diff --git a/Scenes/Actors/IsoPlayer_FSM.tscn b/Scenes/Actors/IsoPlayer_FSM.tscn index d4012b72..27260123 100644 --- a/Scenes/Actors/IsoPlayer_FSM.tscn +++ b/Scenes/Actors/IsoPlayer_FSM.tscn @@ -147,7 +147,7 @@ script = ExtResource("2_3oyrx") [node name="Active" type="Node" parent="StateMachine" node_paths=PackedStringArray("_inputProvider", "AnimationProvider", "Storage", "DamageReceiver", "_moduleNodes")] script = ExtResource("3_cc7e7") _inputProvider = NodePath("../../InputProvider") -AnimationProvider = NodePath("../../Sprites") +AnimationProvider = NodePath("../../AnimationProvider") Storage = NodePath("../../Storage") DamageReceiver = NodePath("../../DamageReceiver") _moduleNodes = [NodePath("../../InputProvider"), NodePath("../../MovementModule"), NodePath("../../ShadowModule"), NodePath("../../InteractionController"), NodePath("../../ActivationProvider"), NodePath("../../WeaponModule"), NodePath("../../AcidDeathModule")] @@ -155,29 +155,29 @@ _moduleNodes = [NodePath("../../InputProvider"), NodePath("../../MovementModule" [node name="Dead" type="Node" parent="StateMachine"] script = ExtResource("5_ok250") -[node name="Sprites" type="Node3D" parent="." node_paths=PackedStringArray("AnimatedSprite")] +[node name="AnimationProvider" type="Node3D" parent="." node_paths=PackedStringArray("AnimatedSprite")] script = ExtResource("6_onfm2") AnimatedSprite = NodePath("AnimatedSprite3D") BlinkMaterial = ExtResource("7_yarib") -[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="Sprites"] +[node name="AnimatedSprite3D" type="AnimatedSprite3D" parent="AnimationProvider"] transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0) material_override = ExtResource("7_yarib") pixel_size = 0.05 texture_filter = 0 sprite_frames = ExtResource("6_yq7h2") animation = &"idle" -frame_progress = 0.840695 +frame_progress = 0.1756 script = ExtResource("9_yarib") -[node name="Legs" type="AnimatedSprite3D" parent="Sprites"] +[node name="Legs" type="AnimatedSprite3D" parent="AnimationProvider"] pixel_size = 0.05 billboard = 1 texture_filter = 0 sprite_frames = ExtResource("7_l4f8l") animation = &"idle" -[node name="Sprite" type="Sprite3D" parent="Sprites"] +[node name="Sprite" type="Sprite3D" parent="AnimationProvider"] transform = Transform3D(0.707107, -0.5, 0.5, 0, 0.707107, 0.707107, -0.707107, -0.5, 0.5, 0, 0, 0) visible = false pixel_size = 0.05 diff --git a/Scripts/Components/Actors/3D/AnimatedShaderSprite3D.cs b/Scripts/Components/Actors/3D/AnimatedShaderSprite3D.cs index 967bbfe5..8e75574a 100644 --- a/Scripts/Components/Actors/3D/AnimatedShaderSprite3D.cs +++ b/Scripts/Components/Actors/3D/AnimatedShaderSprite3D.cs @@ -27,7 +27,7 @@ public partial class AnimatedShaderSprite3D : AnimatedSprite3D FrameChanged += HandleFrameChanged; } - private void HandleFrameChanged() + protected void HandleFrameChanged() { _shaderMaterial.SetShaderParameter("tex", SpriteFrames.GetFrameTexture(Animation, Frame)); } diff --git a/Scripts/Components/Actors/3D/PlayerAnimationProvider3D.cs b/Scripts/Components/Actors/3D/PlayerAnimationProvider3D.cs index ba15a298..3e799d43 100644 --- a/Scripts/Components/Actors/3D/PlayerAnimationProvider3D.cs +++ b/Scripts/Components/Actors/3D/PlayerAnimationProvider3D.cs @@ -116,8 +116,12 @@ public partial class PlayerAnimationProvider3D : Node3D public void Blink() { - if (BlinkMaterial == null) return; - AnimatedSprite.MaterialOverride = BlinkMaterial; + if (AnimatedSprite.MaterialOverride is null) + { + return; + } + //if (BlinkMaterial == null) return; + //AnimatedSprite.MaterialOverride = BlinkMaterial; var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride); @@ -133,8 +137,12 @@ public partial class PlayerAnimationProvider3D : Node3D public void PlayTeleportAnimation() { - if (BlinkMaterial == null) return; - AnimatedSprite.MaterialOverride = BlinkMaterial; + if (AnimatedSprite.MaterialOverride is null) + { + return; + } + //if (BlinkMaterial == null) return; + //AnimatedSprite.MaterialOverride = BlinkMaterial; var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride); _blinkTween?.Kill(); _blinkTween = GTweenSequenceBuilder.New() @@ -149,8 +157,12 @@ public partial class PlayerAnimationProvider3D : Node3D public void PlayUnteleportAnimation() { - if (BlinkMaterial == null) return; - AnimatedSprite.MaterialOverride = BlinkMaterial; + if (AnimatedSprite.MaterialOverride is null) + { + return; + } + //if (BlinkMaterial == null) return; + //AnimatedSprite.MaterialOverride = BlinkMaterial; var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride); _blinkTween?.Kill(); _blinkTween = GTweenSequenceBuilder.New() diff --git a/Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs b/Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs new file mode 100644 index 00000000..8433c910 --- /dev/null +++ b/Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs @@ -0,0 +1,61 @@ +using Cirno.Scripts.Components.Actors; +using Cirno.Scripts.Components.Actors._3D; +using Cirno.Scripts.Enums; +using Godot; + +namespace Cirno.Scripts.Components.FSM.Enemy._3D; + +public partial class EnemyAnimationModule3D : ModuleBase +{ + private IStateMachine _machine; + + [Export] public PlayerAnimationProvider3D AnimationProvider { get; private set; } + + [Export] public EnemyStorage3D Storage { get; private set; } + + [Export] public ActorResourceProvider HealthProvider { get; private set; } + + public override void EnterState(EnemyState state) + { + AnimationProvider.SetAnimation(Storage.AimingDirection); + AnimationProvider.SetAnimation(Vector2.Zero); + if (HealthProvider is not null) + { + HealthProvider.ResourceDecreased += HealthProviderOnResourceDecreased; + } + } + + private void HealthProviderOnResourceDecreased(float oldValue, float newValue, float maxValue) + { + AnimationProvider?.Blink(); + } + + public override void ExitState(EnemyState state) + { + AnimationProvider.SetAnimation(Vector2.Zero); + if (HealthProvider is not null) + { + HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased; + } + } + + public override void Init(IStateMachine machine) + { + _machine = machine; + } + + public override void Process(double delta) + { + AnimationProvider.SetAnimation(Storage.AimingDirection); + + if (_machine.MainObject.Velocity == Vector3.Zero) + { + AnimationProvider.SetAnimation(Vector2.Zero); + } + } + + public override void PhysicsProcess(double delta) + { + + } +} \ No newline at end of file diff --git a/Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs.uid b/Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs.uid new file mode 100644 index 00000000..f4e52fb4 --- /dev/null +++ b/Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs.uid @@ -0,0 +1 @@ +uid://ts64slgd7twt diff --git a/Scripts/Components/FSM/Enemy/3D/EnemyDamageModule3D.cs b/Scripts/Components/FSM/Enemy/3D/EnemyDamageModule3D.cs index ae6879bf..ef8dcd6f 100644 --- a/Scripts/Components/FSM/Enemy/3D/EnemyDamageModule3D.cs +++ b/Scripts/Components/FSM/Enemy/3D/EnemyDamageModule3D.cs @@ -1,4 +1,5 @@ using Cirno.Scripts.Components.Actors; +using Cirno.Scripts.Components.Actors._3D; using Cirno.Scripts.Enums; using Godot; @@ -8,6 +9,8 @@ public partial class EnemyDamageModule3D : ModuleBase _machine; public override void EnterState(EnemyState state) @@ -15,14 +18,14 @@ public partial class EnemyDamageModule3D : ModuleBase(); + this.SpriteFrames = enemyProxy.EnemyResource.AnimationFrames; + + HandleFrameChanged(); + } } private void EnemyFsmProxyOnInitialized(EnemyResource resource) { + if (Engine.IsEditorHint()) return; this.SpriteFrames = resource.AnimationFrames; } } \ No newline at end of file diff --git a/Scripts/Components/FSM/IStateMachine.cs b/Scripts/Components/FSM/IStateMachine.cs index 47aab622..d850364e 100644 --- a/Scripts/Components/FSM/IStateMachine.cs +++ b/Scripts/Components/FSM/IStateMachine.cs @@ -12,6 +12,7 @@ public interface IStateMachine public IState CurrentState { get; } public TKey InitialState { get; } public void SetState(TKey stateId); + public TKey GetState(); public TType MainObject { get; } } \ No newline at end of file diff --git a/Scripts/Components/FSM/IsoStateMachineBase.cs b/Scripts/Components/FSM/IsoStateMachineBase.cs index 42c080bd..b4519ffc 100644 --- a/Scripts/Components/FSM/IsoStateMachineBase.cs +++ b/Scripts/Components/FSM/IsoStateMachineBase.cs @@ -30,7 +30,12 @@ public abstract partial class IsoStateMachineBase : Node, IStateMac } SetState(InitialState); } - + + public TKey GetState() + { + return CurrentState.StateId; + } + public void SetState(TKey stateId) { if (CurrentStateIndex is not null) diff --git a/Scripts/Components/FSM/StateMachineBase.cs b/Scripts/Components/FSM/StateMachineBase.cs index d2d03bd8..0601fead 100644 --- a/Scripts/Components/FSM/StateMachineBase.cs +++ b/Scripts/Components/FSM/StateMachineBase.cs @@ -31,6 +31,11 @@ public abstract partial class StateMachineBase : Node, IStateMachin SetState(InitialState); } + public TKey GetState() + { + return CurrentState.StateId; + } + public void SetState(TKey stateId) { if (CurrentStateIndex is not null)