Merger
This commit is contained in:
@@ -65,18 +65,19 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLo
|
||||
_enemyLogic.Set(_player);
|
||||
SetPhysicsProcess(true);
|
||||
EnemyModelView.HitPlayer += EnemyModelView_HitPlayer;
|
||||
}
|
||||
|
||||
public void OnResolved()
|
||||
{
|
||||
EnemyBinding = _enemyLogic.Bind();
|
||||
|
||||
EnemyBinding
|
||||
.Handle((in EnemyLogic.Output.Activate _) =>
|
||||
{
|
||||
if (!_activated)
|
||||
{
|
||||
Activate();
|
||||
_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<IEnemyLo
|
||||
|
||||
public virtual void Activate()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public virtual void Idle()
|
||||
|
||||
@@ -47,7 +47,7 @@ public abstract partial class Enemy2D : Enemy
|
||||
MoveAndSlide();
|
||||
}
|
||||
|
||||
protected void EngagePlayerBehavior_TakeAction() => 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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -26,4 +26,6 @@ public interface IEnemyModelView : INode3D
|
||||
public event EventHandler HitPlayer;
|
||||
|
||||
public event EventHandler ActivationFinished;
|
||||
|
||||
public event EventHandler TeleportAnimationFinished;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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="."]
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
|
||||
public override void _ExitTree()
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
}
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
}
|
||||
@@ -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,8 +10,14 @@ 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!;
|
||||
@@ -17,10 +25,19 @@ public partial class Chinthe : Enemy2D, IHaveEngagePlayerBehavior, IHaveFollowBe
|
||||
public void OnReady()
|
||||
{
|
||||
EnemyModelView.ActivationFinished += EnemyModelView_ActivationFinished;
|
||||
EnemyModelView.TeleportAnimationFinished += Teleport;
|
||||
SetPhysicsProcess(true);
|
||||
}
|
||||
|
||||
private void EnemyModelView_ActivationFinished(object sender, System.EventArgs e)
|
||||
public override void PerformAction()
|
||||
{
|
||||
var rng = new RandomNumberGenerator();
|
||||
var options = new List<Action>() { 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;
|
||||
@@ -37,10 +54,11 @@ public partial class Chinthe : Enemy2D, IHaveEngagePlayerBehavior, IHaveFollowBe
|
||||
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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
}
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
}
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
}
|
||||
@@ -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"]
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
|
||||
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
|
||||
options[(int)selection].Invoke();
|
||||
}
|
||||
}
|
||||
@@ -9,18 +9,9 @@ public partial class EnemyLogic
|
||||
{
|
||||
[Meta, Id("enemy_logic_state_activated")]
|
||||
public partial record Activated : Alive,
|
||||
IGet<ReachedPlayer>,
|
||||
IGet<Patrol>,
|
||||
IGet<Follow>,
|
||||
IGet<Reset>
|
||||
{
|
||||
public Activated() => OnAttach(() => Output(new Output.Activate()));
|
||||
}
|
||||
|
||||
public Transition On(in ReachedPlayer input) => To<EngagePlayer>();
|
||||
|
||||
public Transition On(in Patrol _) => To<Patrolling>();
|
||||
|
||||
public Transition On(in Follow _) => To<FollowPlayer>();
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,9 @@ public partial class EnemyLogic
|
||||
public abstract partial record Alive : State,
|
||||
IGet<Input.Idle>,
|
||||
IGet<Move>,
|
||||
IGet<Patrol>,
|
||||
IGet<Follow>,
|
||||
IGet<ReachedPlayer>,
|
||||
IGet<Input.Defeated>
|
||||
{
|
||||
public Transition On(in Reset input)
|
||||
@@ -21,11 +24,13 @@ public partial class EnemyLogic
|
||||
|
||||
public Transition On(in Input.Defeated input) => To<Defeated>();
|
||||
|
||||
public Transition On(in Input.Idle input)
|
||||
{
|
||||
Output(new Output.Idle());
|
||||
return ToSelf();
|
||||
}
|
||||
public Transition On(in Input.Idle input) => To<Idle>();
|
||||
|
||||
public Transition On(in Follow _) => To<FollowPlayer>();
|
||||
|
||||
public Transition On(in ReachedPlayer input) => To<EngagePlayer>();
|
||||
|
||||
public Transition On(in Patrol _) => To<Patrolling>();
|
||||
|
||||
public Transition On(in Move input)
|
||||
{
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ public partial class EnemyLogic
|
||||
public partial record State
|
||||
{
|
||||
[Meta, Id("enemy_logic_state_followplayer")]
|
||||
public partial record FollowPlayer : Activated, IGet<Input.LoseTrackOfTarget>
|
||||
public partial record FollowPlayer : Alive, IGet<Input.LoseTrackOfTarget>
|
||||
{
|
||||
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());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user