using System.Collections; using System.Collections.Generic; using BlueWater.Npcs.Customers; using BlueWater.Tycoons; using BlueWater.Utility; using UnityEngine; using Sirenix.OdinInspector; using TMPro; using UnityEngine.InputSystem; using UnityEngine.UI; namespace BlueWater.Uis { public class TycoonResultUi : PopupUi { [Title("결과 카드")] [SerializeField] private TycoonResultCard _cardObject; [SerializeField] private Transform _cardLocation; [Title("컴포넌트")] [SerializeField] private GameObject _panel; [Title("타이틀")] [SerializeField] private GameObject _titlePanel; [Title("카드")] [SerializeField] private GameObject _cardTitlePanel; [SerializeField] private GameObject _resultCardPanel; [SerializeField] private GameObject _resultCardContents; [Title("라운드")] [SerializeField] private GameObject _roundPanel; [SerializeField] private TMP_Text _roundText; [Title("플레이 타임")] [SerializeField] private GameObject _playTimePanel; [SerializeField] private TMP_Text _playTimeText; [Title("텍스트 패널")] [SerializeField] private GameObject _textPanel; [Title("손님")] [SerializeField] private GameObject _customerPanel; [SerializeField] private GameObject _customerContents; [SerializeField] private GameObject _casperPanel; [SerializeField] private TMP_Text _casperText; private int _casperCount; [SerializeField] private GameObject _pumpkinPanel; [SerializeField] private TMP_Text _pumpkinText; private int _pumpkinCount; [Title("서비스")] [SerializeField] private GameObject _serviceTitlePanel; [SerializeField] private GameObject _serviceContents; [Title("Good 서빙")] [SerializeField] private GameObject _goodServingPanel; [SerializeField] private TMP_Text _goodServingText; private int _goodServingCount; [Title("Fail 서빙")] [SerializeField] private GameObject _failServingPanel; [SerializeField] private TMP_Text _failedServingText; private int _failedServingCount; [Title("Miss 서빙")] [SerializeField] private GameObject _missServingPanel; [SerializeField] private TMP_Text _missServingText; private int _missServingCount; [Title("Good 청소")] [SerializeField] private GameObject _goodCleaningPanel; [SerializeField] private TMP_Text _goodCleaningText; private int _goodCleaningCount; [Title("Fail 청소")] [SerializeField] private GameObject _failedCleaningPanel; [SerializeField] private TMP_Text _failedCleaningText; private int _failedCleaningCount; [Title("골드")] [SerializeField] private GameObject _goldPanel; [SerializeField] private GameObject _goldTitlePanel; [SerializeField] private GameObject _goldContents; [Title("획득한 골드")] [SerializeField] private GameObject _goldGainedPanel; [SerializeField] private TMP_Text _goldGainedText; private int _goldGained; [SerializeField] private GameObject _plusObject; [Title("획득한 팁")] [SerializeField] private GameObject _tipGainedPanel; [SerializeField] private TMP_Text _tipGainedText; private int _tipGained; [SerializeField] private GameObject _minusObject; [Title("사용한 골드")] [SerializeField] private GameObject _goldSpentPanel; [SerializeField] private TMP_Text _goldSpentText; private int _goldSpent; [Title("총 획득 골드")] [SerializeField] private GameObject _totalGoldPanel; [SerializeField] private TMP_Text _totalGoldText; [SerializeField] private TMP_Text _minusPercentText; [Title("버튼")] [SerializeField] private Button _mainMenuButton; [SerializeField] private Button _restartButton; [Title("연출 효과")] [SerializeField] private float _panelWaitingTime = 0.3f; [SerializeField] private float _totalGoldDuration = 1f; private Coroutine _showResultInstance; private InputAction _pressAnyKeyAction; private float _playTime; private void Awake() { EventManager.OnShowResult += Open; EventManager.OnCheckedSkin += AddCustomerCount; EventManager.OnOrderResult += AddServingCount; EventManager.OnMissedServing += AddMissedServingCount; EventManager.OnCleaningResult += AddCleaningCount; EventManager.OnAddedGold += AddGoldCount; } public void Start() { _pressAnyKeyAction = PlayerInputKeyManager.Instance.GetAction(InputActionMaps.TycoonUi, TycoonUiActions.PressAnyKey); foreach (Transform element in _resultCardContents.transform) { Destroy(element.gameObject); } _mainMenuButton.onClick.AddListener(() => SceneController.Instance.LoadScene(SceneName.TycoonTile)); _restartButton.onClick.AddListener(SceneController.Instance.RestartCurrentScene); _casperCount = 0; _pumpkinCount = 0; _goodServingCount = 0; _failedServingCount = 0; _missServingCount = 0; _goodCleaningCount = 0; _failedServingCount = 0; SetActiveUi(false); } public void Update() { _playTime += Time.deltaTime; //플레이타임 측정 (일시정지나 메뉴얼보는 시간은 제외) } private void OnDestroy() { EventManager.OnShowResult -= Open; EventManager.OnCheckedSkin -= AddCustomerCount; EventManager.OnOrderResult -= AddServingCount; EventManager.OnMissedServing -= AddMissedServingCount; EventManager.OnCleaningResult -= AddCleaningCount; EventManager.OnAddedGold -= AddGoldCount; if (SceneController.Instance) { _mainMenuButton?.onClick.RemoveListener(() => SceneController.Instance.LoadScene(SceneName.TycoonTile)); _restartButton?.onClick.RemoveListener(SceneController.Instance.RestartCurrentScene); } _pressAnyKeyAction.performed -= OnShowImmediately; } [Button("결과 연출 테스트")] public override void Open() { VisualFeedbackManager.Instance.SetBaseTimeScale(0.0f); PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.TycoonUi); PopupUiController.RegisterPopup(this); IsOpened = true; Utils.StartUniqueCoroutine(this, ref _showResultInstance, ShowResultCoroutine()); } public override void Close() { } public override void EnableInput() { _pressAnyKeyAction.performed += OnShowImmediately; } public override void DisableInput() { _pressAnyKeyAction.performed -= OnShowImmediately; } private void OnShowImmediately(InputAction.CallbackContext context) { _pressAnyKeyAction.performed -= OnShowImmediately; ShowImmediately(); } private IEnumerator ShowResultCoroutine() { SetResultData(); WaitForSecondsRealtime panelWaitingTime = new WaitForSecondsRealtime(_panelWaitingTime); _panel.SetActive(true); _titlePanel.SetActive(true); yield return panelWaitingTime; _cardTitlePanel.SetActive(true); _resultCardPanel.SetActive(true); yield return panelWaitingTime; _resultCardContents.SetActive(true); yield return panelWaitingTime; _roundPanel.SetActive(true); _playTimePanel.SetActive(true); yield return panelWaitingTime; _textPanel.SetActive(true); _customerPanel.SetActive(true); _customerContents.SetActive(true); _casperPanel.SetActive(true); _pumpkinPanel.SetActive(true); yield return panelWaitingTime; _serviceTitlePanel.SetActive(true); _serviceContents.SetActive(true); _goodServingPanel.SetActive(true); _failServingPanel.SetActive(true); _missServingPanel.SetActive(true); _goodCleaningPanel.SetActive(true); _failedCleaningPanel.SetActive(true); yield return panelWaitingTime; _goldPanel.SetActive(true); _goldTitlePanel.SetActive(true); _goldContents.SetActive(true); _goldGainedPanel.SetActive(true); _plusObject.SetActive(true); _tipGainedPanel.SetActive(true); _minusObject.SetActive(true); _goldSpentPanel.SetActive(true); yield return panelWaitingTime; float elapsedTime = 0f; int currentGold = TycoonManager.Instance.TycoonStatus.CurrentGold; int targetGold = ES3.Load(SaveData.EndGold, 0); string totalGoldLocalized = Utils.GetLocalizedString("TotalGold"); _totalGoldText.text = $"{totalGoldLocalized} : {currentGold:N0}"; _totalGoldPanel.SetActive(true); yield return panelWaitingTime; _minusPercentText.enabled = true; yield return panelWaitingTime; while (elapsedTime <= _totalGoldDuration) { var newGold = (int)Mathf.Lerp(currentGold, targetGold, elapsedTime / _totalGoldDuration); _totalGoldText.text = $"{totalGoldLocalized} : {newGold:N0}"; elapsedTime += Time.unscaledDeltaTime; yield return null; } _totalGoldText.text = $"{totalGoldLocalized} : {targetGold:N0}"; yield return panelWaitingTime; _mainMenuButton.gameObject.SetActive(true); _restartButton.gameObject.SetActive(true); _pressAnyKeyAction.performed -= OnShowImmediately; yield return null; } private void SetActiveUi(bool isActive) { _panel.SetActive(isActive); _titlePanel.SetActive(isActive); _cardTitlePanel.SetActive(isActive); _resultCardPanel.SetActive(isActive); _resultCardContents.SetActive(isActive); _roundPanel.SetActive(isActive); _playTimePanel.SetActive(isActive); _textPanel.SetActive(isActive); _customerPanel.SetActive(isActive); _customerContents.SetActive(isActive); _casperPanel.SetActive(isActive); _pumpkinPanel.SetActive(isActive); _serviceTitlePanel.SetActive(isActive); _serviceContents.SetActive(isActive); _goodServingPanel.SetActive(isActive); _failServingPanel.SetActive(isActive); _missServingPanel.SetActive(isActive); _goodCleaningPanel.SetActive(isActive); _failedCleaningPanel.SetActive(isActive); _goldPanel.SetActive(isActive); _goldTitlePanel.SetActive(isActive); _goldContents.SetActive(isActive); _goldGainedPanel.SetActive(isActive); _plusObject.SetActive(isActive); _tipGainedPanel.SetActive(isActive); _minusObject.SetActive(isActive); _goldSpentPanel.SetActive(isActive); _totalGoldPanel.SetActive(isActive); _minusPercentText.enabled = isActive; _mainMenuButton.gameObject.SetActive(isActive); _restartButton.gameObject.SetActive(isActive); } private void SetResultData() { Dictionary selectedCards = TycoonManager.Instance.TycoonCardController.SelectedCard; foreach (var element in selectedCards) { TycoonResultCard newCard = Instantiate(_cardObject, _cardLocation); newCard.SetImage(TycoonManager.Instance.TycoonCardController.CardDataSo.GetDataByIdx(element.Key).Sprite); newCard.SetText(TycoonManager.Instance.TycoonCardController.CardDataSo.GetDataByIdx(element.Key).ScriptText); newCard.SetCount(element.Value); newCard.name = element.Key; } _roundText.text = $"{Utils.GetLocalizedString("Round")} : {TycoonManager.Instance.GetCurrentLevelData().Idx}"; _playTimeText.text = $"{Utils.GetLocalizedString("PlayTime")} : {Mathf.FloorToInt(_playTime / 60f):D2} : {Mathf.FloorToInt(_playTime % 60f):D2}"; _casperText.text = _casperCount.ToString(); _pumpkinText.text = _pumpkinCount.ToString(); _goodServingText.text = _goodServingCount.ToString(); _failedServingText.text = _failedServingCount.ToString(); _missServingText.text = _missServingCount.ToString(); _goodCleaningText.text = _goodCleaningCount.ToString(); _failedCleaningText.text = _failedCleaningCount.ToString(); _goldGainedText.text = _goldGained.ToString("N0"); _tipGainedText.text = _tipGained.ToString("N0"); _goldSpentText.text = _goldSpent.ToString("N0"); _totalGoldText.text = $"{Utils.GetLocalizedString("TotalGold")} : {ES3.Load(SaveData.EndGold, 0):N0}"; _minusPercentText.text = $"- {Mathf.RoundToInt((1f - TycoonManager.Instance.TycoonStatus.EndGoldMultiplier) * 100)}%"; } [Button("결과 즉시 테스트")] private void ShowImmediately() { if (_showResultInstance != null) { StopCoroutine(_showResultInstance); _showResultInstance = null; } SetResultData(); SetActiveUi(true); } private void AddCustomerCount(int skinIndex) { switch (skinIndex) { case 0: _casperCount++; break; case 1: _pumpkinCount++; break; default: break; } } private void AddServingCount(Customer orderedCustomer, bool orderedCorrected) { if (orderedCorrected) { _goodServingCount++; } else { _failedServingCount++; } } private void AddMissedServingCount() => _failedServingCount++; private void AddCleaningCount(bool isSucceed) { if (isSucceed) { _goodCleaningCount++; } else { _failedCleaningCount++; } } private void AddGoldCount(int addedGold, bool isTip) { if (addedGold < 0) { _goldSpent += Mathf.Abs(addedGold); return; } if (isTip) { _tipGained += addedGold; } else { _goldGained += addedGold; } } } }