using BlueWater.Interfaces; using BlueWater.Items; using BlueWater.Tycoons; using BlueWater.Uis; using Sirenix.OdinInspector; using Spine.Unity; using UnityEngine; using UnityEngine.InputSystem; namespace BlueWater.Players.Tycoons { public static class TycoonPlayerSpineAnimation { public const string Idle = "Idle"; public const string Walking = "Run"; public const string ServingIdle = "ServingIdle"; public const string Serving = "Serving"; public const string Dash = "Dash"; public const string CleaningFloor = "CleaningFloor"; public const string CleaningTable = "CleaningTable"; public const string MakingCocktail = "BeerMaker"; public const string Pumping = "AttackWhip"; public const string AttackSlime = "AttackSlime"; public const string AttackBat = "AttackBat"; } [DefaultExecutionOrder(-1)] public class TycoonPlayer : MonoBehaviour { // Variables #region Variables // Components [field: SerializeField] public Rigidbody Rigidbody { get; private set; } [field: SerializeField] public CapsuleCollider CharacterCollider { get; private set; } [field: SerializeField] public PlayerInput PlayerInput { get; private set; } [field: SerializeField] public Transform VisualLook { get; private set; } [field: SerializeField] public SkeletonAnimation SkeletonAnimation { get; private set; } [field: SerializeField] public InteractionCanvas InteractionCanvas { get; private set; } [field: SerializeField] public SpineController SpineController { get; private set; } [field: SerializeField] public PlayerHealthPoint PlayerHealthPoint { get; private set; } [field: SerializeField] public TycoonInput TycoonInput { get; private set; } [field: SerializeField] public TycoonMovement TycoonMovement { get; private set; } [field: SerializeField] public TycoonPickupHandler TycoonPickupHandler { get; private set; } [SerializeField] private PayMoneyUi _payMoneyUiObject; [SerializeField] private Vector3 _offset = new(0f, 1.5f, 0f); public bool IsCleaningFloor { get; set; } public bool IsCleaningTable { get; set; } public bool IsMakingCocktail { get; set; } public bool IsPumping { get; set; } public bool IsInteractedSlimeGarnish { get; set; } public bool IsInteractedLimeTreeGarnish { get; set; } // State public StateMachineController StateMachineController { get; private set; } public IStateMachine IdleState { get; private set; } public IStateMachine WalkingState { get; private set; } public IStateMachine DashState { get; private set; } public IStateMachine InteractionState { get; private set; } #endregion // Unity events #region Unity events private void Awake() { InitializeComponents(); if (!GameManager.Instance.CurrentTycoonPlayer) { GameManager.Instance.SetCurrentTycoonPlayer(this); } } private void Start() { EventManager.OnDead += Die; EventManager.OnMakeCocktailCompleted += MakeCocktailCompleted; EventManager.OnCocktailDiscarded += DiscardCocktail; EventManager.OnCocktailServedToCustomer += ServedCocktail; EventManager.OnChangedRandomCocktail += ChangeCocktail; TycoonMovement.OnSucceedDash += DashSucceed; IdleState = new IdleState(); WalkingState = new WalkingState(); DashState = new DashState(); InteractionState = new InteractionState(); StateMachineController = new StateMachineController(this, IdleState); } private void Update() { StateMachineController.UpdateState(this); } private void OnDestroy() { EventManager.OnDead -= Die; EventManager.OnMakeCocktailCompleted -= MakeCocktailCompleted; EventManager.OnCocktailDiscarded -= DiscardCocktail; EventManager.OnCocktailServedToCustomer -= ServedCocktail; EventManager.OnChangedRandomCocktail -= ChangeCocktail; TycoonMovement.OnSucceedDash -= DashSucceed; } #endregion // Initialize methods #region Initialize methods [Button("컴포넌트 초기화")] private void InitializeComponents() { Rigidbody = GetComponent(); CharacterCollider = GetComponent(); PlayerInput = GetComponent(); VisualLook = transform.Find("VisualLook"); SkeletonAnimation = VisualLook.GetComponent(); InteractionCanvas = transform.GetComponentInChildren(); SpineController = GetComponent(); PlayerHealthPoint = GetComponent(); TycoonInput = GetComponent(); TycoonMovement = GetComponent(); TycoonPickupHandler = GetComponent(); var renderer = VisualLook.GetComponent(); renderer.sortingLayerName = "Default"; renderer.sortingOrder = 5; } #endregion // Methods #region Methods private void Die() { var saveGold = (int)(TycoonManager.Instance.TycoonStatus.CurrentGold * TycoonManager.Instance.TycoonStatus.EndGoldMultiplier); ES3.Save(SaveData.EndGold, saveGold); } public void MakeCocktailCompleted(CocktailData cocktailData, bool isMadePlayer) { if (!isMadePlayer) return; InteractionCanvas.BalloonUi.SetItemImage(cocktailData); if (TycoonManager.Instance.TycoonStatus.CurrentPassiveCard != PassiveCard.MakingBonus || cocktailData.Idx == "Cocktail000") return; var tip = (int)(TycoonManager.Instance.GetCurrentLevelData().Gold * TycoonManager.Instance.TycoonStatus.TipMultiplier); if (tip > 0) { var payMoneyUi = Instantiate(_payMoneyUiObject, transform.position + _offset, Quaternion.identity, TycoonUiManager.Instance.WorldCanvas.transform); payMoneyUi.Initialize(tip, true); } } public void DiscardCocktail(CocktailData cocktailData, bool isDiscardedPlayer) { if (!isDiscardedPlayer) return; TycoonPickupHandler.DiscardItem(); InteractionCanvas.BalloonUi.DiscardItem(); } public void ServedCocktail(CocktailData cocktailData, bool isServedPlayer) { if (!isServedPlayer) return; TycoonPickupHandler.ServedItem(cocktailData); InteractionCanvas.BalloonUi.DiscardItem(); } public void ChangeCocktail(CocktailData cocktailData) { InteractionCanvas.BalloonUi.SetItemImage(cocktailData); TycoonPickupHandler.ChangeItem(cocktailData); } private void DashSucceed() { StateMachineController.TransitionToState(DashState, this); } #endregion } }