using System.Linq; using asap.core; using UnityEngine; using UnityEngine.UI; using game; using UniRx; using TMPro; using GameCore; using System.Collections.Generic; using System.Threading.Tasks; using System; using Game; public class EventGatherCorePanel : MonoBehaviour { [SerializeField] private Button btnClose, btnInfo, btnTicket; [SerializeField] private EventGatherCoreTriggerView[] triggers; [SerializeField] private EventGatherCoreRewardView[] rewards; [SerializeField] private EventGatherCoreTaskView task; [SerializeField] private TMP_Text textTicketCount; [SerializeField] private EventGatherCoreTriggerItemFly fly; [SerializeField] private BingoTimer timer; [SerializeField] private GameObject clickMask; [SerializeField] private DeferredRewardStashButton rewardStashButton; [SerializeField] private GameObject fxStageShift; [SerializeField] private float triggerItemShakeDuration, triggerItemKickDuration, triggerItemFlyDuration, triggerItemHitDuration, fingerTipDelay = 3f; [SerializeField] private EventGatherCoreFingerTipCtrl _fingerTipCtrl; private IEventAggregator _eventAggregator; private readonly string SfxHit = "audio_ui_gathercorefootball_reward_hit"; private void Start() { GContext.container.Resolve().InspectTriggerGuide("EventGatherCoreFootballPanel"); } public void Init(IEventAggregator eventAggregator) { var data = GContext.container.Resolve(); btnClose.onClick.AddListener(OnClickClose); btnInfo.onClick.AddListener(OnClickInfo); btnTicket.onClick.AddListener(OnClickPack); _eventAggregator = eventAggregator; InitPanel(); _eventAggregator.GetEvent().Subscribe(OnTrigger).AddTo(this); _eventAggregator.GetEvent().Subscribe(OnRewardPopupPanelClose).AddTo(this); GContext.OnEvent().Subscribe(OnTicketUpdata).AddTo(this); GContext.OnEvent().Subscribe(_ => UpdateTicketCount()).AddTo(this); var chainPackData = data.ToChainPackData(); RedPointManager.Instance.SetRedPointState(chainPackData.RedPointKey, chainPackData.DoNeedPackRedPoint); _fingerTipCtrl.Init(fingerTipDelay, _eventAggregator); _eventAggregator.GetEvent().Subscribe(e => _fingerTipCtrl.Show(GetRandomActiveTriggerView())).AddTo(this); } private void OnClickClose() { GContext.Publish(new UnloadActToNextAct()); } private void InitPanel() { var data = GContext.container.Resolve(); var stageData = data.StageData; if (stageData.IsStageCleared(EventGatherCoreAct.Ctx)) data.MoveToNextStage(); for (int i = 0; i < triggers.Length; i++) triggers[i].Init(i, stageData.IsTriggerUsed(i), fly.showDuration, _eventAggregator); var rewardDic = EventGatherCoreAct.Ctx.GetRewardViewInfo(stageData.StageId); for (int i = 0; i < rewards.Length; i++) { var rewardDisplayInfo = new EventGatherCoreRewardInfo(); if (rewardDic.Keys.Contains(i)) rewardDisplayInfo.ItemData = EventGatherCoreAct.Ctx.GetReward(rewardDic[i].RewardId, out rewardDisplayInfo.IsSpecial); else rewardDisplayInfo.ItemData = null; rewardDisplayInfo.Idx = rewardDic[i].RewardIndex; rewardDisplayInfo.IsClaimed = stageData.IsRewardClaimed(rewardDic[i].RewardIndex); rewards[i].Init(rewardDisplayInfo, fly, SfxHit); } task.Init(stageData.CoreItemReceivedCount, EventGatherCoreAct.Ctx.GetCoreItemCollectionReward(stageData.StageId)); UpdateTicketCount(); var timerData = data.ToTimerContext(OnClickClose); timer.Init(timerData); fxStageShift.SetActive(false); } private async void OnTrigger(EventGatherCoreTriggerTaken e) { if (!e.Succeeded) { OnClickPack(); return; } BlockInput(); UpdateTicketCount(); var data = GContext.container.Resolve(); var stageData = data.StageData; var ctx = EventGatherCoreAct.Ctx; var rewardView = rewards.FirstOrDefault(x => x.RewardIndex == e.RewardIdx); var reward = ctx.GetReward(e.RewardId, out _); await rewardView.OnTriggerAsync(e.Position, triggerItemShakeDuration, triggerItemKickDuration, triggerItemFlyDuration, triggerItemHitDuration); if (ctx.IsCoreItem(e.RewardId)) { _fingerTipCtrl.HardReset(); await task.OnTriggerAsync(reward.id, rewardView.RewardIcon.rect.width, rewardView.RewardIcon.position); if (!stageData.IsStageCleared(EventGatherCoreAct.Ctx)) { UnblockInput(); return; } EventGatherCoreSystem.GrantTaskReward( EventGatherCoreAct.Ctx.GetCoreItemCollectionRewardDropId(data.StageData.StageId), stageData.GetRemainingRewardIds()); var tcs = new TaskCompletionSource(); var panel = (await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreRewardPopupPanel)).GetComponent(); panel.Init(ctx.GetCoreItemCollectionReward(stageData.StageId), _eventAggregator, tcs); await tcs.Task; await CollectRemainingRewards(); data.MoveToNextStage(); if (data.StageData.StageId == ctx.GetStageId(0)) OnClickClose(); else RefreshPanel(); _fingerTipCtrl.HardReset(); } else { GContext.Publish(new EventRewardFlyStashRequest(reward, rewardView.RewardIcon, true, rewardView.Text)); } UnblockInput(); } private async void RefreshPanel() { var data = GContext.container.Resolve(); var stageData = data.StageData; UpdateTicketCount(); var transitionPanel = await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel); await Task.Delay(TimeSpan.FromSeconds(0.8f)); transitionPanel.GetComponent().EndTransition(new EndTransition()); fxStageShift.SetActive(false); fxStageShift.SetActive(true); for (int i = 0; i < triggers.Length; i++) triggers[i].Set(stageData.IsTriggerUsed(i)); var rewardDic = EventGatherCoreAct.Ctx.GetRewardViewInfo(stageData.StageId); for (int i = 0; i < rewards.Length; i++) { var rewardDisplayInfo = new EventGatherCoreRewardInfo(); if (rewardDic.Keys.Contains(i)) rewardDisplayInfo.ItemData = EventGatherCoreAct.Ctx.GetReward(rewardDic[i].RewardId, out rewardDisplayInfo.IsSpecial); else rewardDisplayInfo.ItemData = null; rewardDisplayInfo.Idx = rewardDic[i].RewardIndex; rewardDisplayInfo.IsClaimed = stageData.IsRewardClaimed(i); rewards[i].Set(rewardDisplayInfo); } task.RefreshView(EventGatherCoreAct.Ctx.GetCoreItemCollectionReward(stageData.StageId)); } private void UpdateTicketCount() { var n = GContext.container.Resolve().TicketCount; textTicketCount.text = n.ToString(); textTicketCount.color = n > 0 ? Color.white : Color.red; } private async void OnClickInfo() { try { await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreInfoPanel); } catch (Exception e) { Debug.Log($"[EventGatherCore]{e.Message}\n{e.StackTrace}"); } } private async Task CollectRemainingRewards() { try { var tasks = new List(); var stageId = GContext.container.Resolve().StageData.StageId; var targetViewList = new List(); GContext.Publish(new EventUISound(SfxHit)); foreach (var rewardView in rewards.Where(x => !x.IsClaimed)) { rewardView.SetReceived(); targetViewList.Add(rewardView); } if (targetViewList.Count <= 0) return; await Task.Delay(TimeSpan.FromSeconds(triggerItemHitDuration)); foreach (var rewardView in targetViewList) { var item = EventGatherCoreAct.Ctx.GetRewardByIndex(rewardView.RewardIndex, stageId); tasks.Add(rewardStashButton.OnRewardFlyRequestAsync( new EventRewardFlyStashRequest(item, rewardView.RewardIcon))); } await Task.WhenAll(tasks); } catch (Exception e) { Debug.Log($"[EventGatherCore]{e.Message}\n{e.StackTrace}"); } } private async void OnClickPack() { var chainData = GContext.container.Resolve().ToChainPackData(); if (chainData.IsChainPackDepleted) { var normalPanel = (await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreNormalPackPanel)) .GetComponent(); normalPanel.Init(EventGatherCoreAct.Ctx.GetNormalPackInfo()); } else { var chainPanel = (await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreChainPackPanel)) .GetComponent(); chainPanel.Init(chainData); } } private void OnTicketUpdata(ResAddEvent e) { if (e.id != EventGatherCoreAct.Ctx.GetTicketItemId()) return; UpdateTicketCount(); } public /* async */ void BlockInput() { try { clickMask.SetActive(true); // Debug.Log($"[EventGatherCore] Block."); // await Task.Delay(TimeSpan.FromSeconds(15f)); // UnblockInput(); } catch (Exception e) { Debug.Log($"[EventGatherCore] Block error."); Debug.LogError(e); } } public void UnblockInput() { clickMask.SetActive(false); // Debug.Log($"[EventGatherCore] Unblock."); } public void OnRewardPopupPanelClose(EventGatherCoreRewardPopupPanelClose e) { // RefreshPanel(); } public EventGatherCoreTriggerView GetRandomActiveTriggerView() { var activeList = triggers.Where(x => x.gameObject.activeSelf).ToList(); return activeList.Count > 0 ? activeList[UnityEngine.Random.Range(0, activeList.Count)] : null; } }