Move Player logic to other project

This commit is contained in:
2025-03-07 01:26:14 -08:00
parent 1cb79f5b30
commit b7bf4f3d10
30 changed files with 20 additions and 64 deletions

View File

@@ -0,0 +1,21 @@
using Godot;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public static class Input
{
public readonly record struct PhysicsTick(double Delta);
public readonly record struct Moved(Vector3 GlobalPosition, Transform3D GlobalTransform);
public readonly record struct Enable;
public readonly record struct Attack;
public readonly record struct AttackAnimationFinished;
public readonly record struct Killed;
}
}

View File

@@ -0,0 +1,18 @@
using System.Numerics;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public static class Output
{
public static class Animations
{
public readonly record struct Attack;
}
public readonly record struct ThrowItem;
public readonly record struct Move(float delta);
}
}

View File

@@ -0,0 +1,13 @@
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public record Settings
{
public float MoveSpeed { get; set; }
public float RotationSpeed { get; set; }
public float Acceleration { get; set; }
}
}

View File

@@ -0,0 +1,10 @@
using Chickensoft.Introspection;
using Chickensoft.LogicBlocks;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
[Meta]
public abstract partial record State : StateLogic<State>;
}

View File

@@ -0,0 +1,13 @@
using Chickensoft.Introspection;
using Chickensoft.LogicBlocks;
namespace Zennysoft.Game.Ma.Implementation;
public interface IPlayerLogic : ILogicBlock<PlayerLogic.State>;
[Meta, Id("player_logic")]
[LogicBlock(typeof(State), Diagram = true)]
public partial class PlayerLogic : LogicBlock<PlayerLogic.State>, IPlayerLogic
{
public override Transition GetInitialState() => To<State.Idle>();
}

View File

@@ -0,0 +1,20 @@
@startuml PlayerLogic
state "PlayerLogic State" as Zennysoft_Game_Ma_PlayerLogic_State {
state "Alive" as Zennysoft_Game_Ma_PlayerLogic_State_Alive {
state "Attacking" as Zennysoft_Game_Ma_PlayerLogic_State_Attacking
state "Idle" as Zennysoft_Game_Ma_PlayerLogic_State_Idle
}
state "Dead" as Zennysoft_Game_Ma_PlayerLogic_State_Dead
state "Disabled" as Zennysoft_Game_Ma_PlayerLogic_State_Disabled
}
Zennysoft_Game_Ma_PlayerLogic_State_Alive --> Zennysoft_Game_Ma_PlayerLogic_State_Alive : PhysicsTick
Zennysoft_Game_Ma_PlayerLogic_State_Alive --> Zennysoft_Game_Ma_PlayerLogic_State_Dead : Killed
Zennysoft_Game_Ma_PlayerLogic_State_Attacking --> Zennysoft_Game_Ma_PlayerLogic_State_Idle : AttackAnimationFinished
Zennysoft_Game_Ma_PlayerLogic_State_Disabled --> Zennysoft_Game_Ma_PlayerLogic_State_Idle : Enable
Zennysoft_Game_Ma_PlayerLogic_State_Idle --> Zennysoft_Game_Ma_PlayerLogic_State_Attacking : Attack
Zennysoft_Game_Ma_PlayerLogic_State_Idle : OnAttack → Attack
[*] --> Zennysoft_Game_Ma_PlayerLogic_State_Idle
@enduml

View File

@@ -0,0 +1,18 @@
using Chickensoft.Introspection;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public partial record State
{
[Meta]
public partial record Attacking : Alive, IGet<Input.AttackAnimationFinished>
{
public Transition On(in Input.AttackAnimationFinished input)
{
return To<Idle>();
}
}
}
}

View File

@@ -0,0 +1,22 @@
using Chickensoft.Introspection;
using Godot;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public abstract partial record State
{
[Meta, Id("player_logic_state_alive_idle")]
public partial record Idle : Alive, IGet<Input.Attack>
{
public virtual Transition On(in Input.Attack input)
{
GD.Print("Attacking...");
Output(new Output.Animations.Attack());
return To<Attacking>();
}
}
}
}

View File

@@ -0,0 +1,27 @@
using Chickensoft.Introspection;
using Godot;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public partial record State
{
[Meta, Id("player_logic_alive")]
public abstract partial record Alive : State, IGet<Input.PhysicsTick>, IGet<Input.Killed>
{
public virtual Transition On(in Input.PhysicsTick input)
{
var delta = input.Delta;
Output(new Output.Move((float)delta));
return ToSelf();
}
public Transition On(in Input.Killed input)
{
GD.Print("Player died");
return To<Dead>();
}
}
}
}

View File

@@ -0,0 +1,12 @@
using Chickensoft.Introspection;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public abstract partial record State
{
[Meta, Id("player_logic_state_dead")]
public partial record Dead : State;
}
}

View File

@@ -0,0 +1,24 @@
using Chickensoft.Introspection;
using Zennysoft.Game.Abstractions;
namespace Zennysoft.Game.Ma.Implementation;
public partial class PlayerLogic
{
public abstract partial record State
{
[Meta, Id("player_logic_state_disabled")]
public partial record Disabled : State, IGet<Input.Enable>
{
public Disabled()
{
OnAttach(() => Get<IAppRepo>().GameEntered += OnGameEntered);
OnDetach(() => Get<IAppRepo>().GameEntered -= OnGameEntered);
}
public Transition On(in Input.Enable input) => To<Idle>();
public void OnGameEntered() => Input(new Input.Enable());
}
}
}