using System; using System.Collections; using System.Collections.Generic; using Animancer; using BITFALL.Player.Movement; using BITKit.Entities; using BITKit.StateMachine; using UnityEngine; namespace BITFALL.Player.Animation.States { [Serializable] public class Climb : PlayerAnimateStates { public override void OnStateEntry(IState old) { animationController.animator.Play("Climb"); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (newState is IPlayerClimbState or IPlayerLinkState { LinkArea: 4 }) { animationController.TransitionState(); } else if(Enabled) { Exit(); } } } [Serializable] public class Vault : PlayerAnimateStates { [SerializeField] private AnimationClip vaultClip; private AnimancerState state; private IPlayerVaultState _vaultState; public override void OnStateEntry(IState old) { base.OnStateEntry(old); animationController.animancerComponent.Stop(); state = animationController.animancerComponent.Play(vaultClip); } public override void OnStateExit(IState old, IState newState) { state?.Stop(); base.OnStateExit(old, newState); state = null; } public override void OnStateUpdate(float deltaTime) { base.OnStateUpdate(deltaTime); if (_vaultState.Phase is 1) _vaultState.NormalizedTime = state.NormalizedTime; } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (newState is IPlayerVaultState _state) { _vaultState = _state; animationController.TransitionState(); } else if(Enabled) { Exit(); } } } [Serializable] public class EdgeClimb : PlayerAnimateStates { [SerializeField] private AnimationClip edgeClimbClip; [SerializeField] private AnimationClip climbUpClip; private int _phase; private AnimancerState state; public override void OnStateEntry(IState old) { base.OnStateEntry(old); _phase = -1; } public override void OnStateExit(IState old, IState newState) { base.OnStateExit(old, newState); state.Stop(); state = null; } public override void OnStateUpdate(float deltaTime) { if(animationController._movement.CurrentState is not IPlayerEdgeClimbState edgeClimbState) return; if(_phase==edgeClimbState.Phase) return; _phase = edgeClimbState.Phase; switch (edgeClimbState.Phase) { case 1: state?.Stop(); state = animationController.animancerComponent.Play(edgeClimbClip); break; case 2: state?.Stop(); state = animationController.animancerComponent.Play(climbUpClip); state.Events.OnEnd = () => { state.Events.OnEnd = null; edgeClimbState.ManualCancel(); return; }; break; } } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (newState is IPlayerEdgeClimbState) { animationController.TransitionState(); } else if(Enabled) { Exit(); } } } }