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] protected Button btnClose, btnInfo, btnTicket; [SerializeField] protected EventGatherCoreTriggerView[] triggers; [SerializeField] protected EventGatherCoreRewardView[] rewards; [SerializeField] protected EventGatherCoreTaskView taskView; [SerializeField] protected TMP_Text textTicketCount; [SerializeField] protected EventGatherCoreTriggerItemFly fly; [SerializeField] protected BingoTimer timer; [SerializeField] protected GameObject clickMask; [SerializeField] protected DeferredRewardStashButton rewardStashButton; [SerializeField] protected GameObject fxStageShift; [SerializeField] protected float triggerItemShakeDuration, triggerItemKickDuration, triggerItemFlyDuration, triggerItemHitDuration, fingerTipDelay = 3f; [SerializeField] protected EventGatherCoreFingerTipCtrl _fingerTipCtrl; protected IEventAggregator _eventAggregator; protected readonly string SfxHit = "audio_ui_gathercorefootball_reward_hit"; protected 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, chainPackData.RedPointIndex); _fingerTipCtrl.Init(fingerTipDelay, _eventAggregator); _eventAggregator.GetEvent().Subscribe(e => _fingerTipCtrl.Show(GetRandomActiveTriggerView())).AddTo(this); } protected void OnClickClose() { GContext.Publish(new UnloadActToNextAct()); } protected 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); } taskView.Init(stageData.CoreItemReceivedCount, EventGatherCoreAct.Ctx.GetCoreItemCollectionReward(stageData.StageId)); UpdateTicketCount(); var timerData = data.ToTimerContext(OnClickClose); if (timer != null) timer.Init(timerData); fxStageShift.SetActive(false); } protected virtual 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 taskView.OnTriggerAsync(reward.id, rewardView.Reward); 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 RewardItemNewFlyToStashRequest{Source = rewardView.Reward}); } UnblockInput(); } protected 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); } taskView.RefreshView(EventGatherCoreAct.Ctx.GetCoreItemCollectionReward(stageData.StageId)); } protected void UpdateTicketCount() { var n = GContext.container.Resolve().TicketCount; textTicketCount.text = n.ToString(); textTicketCount.color = n > 0 ? Color.white : Color.red; } protected async void OnClickInfo() { try { await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreInfoPanel); } catch (Exception e) { Debug.Log($"[EventGatherCore]{e.Message}\n{e.StackTrace}"); } } protected 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.OnRewardItemNewFlyRequestAsync( new RewardItemNewFlyToStashRequest { Source = rewardView.Reward })); } await Task.WhenAll(tasks); } catch (Exception e) { Debug.Log($"[EventGatherCore]{e.Message}\n{e.StackTrace}"); } } protected 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); } } protected 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; } }