using System; using BlueWater.Tycoons; using UnityEngine; using Sirenix.OdinInspector; using TMPro; using Unity.VisualScripting; using UnityEngine.UI; namespace BlueWater.Uis { public class TycoonShopUi : PopupUi { [field: SerializeField, CLabel("카드 프리펫")] private GameObject cardPerfab; [field: SerializeField, CLabel("판매완료 이미지")] private GameObject soldOutImg; [field: SerializeField, CLabel("골드TextMesh")] private TextMeshProUGUI goldTextmesh; private GameObject _panel; private GameObject _currentCard01; private GameObject _currentCard02; private GameObject _currentCard03; private GameObject _currentCard04; private GameObject _currentCard05; private TycoonCard _tycoonCard01Componet; private TycoonCard _tycoonCard02Componet; private TycoonCard _tycoonCard03Componet; private TycoonCard _tycoonCard04Componet; private TycoonCard _tycoonCard05Componet; private LevelData _lvData; private TycoonManager _tycoonManager; private TycoonStatus _tycoonStatus; private bool _isSelectedPassive = false; private int _gold; private void Awake() { EventManager.OnOpenedNormalRewardBox += CreateCard; _panel = transform.Find("Panel").gameObject; HideUi(); } void Start() { _gold = ES3.Load("EndGold", 0); _tycoonManager = TycoonManager.Instance; _tycoonStatus = _tycoonManager.TycoonStatus; } private void OnDestroy() { EventManager.OnOpenedNormalRewardBox -= CreateCard; } public override void Open() { VisualFeedbackManager.Instance.SetBaseTimeScale(0.0f); PlayerInputKeyManager.Instance.DisableAction("Manual"); PopupUiController.RegisterPopup(this); ShowUi(); IsOpened = true; } public override void Close() { HideUi(); PlayerInputKeyManager.Instance.EnableAction("Manual"); PopupUiController.UnregisterPopup(this); IsOpened = false; if (!PopupUiController.IsPopupListEmpty()) return; VisualFeedbackManager.Instance.ResetTimeScale(); } [Button("Shop 열기")] private void CreateCard() { /* * 해당 기능에 대해서는 TycoonSelectCard와 유사한 기능이 많기에... 따로 분리시켜서 효율적으로 관리하도록하자... * SelectedCard(...) 에 대해서도 이하동문 */ _lvData = TycoonManager.Instance.GetCurrentLevelData(); if (!Application.isPlaying) return; // 기존 카드가 있으면 삭제 if (_currentCard01 != null) { Destroy(_currentCard01); } if (_currentCard02 != null) { Destroy(_currentCard02); } if (_currentCard03 != null) { Destroy(_currentCard03); } if (_currentCard04 != null) { Destroy(_currentCard04); } if (_currentCard05 != null) { Destroy(_currentCard05); } _currentCard01 = Instantiate(cardPerfab, _panel.transform); _currentCard01.name = "Card01"; _currentCard02 = Instantiate(cardPerfab, _panel.transform); _currentCard02.name = "Card02"; _currentCard03 = Instantiate(cardPerfab, _panel.transform); _currentCard03.name = "Card03"; _currentCard04 = Instantiate(cardPerfab, _panel.transform); _currentCard04.name = "Card04"; _currentCard05 = Instantiate(cardPerfab, _panel.transform); _currentCard05.name = "Card05"; var scale = new Vector3(0.65f, 0.65f, 1f); _currentCard01.transform.localPosition = new Vector3(-700, 30, 0); _currentCard01.transform.localScale = scale; _currentCard02.transform.localPosition = new Vector3(-350, 30, 0); _currentCard02.transform.localScale = scale; _currentCard03.transform.localPosition = new Vector3(0, 30, 0); _currentCard03.transform.localScale = scale; _currentCard04.transform.localPosition = new Vector3(350, 30, 0); _currentCard04.transform.localScale = scale; _currentCard05.transform.localPosition = new Vector3(700, 30, 0); _currentCard05.transform.localScale = scale; _tycoonCard01Componet = _currentCard01.GetComponent(); _tycoonCard02Componet = _currentCard02.GetComponent(); _tycoonCard03Componet = _currentCard03.GetComponent(); _tycoonCard04Componet = _currentCard04.GetComponent(); _tycoonCard05Componet = _currentCard05.GetComponent(); Open(); //----카드 값 지정 및 초기화---- bool PassiveCheck(CardData card) { return _isSelectedPassive && card.Type == CardType.Passive; } CardData card; var card01Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card01Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card) //Max 검사 || card.Type == CardType.Passive);//패시브 검사 _tycoonCard01Componet.SetCard(card01Key); var card02Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card02Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card) //Max 검사 || card02Key.Equals(card01Key) //중복검사 || card.Shop != ShopType.Active //숍 등장 검사 || card.Type == CardType.Passive);//패시브 검사 _tycoonCard02Componet.SetCard(card02Key); var card03Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card03Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card) //Max 검사 || card03Key.Equals(card01Key) || card03Key.Equals(card02Key) //중복검사 || card.Shop != ShopType.Active //숍 등장 검사 || card.Type == CardType.Passive); //패시브 검사 _tycoonCard03Componet.SetCard(card03Key); var card04Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card04Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card) //Max 검사 || card04Key.Equals(card01Key) || card04Key.Equals(card02Key) //중복검사 || card04Key.Equals(card03Key) //중복검사 || card.Shop != ShopType.Active //숍 등장 검사 || card.Type == CardType.Passive); //패시브 검사 _tycoonCard04Componet.SetCard(card04Key); var card05Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card05Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card) //Max 검사 || card05Key.Equals(card01Key) || card05Key.Equals(card02Key) //중복검사 || card05Key.Equals(card03Key) || card05Key.Equals(card04Key) //중복검사 || card.Shop != ShopType.Active //숍 등장 검사 || card.Type == CardType.Passive); //패시브 검사 _tycoonCard05Componet.SetCard(card05Key); //------------- //여기에 선택했을때 호출할 함수를 등록하자! _tycoonCard01Componet.Rotation_Start(); _tycoonCard02Componet.Rotation_Start(); _tycoonCard03Componet.Rotation_Start(); _tycoonCard04Componet.Rotation_Start(); _tycoonCard05Componet.Rotation_Start(); _tycoonCard01Componet.SetselectAction(SelectedCard); _tycoonCard02Componet.SetselectAction(SelectedCard); _tycoonCard03Componet.SetselectAction(SelectedCard); _tycoonCard04Componet.SetselectAction(SelectedCard); _tycoonCard05Componet.SetselectAction(SelectedCard); } public void SelectedCard(TycoonCard currTycoonCard) { //살 수 있는 가격이면 SOLD OUT 표시하기! 못사면 Gold를 빨갛게 표시하고 흔들임 효과 주기 var cardSoldOutImg = Instantiate(soldOutImg, currTycoonCard.transform); cardSoldOutImg.transform.localPosition = new Vector3(0, 0, 0); cardSoldOutImg.transform.localScale = new Vector3(1f, 1f, 1f); switch (currTycoonCard.CardDataForIdx.Idx) //탐색 후 행동... { case "HeartSlotPlus": _tycoonStatus.MaxPlayerHealth += 2; break; case "HeartRecovery": _tycoonStatus.CurrentPlayerHealth += 2; break; case "FullHeartRecovery": _tycoonStatus.CurrentPlayerHealth = _tycoonStatus.MaxPlayerHealth; break; case "AddLiquidB": _tycoonStatus.CurrentLiquidAmountB += 4000; break; case "AddLiquidC": _tycoonStatus.CurrentLiquidAmountC += 4000; break; case "AddLiquidD": _tycoonStatus.CurrentLiquidAmountD += 4000; break; case "AddLiquidE": _tycoonStatus.CurrentLiquidAmountE += 4000; break; case "AddGarnish1": _tycoonStatus.CurrentGarnishAmount1 += 4000; break; case "AddGarnish2": _tycoonStatus.CurrentGarnishAmount2 += 4000; break; case "AllLiquidAdd": EventManager.InvokeAddBarrels(1000); break; case "ServerNpcAdd": EventManager.InvokeCreateServerCrew(); break; case "CleanerNpcAdd": EventManager.InvokeCreateCleanerCrew(); break; case "BartenderNpcAdd": EventManager.InvokeCreateBartenderCrew(); break; case "SpeedBoost": _tycoonStatus.PlayerMoveSpeedMultiplier += 0.1f; break; case "ExpBoost": _tycoonStatus.ExpMultiplier += 0.2f; break; case "GoldBoost": _tycoonStatus.GoldMultiplier += 0.2f; break; case "AllCleanUp": EventManager.InvokeCleaningAll(); break; case "GaugeReset": EventManager.InvokeGaugeResetCustomers(); break; case "DashCooldownReduction": _tycoonStatus.PlayerDashCooldownReduction += 1; break; case "TipBoost": _tycoonStatus.TipMultiplier += 0.2f; break; case "EndGoldBoost": _tycoonStatus.EndGoldMultiplier += 0.1f; break; case "AllCustomerPurification": EventManager.InvokePurifiedCustomerAll(); break; case "GaugeTimeUp": _tycoonStatus.CustomerHurryTimeIncrease += 3; break; case "BarrelAutoSupply": if (_tycoonManager.CardDataSo.CardFirstCheck("BarrelAutoSupply")) { EventManager.InvokeAutoSupplyBarrels(); } _tycoonStatus.BarrelAutoIncrease += 2; break; case "ServerNpcUpgrade": _tycoonStatus.ServerTipMultiplier += 0.1f; break; case "CleanerNpcUpgrade": _tycoonStatus.CleanerCleaningReduction += 1; break; case "BartenderNpcUpgrade": _tycoonStatus.BartenderMakingReduction += 1; break; case "PassiveDoubleServing": _tycoonStatus.CurrentPassiveCard = PassiveCard.DoubleServing; break; case "PassiveRandomChange": _tycoonStatus.CurrentPassiveCard = PassiveCard.RandomChange; EventManager.InvokeChangedRandomBox(); break; case "PassiveGoldAutoGain": _tycoonStatus.CurrentPassiveCard = PassiveCard.GoldAutoGain; EventManager.InvokeGainAutoMoneyCounter(_tycoonManager.TycoonStageController.StageDataSo.AutoGainWaitTime); break; case "PassiveMakingBonus": _tycoonStatus.CurrentPassiveCard = PassiveCard.MakingBonus; break; case "PassiveServingBonus": _tycoonStatus.CurrentPassiveCard = PassiveCard.ServingBonus; break; case "PassiveCleaningBonus": _tycoonStatus.CurrentPassiveCard = PassiveCard.CleaningBonus; break; default: Debug.Log("Not Found Card : IDX" + currTycoonCard.CardDataForIdx.Idx); return; } if (currTycoonCard.CardDataForIdx.Type == CardType.Passive) _isSelectedPassive = true; TycoonManager.Instance.CardDataSo.AddToSelectedCard(currTycoonCard.CardDataForIdx); } public void ShowUi() => _panel.SetActive(true); public void HideUi() => _panel.SetActive(false); } }