cirnogodot/Scripts/Components/FSM/Elevator/ElevatorMovementState.cs

92 lines
2.4 KiB
C#
Raw Normal View History

2025-03-06 11:34:45 +01:00
using System.Threading;
using System.Threading.Tasks;
using Cirno.Scripts.Enums;
using Godot;
using GTweens.Builders;
using GTweens.Tweens;
using GTweensGodot.Extensions;
namespace Cirno.Scripts.Components.FSM.Elevator;
public abstract partial class ElevatorMovementState : BaseState<ElevatorState, ElevatorProxy>
{
2025-03-11 15:12:17 +01:00
[Export] public AudioStreamPlayer2D Sound { get; private set; }
2025-03-06 11:34:45 +01:00
protected GTween Tween;
2025-03-06 11:42:45 +01:00
//protected Node2D OldPlayerParent;
2025-03-11 15:03:44 +01:00
2025-03-06 11:34:45 +01:00
protected abstract Vector2 StartingPosition { get; }
protected abstract Vector2 EndingPosition { get; }
2025-03-11 15:03:44 +01:00
2025-03-06 11:34:45 +01:00
protected abstract ElevatorState EndState { get; }
protected CharacterBody2D PlayerBody => MainObject.CachedPlayer?.StateMachine.MainObject;
2025-03-11 15:03:44 +01:00
2025-03-06 11:34:45 +01:00
public override void EnterState()
{
Tween?.Kill();
MainObject.SetPosition(StartingPosition);
Move();
2025-03-11 15:12:17 +01:00
Sound.Play();
2025-03-06 11:34:45 +01:00
}
public override void ExitState()
{
Tween?.Kill();
2025-03-11 15:03:44 +01:00
RestorePlayerParent();
2025-03-11 15:12:17 +01:00
Sound.Stop();
2025-03-06 11:34:45 +01:00
}
2025-03-11 15:03:44 +01:00
// public override void PhysicsProcessState(double delta)
// {
// base.PhysicsProcessState(delta);
// MainObject.TopBody.SetPosition(MainObject.Top);
// }
2025-03-06 11:34:45 +01:00
private void RestorePlayerParent()
{
if (PlayerBody is null) return;
2025-03-06 11:42:45 +01:00
PlayerBody.Reparent(PlayerBody.Owner);
//OldPlayerParent = null;
2025-03-06 11:34:45 +01:00
MainObject.CachedPlayer?.StateMachine.SetState(PlayerState.Active);
}
private void CatchPlayer()
{
if (PlayerBody is null) return;
2025-03-06 11:42:45 +01:00
//OldPlayerParent = PlayerBody.GetParent<Node2D>();
2025-03-06 11:34:45 +01:00
MainObject.CachedPlayer.StateMachine.SetState(PlayerState.Cutscene);
PlayerBody.Reparent(MainObject);
}
private void Move()
{
// Grab player if in range
CatchPlayer();
_ = MovePlayerToCenter();
2025-03-06 11:34:45 +01:00
//Ascend
_ = PlayAnimation();
}
private async Task PlayAnimation()
{
Tween = GTweenSequenceBuilder.New()
.Append(MainObject.TweenPosition(EndingPosition, MainObject.MovementTime))
.Build();
await Tween.PlayAsync(CancellationToken.None);
2025-03-11 15:03:44 +01:00
2025-03-06 11:34:45 +01:00
StateMachine.SetState(EndState);
}
private async Task MovePlayerToCenter()
{
var tween = GTweenSequenceBuilder.New()
2025-06-11 15:28:26 +02:00
.Append(PlayerBody.TweenPosition(MainObject.Position, 0.2f))
.Build();
await tween.PlayAsync(CancellationToken.None);
}
2025-03-06 11:34:45 +01:00
}