using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using BITFALL.Player.Movement; using BITKit.Entities; using BITKit.StateMachine; using UnityEngine; // ReSharper disable UnassignedField.Global namespace BITFALL.Player.Animation.States { public abstract class PlayerAnimateStates : IPlayerAnimationState { [SerializeField] protected PlayerAnimationController animationController; public virtual bool Enabled { get; set; } protected IPlayerAnimationState entryState; public virtual void Initialize() { } public virtual void OnStateEntry(IState old) { entryState = old as IPlayerAnimationState; } public virtual void OnStateUpdate(float deltaTime) { } public virtual void OnStateExit(IState old, IState newState) { } public virtual void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { } protected virtual void Exit() { if (Enabled is false) return; switch (entryState) { case IPlayerWalkState: animationController.TransitionState(); break; case IPlayerCrouchState: animationController.TransitionState(); break; case IPlayerSprintState: animationController.TransitionState(); break; default: animationController.TransitionState(); break; } } } [Serializable] public class Walk : PlayerAnimateStates,IPlayerWalkState { public override void OnStateEntry(IState old) { animationController.animator.CrossFade(old switch { IPlayerRunState or IPlayerSprintState=> "Walk.Stop", IPlayerLinkState { LinkArea: 5 } => "Walk.ExitClimb", _=>BITConstant.Player.Walk },old switch { IPlayerRunState or IPlayerSprintState=> 0.08f, IPlayerSlideState or IPlayerCrouchState => 0.32f, _=>0.16f }); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (Enabled is false) return; switch (newState) { case IPlayerRunState: animationController.TransitionState(); break; case IPlayerCrouchState: animationController.TransitionState(); break; case IPlayerSprintState: animationController.TransitionState(); break; } } } [Serializable] public class Run : PlayerAnimateStates,IPlayerRunState { public override void OnStateEntry(IState old) { base.OnStateEntry(old); animationController.animator.Play(BITConstant.Player.Run); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if(Enabled &&newState is not IPlayerRunState)Exit(); } } [Serializable] public class Sprint : PlayerAnimateStates,IPlayerSprintState { public override void OnStateEntry(IState old) { animationController.animator.Play(BITConstant.Player.Sprint); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (Enabled is false) return; switch (newState) { case IPlayerWalkState: animationController.TransitionState(); break; case IPlayerCrouchState: animationController.TransitionState(); break; } } } [Serializable] public class Crouch : PlayerAnimateStates,IPlayerCrouchState { public override void OnStateEntry(IState old) { animationController.animator.Play(BITConstant.Player.Crouch); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (Enabled is false) return; if(newState is not IPlayerCrouchState) animationController.TransitionState(); } } [Serializable] public class Parachute : PlayerAnimateStates { public override void OnStateEntry(IState old) { animationController.animator.Play(BITConstant.Player.Parachute); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if(newState is IPlayerParachuteState) animationController.TransitionState(); else if(Enabled && newState is not IPlayerKnockdownState) { animationController.TransitionState(); } } } [Serializable] public class Slide : PlayerAnimateStates { public override void OnStateEntry(IState old) { animationController.animator.Play(BITConstant.Player.Slide); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if(newState is IPlayerSlideState) animationController.TransitionState(); else if(Enabled && newState is not IPlayerKnockdownState) { animationController.TransitionState(); } } } [Serializable] public class Knockdown : PlayerAnimateStates { [SerializeField] private AnimatorOverrideController animatorOverrideController; private RuntimeAnimatorController _initialController; public override void Initialize() { base.Initialize(); _initialController = animationController.animator.animator.runtimeAnimatorController; } public override void OnStateEntry(IState old) { animationController.animator.animator.runtimeAnimatorController = animatorOverrideController; animationController.animator.Play(BITConstant.Player.Walk); } public override void OnStateExit(IState old, IState newState) { animationController.animator.animator.runtimeAnimatorController = _initialController; } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (newState is IPlayerKnockdownState) { animationController.TransitionState(); } else if(Enabled) { animationController.TransitionState(); } } } [Serializable] public class Link : PlayerAnimateStates,IPlayerLinkState { public int LinkArea { get; set; } public override void OnStateEntry(IState old) { switch (LinkArea) { case 5: animationController.animator.Play(BITConstant.Player.ClimbLadder); break; } //animationController.animator.Play(BITConstant.Player._Run); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { if (Enabled) { switch (newState) { case IPlayerWalkState: animationController.TransitionState(); break; case IPlayerCrouchState: animationController.TransitionState(); break; case IPlayerSprintState: animationController.TransitionState(); break; } } else { if (newState is IPlayerLinkState linkState) { LinkArea = linkState.LinkArea; animationController.TransitionState(); } } } } [Serializable] public sealed class Fixed : PlayerAnimateStates { public override void OnStateEntry(IState old) { animationController.animator.Play(BITConstant.Player.Fixed); } public override void OnMovementStateChanged(IEntityMovementState oldState, IEntityMovementState newState) { base.OnMovementStateChanged(oldState, newState); if(newState is IPlayerFixedState) animationController.TransitionState(); else if(Enabled) Exit(); } } }