SupaLidlGame/Characters/States/CharacterState.cs

58 lines
1.9 KiB
C#
Raw Normal View History

2022-11-13 15:42:04 -08:00
using Godot;
namespace SupaLidlGame.Characters.State
{
public partial class CharacterState : Node
{
public Character Character { get; set; }
/// <summary>
/// Called when the <c>Character</c> enters this <c>CharacterState</c>.
/// </summary>
/// <remarks>
/// This returns a <c>CharacterState</c> in case a state is being
/// transitioned to but wants to transition to another state. For
/// example, an attack state can return to an idle state, but that idle
/// state can override it to the move state immediately when necessary.
/// </remarks>
public virtual CharacterState Enter(CharacterState previousState) => null;
/// <summary>
/// Called when the <c>Character</c> exits this <c>CharacterState</c>.
/// </summary>
public virtual void Exit(CharacterState nextState) { }
2022-11-25 09:11:46 -08:00
public virtual CharacterState Process(double delta)
{
if (Character.StunTime > 0)
{
Character.StunTime -= delta;
}
return null;
}
2022-11-13 15:42:04 -08:00
public virtual CharacterState PhysicsProcess(double delta)
{
2022-11-25 09:11:46 -08:00
Character.Velocity = Character.NetImpulse;
if (Character.NetImpulse.LengthSquared() < Mathf.Pow(Character.Speed, 2))
{
Character.Velocity += Character.Direction.Normalized()
* Character.Speed;
2023-03-19 14:13:20 -07:00
// we should only modify velocity that is in the player's control
Character.ModifyVelocity();
2022-11-25 09:11:46 -08:00
}
Character.NetImpulse = Character.NetImpulse.MoveToward(
Vector2.Zero,
(float)delta * Character.Speed * Character.Friction);
2022-11-13 15:42:04 -08:00
Character.MoveAndSlide();
2022-11-25 09:11:46 -08:00
2022-11-13 15:42:04 -08:00
return null;
}
public virtual CharacterState Input(InputEvent @event) => null;
}
}