using BlueWater.Audios; using BlueWater.Items; using BlueWater.Players; using UnityEngine; using UnityEngine.Serialization; namespace BlueWater.Tycoons { public static class TrashCanSpineAnimation { public const string ChangeRandomBox = "ChangeRandomBox"; public const string RandomBoxHolding = "RandomBoxHold"; public const string RandomBoxIdle = "RandomBoxIdle"; public const string RandomBoxSpit = "RandomBoxSpit"; public const string Open = "TrashCanOpen"; public const string Close = "TrashCanClose"; public const string Stop = "TrashCanCloseStop"; } public class TrashCan : InteractionFurniture { [SerializeField] private SpineController _spineController; [SerializeField] private float _discardHoldingTime = 0.5f; [SerializeField] private float _randomChangeHoldingTime = 1f; [SerializeField] private bool _canRandomChange; [SerializeField] private bool _isChanged; [SerializeField] private string _discardSfxName = "DiscardCocktail"; private bool _isPlayerInteracting; private bool _canInteraction = true; protected override void Awake() { base.Awake(); _spineController = GetComponent(); EventManager.OnChangedRandomBox += ChangeRandomBox; } protected override void Start() { base.Start(); _spineController.PlayAnimation(TrashCanSpineAnimation.Stop, false); } private void Update() { if (_isChanged) { if (InteractionCanvas.BalloonUi.IsWaitTimeOver()) { _canInteraction = true; } } if (IsShowing) { EventManager.InvokeHoldInteracting(HoldingElapsedTime); } if (HoldingElapsedTime >= 1f) { if (_isChanged) { ChangeRandomCocktail(); } else { DiscardItem(); } } if (_isPlayerInteracting) { if (_isChanged) { HoldingElapsedTime += Time.deltaTime / _randomChangeHoldingTime; } else { HoldingElapsedTime += Time.deltaTime / _discardHoldingTime; } } else { if (HoldingElapsedTime > 0f) { if (_isChanged) { HoldingElapsedTime -= Time.deltaTime / _randomChangeHoldingTime; } else { HoldingElapsedTime -= Time.deltaTime / _discardHoldingTime; } } } } private void OnDestroy() { EventManager.OnChangedRandomBox -= ChangeRandomBox; } public void ChangeRandomBox() { if (!_canRandomChange) return; _spineController.PlayAnimation(TrashCanSpineAnimation.ChangeRandomBox, false); _spineController.AddAnimation(TrashCanSpineAnimation.RandomBoxIdle, true); _isChanged = true; } public override void Interaction() { _isPlayerInteracting = true; if (_isChanged) { _spineController.PlayAnimation(TrashCanSpineAnimation.RandomBoxHolding, true); } } public override void CancelInteraction() { _isPlayerInteracting = false; if (_isChanged) { _spineController.AddAnimation(TrashCanSpineAnimation.RandomBoxIdle, false); } else { _spineController.AddAnimation(TrashCanSpineAnimation.Stop, false); } } public override bool CanInteraction() { return CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything() && ((TycoonManager.Instance.TycoonStatus.CurrentPassiveCard == PassiveCard.RandomChange && _canInteraction) || TycoonManager.Instance.TycoonStatus.CurrentPassiveCard != PassiveCard.RandomChange); } public override void ShowInteractionUi() { if (TycoonManager.Instance.TycoonStatus.CurrentPassiveCard == PassiveCard.RandomChange) { UpdateLocalizedString("InteractionTrashCanChange"); } else { UpdateLocalizedString("InteractionTrashCanDiscard"); } _spineController.EnableCustomMaterial(); EventManager.InvokeShowInteractionUi(InteractionMessage); IsShowing = true; } public override void HideInteractionUi() { _spineController.DisableCustomMaterial(); EventManager.InvokeHideInteractionUi(); IsShowing = false; } private void DiscardItem() { CocktailData discardCocktailData = null; if (!CurrentTycoonPlayer.TycoonPickupHandler.IsUnfinishedCocktailPickedUp) { var discardCocktailDataIdx = CurrentTycoonPlayer.TycoonPickupHandler.CurrentPickupItem.Idx; discardCocktailData = ItemManager.Instance.CocktailDataSo.GetDataByIdx(discardCocktailDataIdx); } AudioManager.Instance.PlaySfx(_discardSfxName); EventManager.InvokeCocktailDiscarded(discardCocktailData, true); HoldingElapsedTime = 0f; _isPlayerInteracting = false; _spineController.PlayAnimation(TrashCanSpineAnimation.Open, false); _spineController.AddAnimation(TrashCanSpineAnimation.Close, false); } private void ChangeRandomCocktail() { var randomCocktail = TycoonManager.Instance.TycoonIngredientController.GetRandomCocktailData(); EventManager.InvokeChangedRandomCocktail(randomCocktail); InteractionCanvas.BalloonUi.OrderItem(DataManager.Instance.SpriteDataSo.Waiting, 0, TycoonManager.Instance.TycoonStageController.StageDataSo.RandomChangeWaitTime); HoldingElapsedTime = 0f; _canInteraction = false; _isPlayerInteracting = false; _spineController.PlayAnimation(TrashCanSpineAnimation.RandomBoxSpit, false); _spineController.AddAnimation(TrashCanSpineAnimation.RandomBoxIdle, true); } } }