using System; using System.Collections; using System.Collections.Generic; using System.Linq; using BlueWater.Uis; using BlueWater.Utility; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Tycoons { [Serializable] public class MoneyCounter : InteractionFurniture { [SerializeField] private float _playerHoldingTime = 3f; [SerializeField] private PayMoneyUi _payMoneyUiObject; [SerializeField] private Vector3 _offset = new(0f, 1.5f, 0f); [SerializeField] private float _delay = 0.2f; [SerializeField] private float _payMoneyUiDuration = 0.5f; [SerializeField] private Sprite _empty; [SerializeField] private Sprite _level1; [SerializeField] private Sprite _level2; [SerializeField] private Sprite _level3; private Queue _addedGolds = new(); private SpriteRenderer _spriteRenderer; private Coroutine _gainAutoInstance; private bool _isPlayerInteracting; private bool _isGainGoldCoroutine; protected override void Awake() { base.Awake(); EventManager.OnGainAutoMoneyCounter += GainAuto; } protected override void OnEnable() { base.OnEnable(); Initialize(); } private void Update() { if (IsShowing) { EventManager.InvokeHoldInteracting(HoldingElapsedTime); } if (HoldingElapsedTime >= 1f) { GainMoney(); } if (_isPlayerInteracting) { HoldingElapsedTime += Time.deltaTime / _playerHoldingTime; } else { if (HoldingElapsedTime > 0f) { HoldingElapsedTime -= Time.deltaTime; } } } private void OnDestroy() { if (_gainAutoInstance != null) { StopCoroutine(_gainAutoInstance); _gainAutoInstance = null; } EventManager.OnGainAutoMoneyCounter -= GainAuto; } public void Initialize() { _spriteRenderer = VisualLook.GetComponent(); } public override void Interaction() { _isPlayerInteracting = true; } public override void CancelInteraction() { _isPlayerInteracting = false; } public override bool CanInteraction() { return _addedGolds.Count > 0 && !GameManager.Instance.CurrentTycoonPlayer.TycoonPickupHandler.IsPickedUpAnything(); } public void AddCurrentGold(int gold) { _addedGolds.Enqueue(gold); ChangeSprite(); } private void ChangeSprite() { var sprite = _addedGolds.Sum() switch { > 1000 => _level3, > 500 => _level2, > 0 => _level1, _ => _empty }; _spriteRenderer.sprite = sprite; } public void GainMoney() { if (_isGainGoldCoroutine) return; StartCoroutine(GainGoldCoroutine()); } private IEnumerator GainGoldCoroutine() { _isGainGoldCoroutine = true; _isPlayerInteracting = false; HoldingElapsedTime = 0f; WaitForSeconds delay = new WaitForSeconds(_delay); while (_addedGolds.Count > 0) { var addedGold = _addedGolds.Dequeue(); var payMoneyUi = Instantiate(_payMoneyUiObject, transform.position + _offset, Quaternion.identity, TycoonUiManager.Instance.WorldCanvas.transform); payMoneyUi.Initialize(addedGold, false, _payMoneyUiDuration); yield return delay; } ChangeSprite(); _isGainGoldCoroutine = false; } public void GainAuto(int waitTime) { Utils.StartUniqueCoroutine(this, ref _gainAutoInstance, GainAutoCoroutine(waitTime)); } private IEnumerator GainAutoCoroutine(int waitTime) { while (true) { yield return new WaitForSeconds(waitTime); if (_addedGolds.Count > 0) { GainMoney(); } } } } }