diff --git a/Zennysoft.Game.Ma/src/enemy/Enemy.cs b/Zennysoft.Game.Ma/src/enemy/Enemy.cs index cb22d6a4..e5119a0b 100644 --- a/Zennysoft.Game.Ma/src/enemy/Enemy.cs +++ b/Zennysoft.Game.Ma/src/enemy/Enemy.cs @@ -65,18 +65,19 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide { if (!_activated) + { Activate(); - _activated = true; + _activated = true; + + if (this is IHaveFollowBehavior) + _enemyLogic.Input(new EnemyLogic.Input.Follow()); + } }) .Handle((in EnemyLogic.Output.Idle _) => { @@ -99,7 +100,6 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide EnemyModelView.PlayPrimaryAttackAnimation(); + protected void EngagePlayerBehavior_TakeAction() => PerformAction(); protected void EngagePlayerBehavior_AcquireTarget() => LookAt(new Vector3(_player.GlobalPosition.X, GlobalPosition.Y, _player.GlobalPosition.Z), Vector3.Up, true); diff --git a/Zennysoft.Game.Ma/src/enemy/EnemyModelView.cs b/Zennysoft.Game.Ma/src/enemy/EnemyModelView.cs index 8993c2f4..30edd3a4 100644 --- a/Zennysoft.Game.Ma/src/enemy/EnemyModelView.cs +++ b/Zennysoft.Game.Ma/src/enemy/EnemyModelView.cs @@ -15,6 +15,7 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView private readonly string _stopWalkName = "Stop Walk"; private readonly string _primaryAttackName = "Primary Attack"; private readonly string _secondaryAttackName = "Secondary Attack"; + private readonly string _primarySkillName = "Primary Skill"; private readonly string _activateName = "Activate"; private readonly string _activateFront = "activate"; private readonly string _activateLeft = "activate_left"; @@ -32,6 +33,8 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView public event EventHandler ActivationFinished; + public event EventHandler TeleportAnimationFinished; + [Export] public bool CanMove { get; set; } = false; @@ -45,7 +48,7 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView public virtual void PlaySecondaryAttackAnimation() => _stateMachine.Travel(_secondaryAttackName); - public virtual void PlayPrimarySkillAnimation() => _stateMachine.Travel("Primary Skill"); + public virtual void PlayPrimarySkillAnimation() => _stateMachine.Travel(_primarySkillName); public virtual void PlayIdleAnimation() => _stateMachine.Travel(_idleName); @@ -65,6 +68,8 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView { if (animName == _activateFront || animName == _activateLeft || animName == _activateRight || animName == _activateBack) ActivationFinished?.Invoke(this, EventArgs.Empty); + if (animName == "teleport") + TeleportAnimationFinished?.Invoke(this, EventArgs.Empty); } diff --git a/Zennysoft.Game.Ma/src/enemy/IEnemyModelView.cs b/Zennysoft.Game.Ma/src/enemy/IEnemyModelView.cs index 4300ad34..a82dd338 100644 --- a/Zennysoft.Game.Ma/src/enemy/IEnemyModelView.cs +++ b/Zennysoft.Game.Ma/src/enemy/IEnemyModelView.cs @@ -26,4 +26,6 @@ public interface IEnemyModelView : INode3D public event EventHandler HitPlayer; public event EventHandler ActivationFinished; + + public event EventHandler TeleportAnimationFinished; } diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.cs index a53d6da8..1ad69394 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.cs @@ -25,12 +25,16 @@ public partial class Sproingy : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerB FollowBehavior.OnVelocityComputed += OnVelocityComputed; EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; - _enemyLogic.Input(new EnemyLogic.Input.Patrol()); PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + public void OnResolved() + { + _enemyLogic.Input(new EnemyLogic.Input.Patrol()); + } + public override void _ExitTree() { PatrolBehavior.OnVelocityComputed -= OnVelocityComputed; diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn index c8b0e2c3..10648cd9 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn @@ -26,6 +26,7 @@ material = SubResource("StandardMaterial3D_p4gkk") top_radius = 0.0 [sub_resource type="CylinderShape3D" id="CylinderShape3D_drfkj"] +radius = 1.0 [node name="Sproingy" type="CharacterBody3D"] process_mode = 1 @@ -81,8 +82,6 @@ shape = SubResource("CylinderShape3D_drfkj") [node name="EnemyModelView" parent="Visual" instance=ExtResource("4_o3b7p")] unique_name_in_owner = true -_upperThreshold = 0.5 -_lowerThreshold = -0.5 [node name="Components" type="Node3D" parent="."] diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/02. michael/Michael.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/02. michael/Michael.cs index 45e50d73..06670a51 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/02. michael/Michael.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/02. michael/Michael.cs @@ -25,9 +25,13 @@ public partial class Michael : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBe FollowBehavior.OnVelocityComputed += OnVelocityComputed; EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; - _enemyLogic.Input(new EnemyLogic.Input.Patrol()); PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + + public void OnResolved() + { + _enemyLogic.Input(new EnemyLogic.Input.Patrol()); + } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs index e38dc8f4..e0661571 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; namespace Zennysoft.Game.Ma; @@ -9,6 +11,10 @@ public partial class FilthEater : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; [Node] public FollowBehavior FollowBehavior { get; set; } = default!; @@ -25,13 +31,23 @@ public partial class FilthEater : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye FollowBehavior.OnVelocityComputed += OnVelocityComputed; EngagePlayerBehavior.TakeAction += PerformAction; EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; - _enemyLogic.Input(new EnemyLogic.Input.Patrol()); PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } - public override void PerformAction() => EnemyModelView.PlaySecondaryAttackAnimation(); + public void OnResolved() + { + _enemyLogic.Input(new EnemyLogic.Input.Patrol()); + } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } public override void _ExitTree() { diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.tscn index 37ce1c30..cebc58d3 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEater.tscn @@ -25,7 +25,7 @@ metadata/_custom_type_script = ExtResource("4_5eid5") [sub_resource type="CylinderShape3D" id="CylinderShape3D_qbmfg"] height = 1.5 -radius = 3.0 +radius = 2.0 [node name="FilthEater" type="CharacterBody3D"] process_mode = 1 diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEaterModelView.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEaterModelView.tscn index 05dc9315..0c880a9d 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEaterModelView.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/03. filth_eater/FilthEaterModelView.tscn @@ -2658,45 +2658,6 @@ animations = [{ [sub_resource type="SphereShape3D" id="SphereShape3D_kct8n"] -[sub_resource type="Animation" id="Animation_8qeb2"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("..:position") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Vector3(0, 0, 0)] -} -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("../ProjectileHitbox:monitoring") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} -tracks/2/type = "value" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath(".:visible") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} - [sub_resource type="Animation" id="Animation_xrn7e"] resource_name = "fire" tracks/0/type = "value" @@ -2751,6 +2712,45 @@ tracks/3/keys = { "values": [false, true, false] } +[sub_resource type="Animation" id="Animation_8qeb2"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("..:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(0, 0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("../ProjectileHitbox:monitoring") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath(".:visible") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + [sub_resource type="AnimationLibrary" id="AnimationLibrary_q8n6h"] _data = { &"Fire": SubResource("Animation_xrn7e"), diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/04. sara/Sara.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/04. sara/Sara.cs index 9f8f2f0a..ec8dfed8 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/04. sara/Sara.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/04. sara/Sara.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] @@ -8,6 +10,10 @@ public partial class Sara : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBehav { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; [Node] public FollowBehavior FollowBehavior { get; set; } = default!; @@ -24,9 +30,21 @@ public partial class Sara : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBehav FollowBehavior.OnVelocityComputed += OnVelocityComputed; EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; - _enemyLogic.Input(new EnemyLogic.Input.Patrol()); PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + + public void OnResolved() + { + _enemyLogic.Input(new EnemyLogic.Input.Patrol()); + } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } } diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/05. ballos/Ballos.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/05. ballos/Ballos.cs index d42fff06..79d0be0a 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/05. ballos/Ballos.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/05. ballos/Ballos.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] @@ -8,6 +10,10 @@ public partial class Ballos : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBeh { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; [Node] public FollowBehavior FollowBehavior { get; set; } = default!; @@ -24,9 +30,21 @@ public partial class Ballos : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBeh FollowBehavior.OnVelocityComputed += OnVelocityComputed; EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; - _enemyLogic.Input(new EnemyLogic.Input.Patrol()); PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + + public void OnResolved() + { + _enemyLogic.Input(new EnemyLogic.Input.Patrol()); + } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/06. chariot/Chariot.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/06. chariot/Chariot.cs index 56ba728a..a326ecac 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/06. chariot/Chariot.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/06. chariot/Chariot.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] @@ -8,6 +10,10 @@ public partial class Chariot : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBe { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; [Node] public FollowBehavior FollowBehavior { get; set; } = default!; @@ -30,8 +36,21 @@ public partial class Chariot : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBe SetPhysicsProcess(true); } + public void OnResolved() + { + _enemyLogic.Input(new EnemyLogic.Input.Patrol()); + } + public override void Activate() { EnemyModelView.PlayActivateAnimation(); } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.cs index 6153122a..6122366d 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] @@ -8,46 +10,62 @@ public partial class Chinthe : Enemy2D, IHaveEngagePlayerBehavior, IHaveFollowBe { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.9f; + + [Export] private float PrimarySkillChance { get; set; } = 0.1f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } + [Node] public FollowBehavior FollowBehavior { get; set; } = default!; + [Node] public EngagePlayerBehavior EngagePlayerBehavior { get; set; } = default!; [Node] public Area3D PlayerDetector { get; set; } = default!; public void OnReady() { - EnemyModelView.ActivationFinished += EnemyModelView_ActivationFinished; - SetPhysicsProcess(true); + EnemyModelView.ActivationFinished += EnemyModelView_ActivationFinished; + EnemyModelView.TeleportAnimationFinished += Teleport; + SetPhysicsProcess(true); } - private void EnemyModelView_ActivationFinished(object sender, System.EventArgs e) + public override void PerformAction() { - FollowBehavior.Init(NavigationAgent); - FollowBehavior.OnVelocityComputed += OnChintheVelocityComputed; - EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; - EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; - PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; - PlayerDetector.BodyExited += PlayerDetector_BodyExited; - _enemyLogic.Input(new EnemyLogic.Input.Follow()); - _enemyLogic.Input(new EnemyLogic.Input.Move()); + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlayPrimarySkillAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, PrimarySkillChance]); + options[(int)selection].Invoke(); + } + + private void EnemyModelView_ActivationFinished(object sender, EventArgs e) + { + FollowBehavior.Init(NavigationAgent); + FollowBehavior.OnVelocityComputed += OnChintheVelocityComputed; + EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; + EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; + PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; + PlayerDetector.BodyExited += PlayerDetector_BodyExited; + _enemyLogic.Input(new EnemyLogic.Input.Follow()); + _enemyLogic.Input(new EnemyLogic.Input.Move()); } public override void Activate() { - EnemyModelView.PlayActivateAnimation(); + EnemyModelView.PlayActivateAnimation(); } - public override void Idle() + private void Teleport(object sender, EventArgs e) { - EnemyModelView.PlayIdleAnimation(); - EnemyModelView.PlayIdleAnimation(); + var targetPosition = _player.GlobalBasis.Z; + var currentDirection = GlobalBasis.Z; + GlobalPosition = GlobalPosition + new Vector3(0, 0, 5 * targetPosition.Z); } public void OnChintheVelocityComputed(Vector3 safeVelocity) { - Velocity = safeVelocity; - LookAtTarget(safeVelocity); - if (((EnemyModelView)EnemyModelView).CanMove) - MoveAndSlide(); + Velocity = safeVelocity; + LookAtTarget(safeVelocity); + if (((EnemyModelView)EnemyModelView).CanMove) + MoveAndSlide(); } -} +} \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn index 1858655a..08929810 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/Chinthe.tscn @@ -24,7 +24,7 @@ metadata/_custom_type_script = "uid://dlsgyx4i1jmp3" radius = 1.20703 [sub_resource type="CylinderShape3D" id="CylinderShape3D_q6h01"] -radius = 1.26172 +radius = 1.6 [node name="Chinthe" type="CharacterBody3D"] process_mode = 1 @@ -35,6 +35,7 @@ axis_lock_angular_x = true axis_lock_angular_z = true motion_mode = 1 script = ExtResource("1_120m2") +PrimaryAttackChance = 0.9 [node name="CollisionShape" type="CollisionShape3D" parent="."] unique_name_in_owner = true diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/ChintheModelView.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/ChintheModelView.tscn index 3b00a4fd..52d93c5e 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/ChintheModelView.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/07. chinthe/ChintheModelView.tscn @@ -2,6 +2,7 @@ [ext_resource type="Script" uid="uid://cvr1qimxpignl" path="res://src/enemy/EnemyModelView2D.cs" id="1_6dej3"] [ext_resource type="Texture2D" uid="uid://dnd6d5cx7x7i8" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0400.png" id="2_3sdh3"] +[ext_resource type="Script" uid="uid://ctshiyffvt4y5" path="res://src/system/AttackDataResource.cs" id="2_keq07"] [ext_resource type="Texture2D" uid="uid://c0unwba144tls" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0402.png" id="3_dbwem"] [ext_resource type="Texture2D" uid="uid://ca1im2so1vkym" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0404.png" id="4_y7pe6"] [ext_resource type="Texture2D" uid="uid://cgnm3v0t63aiw" path="res://src/enemy/enemy_types/07. chinthe/animations/CHINTHE - RERENDER/BACK/0406.png" id="5_xu4hf"] @@ -400,6 +401,12 @@ [ext_resource type="AnimationNodeStateMachine" uid="uid://cy2ngl55c0rws" path="res://src/enemy/animation_state_machines/WalkingStateMachine.tres" id="395_jbhro"] [ext_resource type="Texture2D" uid="uid://c7pf2dib2ilhs" path="res://src/vfx/Enemy/CHINTHE_BLAST.png" id="395_ymova"] +[sub_resource type="Resource" id="Resource_w4c47"] +script = ExtResource("2_keq07") +Damage = 10 +ElementType = 0 +metadata/_custom_type_script = "uid://ctshiyffvt4y5" + [sub_resource type="ViewportTexture" id="ViewportTexture_h1kaf"] viewport_path = NodePath("Sprite3D/SubViewportContainer/SubViewport") @@ -3292,7 +3299,7 @@ _data = { &"teleport in": SubResource("Animation_3sdh3") } -[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_op3hf"] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_sgkk0"] animation = &"teleport" [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_jbhro"] @@ -3386,6 +3393,9 @@ states/stop_walk_front/node = SubResource("AnimationNodeAnimation_5lbxl") states/stop_walk_front/position = Vector2(516, 72) transitions = ["Start", "stop_walk_front", SubResource("AnimationNodeStateMachineTransition_yu6fp"), "stop_walk_front", "stop_left_walk", SubResource("AnimationNodeStateMachineTransition_djlpo"), "stop_left_walk", "stop_walk_front", SubResource("AnimationNodeStateMachineTransition_t2war"), "stop_walk_front", "stop_back_walk", SubResource("AnimationNodeStateMachineTransition_b16jm"), "stop_back_walk", "stop_walk_front", SubResource("AnimationNodeStateMachineTransition_d1ogr"), "stop_walk_front", "stop_right_walk", SubResource("AnimationNodeStateMachineTransition_7dl50"), "stop_right_walk", "stop_walk_front", SubResource("AnimationNodeStateMachineTransition_y2ova"), "stop_back_walk", "stop_right_walk", SubResource("AnimationNodeStateMachineTransition_8vs7h"), "stop_right_walk", "stop_back_walk", SubResource("AnimationNodeStateMachineTransition_rgja2"), "stop_back_walk", "stop_left_walk", SubResource("AnimationNodeStateMachineTransition_syao6"), "stop_left_walk", "stop_back_walk", SubResource("AnimationNodeStateMachineTransition_3iqav"), "stop_left_walk", "stop_right_walk", SubResource("AnimationNodeStateMachineTransition_ii52r"), "stop_right_walk", "stop_left_walk", SubResource("AnimationNodeStateMachineTransition_v8fg0"), "stop_right_walk", "End", SubResource("AnimationNodeStateMachineTransition_r44fx"), "stop_walk_front", "End", SubResource("AnimationNodeStateMachineTransition_dhuhq"), "stop_back_walk", "End", SubResource("AnimationNodeStateMachineTransition_y4bdd"), "stop_left_walk", "End", SubResource("AnimationNodeStateMachineTransition_syb4h")] +[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_li182"] +animation = &"teleport in" + [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_umemc"] advance_mode = 2 @@ -3395,12 +3405,6 @@ advance_mode = 2 switch_mode = 2 advance_mode = 2 -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_gr3tp"] - -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_ixs6i"] -switch_mode = 2 -advance_mode = 2 - [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_jbhro"] [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_keq07"] @@ -3411,8 +3415,6 @@ advance_mode = 2 [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_li182"] -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_sgkk0"] - [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_8u7he"] reset = false switch_mode = 1 @@ -3421,6 +3423,16 @@ switch_mode = 1 switch_mode = 2 advance_mode = 2 +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_manul"] + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_auprl"] +switch_mode = 2 +advance_mode = 2 + +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_i5vf2"] +switch_mode = 2 +advance_mode = 2 + [sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_nvqie"] states/Activate/node = ExtResource("243_5jjkq") states/Activate/position = Vector2(583, 100) @@ -3428,17 +3440,19 @@ states/Idle/node = ExtResource("244_2oumr") states/Idle/position = Vector2(348, 285) "states/Primary Attack/node" = ExtResource("394_ldtka") "states/Primary Attack/position" = Vector2(623.437, 285) -"states/Secondary Attack/node" = SubResource("AnimationNodeAnimation_op3hf") -"states/Secondary Attack/position" = Vector2(583, 404) +"states/Primary Skill/node" = SubResource("AnimationNodeAnimation_sgkk0") +"states/Primary Skill/position" = Vector2(82.437, 193.144) states/Start/position = Vector2(199, 100) "states/Stop Walk/node" = SubResource("AnimationNodeStateMachine_8u7he") "states/Stop Walk/position" = Vector2(132.437, 323.65) +"states/Teleport In/node" = SubResource("AnimationNodeAnimation_li182") +"states/Teleport In/position" = Vector2(-67.563, 254.144) "states/Unactivated Idle/node" = ExtResource("245_gr3tp") "states/Unactivated Idle/position" = Vector2(357, 100) states/Walking/node = ExtResource("395_jbhro") states/Walking/position = Vector2(348, 398.498) -transitions = ["Start", "Unactivated Idle", SubResource("AnimationNodeStateMachineTransition_umemc"), "Unactivated Idle", "Activate", SubResource("AnimationNodeStateMachineTransition_t3xhd"), "Activate", "Idle", SubResource("AnimationNodeStateMachineTransition_5jjkq"), "Idle", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_gr3tp"), "Secondary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_ixs6i"), "Idle", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_jbhro"), "Primary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_keq07"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_w4c47"), "Walking", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_li182"), "Walking", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_sgkk0"), "Walking", "Stop Walk", SubResource("AnimationNodeStateMachineTransition_8u7he"), "Stop Walk", "Idle", SubResource("AnimationNodeStateMachineTransition_8e7of")] -graph_offset = Vector2(-196.563, 209.65) +transitions = ["Start", "Unactivated Idle", SubResource("AnimationNodeStateMachineTransition_umemc"), "Unactivated Idle", "Activate", SubResource("AnimationNodeStateMachineTransition_t3xhd"), "Activate", "Idle", SubResource("AnimationNodeStateMachineTransition_5jjkq"), "Idle", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_jbhro"), "Primary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_keq07"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_w4c47"), "Walking", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_li182"), "Walking", "Stop Walk", SubResource("AnimationNodeStateMachineTransition_8u7he"), "Stop Walk", "Idle", SubResource("AnimationNodeStateMachineTransition_8e7of"), "Idle", "Primary Skill", SubResource("AnimationNodeStateMachineTransition_manul"), "Primary Skill", "Teleport In", SubResource("AnimationNodeStateMachineTransition_auprl"), "Teleport In", "Idle", SubResource("AnimationNodeStateMachineTransition_i5vf2")] +graph_offset = Vector2(-196.563, 38.1444) [sub_resource type="AtlasTexture" id="AtlasTexture_tawq7"] atlas = ExtResource("395_ymova") @@ -3701,6 +3715,7 @@ rings = 8 [node name="EnemyModelView" type="Node3D"] script = ExtResource("1_6dej3") +AttackData = SubResource("Resource_w4c47") [node name="Sprite3D" type="Sprite3D" parent="."] transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0, 0) diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/08a. Ambassador/Ambassador.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/08a. Ambassador/Ambassador.cs index 349d3b75..3b6f456c 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/08a. Ambassador/Ambassador.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/08a. Ambassador/Ambassador.cs @@ -1,12 +1,17 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] public partial class Ambassador : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBehavior, IHaveFollowBehavior { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; @@ -29,4 +34,12 @@ public partial class Ambassador : Enemy2D, IHavePatrolBehavior, IHaveEngagePlaye PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/09. Agni/AgniDemon.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/09. Agni/AgniDemon.cs index 53aa0fe7..f90ae323 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/09. Agni/AgniDemon.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/09. Agni/AgniDemon.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] @@ -8,6 +10,10 @@ public partial class AgniDemon : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayer { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; [Node] public FollowBehavior FollowBehavior { get; set; } = default!; @@ -29,4 +35,12 @@ public partial class AgniDemon : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayer PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/Palan.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/Palan.cs index 8e116aa4..b6d2f3f6 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/Palan.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/Palan.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] @@ -8,6 +10,10 @@ public partial class Palan : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBeha { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; [Node] public FollowBehavior FollowBehavior { get; set; } = default!; @@ -29,4 +35,12 @@ public partial class Palan : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBeha PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/PalanModelView.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/PalanModelView.tscn index 6eb91cd5..affb78bc 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/PalanModelView.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/11. Palan/PalanModelView.tscn @@ -1608,20 +1608,20 @@ states/Walking/position = Vector2(705, 100) transitions = ["Start", "Idle", SubResource("AnimationNodeStateMachineTransition_0yqqu"), "Primary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_r6aec"), "Secondary Attack", "Idle", SubResource("AnimationNodeStateMachineTransition_lid5r"), "Idle", "Walking", SubResource("AnimationNodeStateMachineTransition_au0i1"), "Walking", "Idle", SubResource("AnimationNodeStateMachineTransition_jbc40"), "Idle", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_0qt6f"), "Idle", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_2bn25"), "Walking", "Secondary Attack", SubResource("AnimationNodeStateMachineTransition_h2ml5"), "Walking", "Primary Attack", SubResource("AnimationNodeStateMachineTransition_uma8i")] graph_offset = Vector2(-15, 35) -[sub_resource type="Animation" id="Animation_0qt6f"] -resource_name = "Sunblast" -length = 0.500003 +[sub_resource type="Animation" id="Animation_h2ml5"] +resource_name = "Primary Attack" +length = 1.03334 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath(".:frame") +tracks/0/path = NodePath("../Primary Attack:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 0.5), +"times": PackedFloat32Array(0, 1), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [0, 15] +"values": [0, 57] } [sub_resource type="Animation" id="Animation_2bn25"] @@ -1651,20 +1651,20 @@ tracks/1/keys = { "values": [14] } -[sub_resource type="Animation" id="Animation_h2ml5"] -resource_name = "Primary Attack" -length = 1.03334 +[sub_resource type="Animation" id="Animation_0qt6f"] +resource_name = "Sunblast" +length = 0.500003 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("../Primary Attack:frame") +tracks/0/path = NodePath(".:frame") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { -"times": PackedFloat32Array(0, 1), +"times": PackedFloat32Array(0, 0.5), "transitions": PackedFloat32Array(1, 1), "update": 0, -"values": [0, 57] +"values": [0, 15] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_uma8i"] diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/12. Shield of Heaven/ShieldModelView.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/12. Shield of Heaven/ShieldModelView.tscn index 61cab783..88ec5257 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/12. Shield of Heaven/ShieldModelView.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/12. Shield of Heaven/ShieldModelView.tscn @@ -3004,7 +3004,7 @@ tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), "update": 1, -"values": [23] +"values": [0] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_yuosm"] @@ -3294,7 +3294,6 @@ modulate = Color(1, 1, 1, 0.788235) billboard = 1 texture_filter = 0 sprite_frames = SubResource("SpriteFrames_ie7uh") -frame = 23 [node name="Attack 2 VFX" type="AnimatedSprite3D" parent="VFX Animation Player"] sprite_frames = SubResource("SpriteFrames_lgwan") diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/9b. Aqueos Demon/AqueosDemon.cs b/Zennysoft.Game.Ma/src/enemy/enemy_types/9b. Aqueos Demon/AqueosDemon.cs index 3c312226..ecd80237 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/9b. Aqueos Demon/AqueosDemon.cs +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/9b. Aqueos Demon/AqueosDemon.cs @@ -1,6 +1,8 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; +using System; +using System.Collections.Generic; using Zennysoft.Game.Ma; [Meta(typeof(IAutoNode))] @@ -8,6 +10,10 @@ public partial class AqueousDemon : Enemy2D, IHavePatrolBehavior, IHaveEngagePla { public override void _Notification(int what) => this.Notify(what); + [Export] private float PrimaryAttackChance { get; set; } = 0.75f; + + [Export] private float SecondaryAttackChance { get; set; } = 0.25f; + [Node] public NavigationAgent3D NavigationAgent { get; set; } [Node] public PatrolBehavior PatrolBehavior { get; set; } = default!; [Node] public FollowBehavior FollowBehavior { get; set; } = default!; @@ -29,4 +35,12 @@ public partial class AqueousDemon : Enemy2D, IHavePatrolBehavior, IHaveEngagePla PlayerDetector.BodyExited += PlayerDetector_BodyExited; SetPhysicsProcess(true); } + + public override void PerformAction() + { + var rng = new RandomNumberGenerator(); + var options = new List() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation }; + var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]); + options[(int)selection].Invoke(); + } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Activated.cs b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Activated.cs index b6154731..8f7b3be3 100644 --- a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Activated.cs +++ b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Activated.cs @@ -9,18 +9,9 @@ public partial class EnemyLogic { [Meta, Id("enemy_logic_state_activated")] public partial record Activated : Alive, - IGet, - IGet, - IGet, IGet { public Activated() => OnAttach(() => Output(new Output.Activate())); } - - public Transition On(in ReachedPlayer input) => To(); - - public Transition On(in Patrol _) => To(); - - public Transition On(in Follow _) => To(); } } \ No newline at end of file diff --git a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Alive.cs b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Alive.cs index 38fffe18..908f5df9 100644 --- a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Alive.cs +++ b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Alive.cs @@ -11,6 +11,9 @@ public partial class EnemyLogic public abstract partial record Alive : State, IGet, IGet, + IGet, + IGet, + IGet, IGet { public Transition On(in Reset input) @@ -21,11 +24,13 @@ public partial class EnemyLogic public Transition On(in Input.Defeated input) => To(); - public Transition On(in Input.Idle input) - { - Output(new Output.Idle()); - return ToSelf(); - } + public Transition On(in Input.Idle input) => To(); + + public Transition On(in Follow _) => To(); + + public Transition On(in ReachedPlayer input) => To(); + + public Transition On(in Patrol _) => To(); public Transition On(in Move input) { diff --git a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.EngagePlayer.cs b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.EngagePlayer.cs index bbb63f17..fdf39ce6 100644 --- a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.EngagePlayer.cs +++ b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.EngagePlayer.cs @@ -8,7 +8,7 @@ public partial class EnemyLogic public partial record State { [Meta, Id("enemy_logic_state_engage_player")] - public partial record EngagePlayer : Activated + public partial record EngagePlayer : Alive { public EngagePlayer() { @@ -18,7 +18,6 @@ public partial class EnemyLogic if (enemy is IHaveEngagePlayerBehavior engagePlayerEnemy) { engagePlayerEnemy.EngagePlayerBehavior.Engage(); - Input(new Input.Idle()); } }); OnDetach(() => @@ -27,7 +26,6 @@ public partial class EnemyLogic if (enemy is IHaveEngagePlayerBehavior engagePlayerEnemy) { engagePlayerEnemy.EngagePlayerBehavior.Disengage(); - Input(new Input.Idle()); } }); } diff --git a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs index 69322c0e..484b76c3 100644 --- a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs +++ b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs @@ -8,7 +8,7 @@ public partial class EnemyLogic public partial record State { [Meta, Id("enemy_logic_state_followplayer")] - public partial record FollowPlayer : Activated, IGet + public partial record FollowPlayer : Alive, IGet { public FollowPlayer() { @@ -18,7 +18,6 @@ public partial class EnemyLogic if (enemy is IHaveFollowBehavior followEnemy) { followEnemy.FollowBehavior.StartFollow(followEnemy.NavigationAgent); - Input(new Input.Move()); } }); OnDetach(() => @@ -27,7 +26,6 @@ public partial class EnemyLogic if (enemy is IHaveFollowBehavior followEnemy) { followEnemy.FollowBehavior.StopFollow(); - Input(new Input.Idle()); } }); } diff --git a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Idle.cs b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Idle.cs index a818a1d3..3d012b56 100644 --- a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Idle.cs +++ b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Idle.cs @@ -7,7 +7,7 @@ public partial class EnemyLogic public partial record State { [Meta, Id("enemy_logic_state_idle")] - public partial record Idle : Activated + public partial record Idle : Alive { public Idle() => OnAttach(() => Output(new Output.Idle())); } diff --git a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Patrolling.cs b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Patrolling.cs index 3961a1d5..10d64b02 100644 --- a/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Patrolling.cs +++ b/Zennysoft.Game.Ma/src/enemy/state/states/EnemyLogic.State.Patrolling.cs @@ -1,5 +1,4 @@ using Chickensoft.Introspection; -using Godot; using Zennysoft.Ma.Adapter.Entity; namespace Zennysoft.Game.Ma; @@ -9,7 +8,7 @@ public partial class EnemyLogic public partial record State { [Meta, Id("enemy_logic_state_patrolling")] - public partial record Patrolling : Activated + public partial record Patrolling : Alive { public Patrolling() { @@ -19,7 +18,6 @@ public partial class EnemyLogic if (enemy is IHavePatrolBehavior patrolEnemy) { patrolEnemy.PatrolBehavior.StartPatrol(); - Input(new Input.Move()); } }); OnDetach(() => @@ -28,7 +26,6 @@ public partial class EnemyLogic if (enemy is IHavePatrolBehavior patrolEnemy) { patrolEnemy.PatrolBehavior.StopPatrol(); - Input(new Input.Idle()); } }); } diff --git a/Zennysoft.Game.Ma/src/map/Map.tscn b/Zennysoft.Game.Ma/src/map/Map.tscn index 54829a7b..b29c35eb 100644 --- a/Zennysoft.Game.Ma/src/map/Map.tscn +++ b/Zennysoft.Game.Ma/src/map/Map.tscn @@ -80,7 +80,7 @@ unique_name_in_owner = true script = ExtResource("2_00xd7") FolderName = "SetAFloors" FloorOdds = Array[float]([0.0, 1.0]) -Chinthe = 1.0 +Sproingy = 1.0 [node name="Overworld" type="Node" parent="MapOrder"] script = ExtResource("3_v14r0")