备份CatanBuilding瘦身独立工程
This commit is contained in:
265
Assets/Scripts/EventGatherCore/EventGatherCorePanel.cs
Normal file
265
Assets/Scripts/EventGatherCore/EventGatherCorePanel.cs
Normal file
@@ -0,0 +1,265 @@
|
||||
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<GuideDataCenter>().InspectTriggerGuide("EventGatherCoreFootballPanel");
|
||||
}
|
||||
|
||||
public void Init(IEventAggregator eventAggregator)
|
||||
{
|
||||
var data = GContext.container.Resolve<EventGatherCoreData>();
|
||||
btnClose.onClick.AddListener(OnClickClose);
|
||||
btnInfo.onClick.AddListener(OnClickInfo);
|
||||
btnTicket.onClick.AddListener(OnClickPack);
|
||||
_eventAggregator = eventAggregator;
|
||||
InitPanel();
|
||||
_eventAggregator.GetEvent<EventGatherCoreTriggerTaken>().Subscribe(OnTrigger).AddTo(this);
|
||||
_eventAggregator.GetEvent<EventGatherCoreRewardPopupPanelClose>().Subscribe(OnRewardPopupPanelClose).AddTo(this);
|
||||
GContext.OnEvent<ResAddEvent>().Subscribe(OnTicketUpdata).AddTo(this);
|
||||
GContext.OnEvent<EventTicketUpdate>().Subscribe(_ => UpdateTicketCount()).AddTo(this);
|
||||
var chainPackData = data.ToChainPackData();
|
||||
RedPointManager.Instance.SetRedPointState(chainPackData.RedPointKey, chainPackData.DoNeedPackRedPoint);
|
||||
_fingerTipCtrl.Init(fingerTipDelay, _eventAggregator);
|
||||
_eventAggregator.GetEvent<EventCatherCoreFingerTipShow>().Subscribe(e => _fingerTipCtrl.Show(GetRandomActiveTriggerView())).AddTo(this);
|
||||
}
|
||||
|
||||
private void OnClickClose()
|
||||
{
|
||||
GContext.Publish(new UnloadActToNextAct());
|
||||
}
|
||||
|
||||
private void InitPanel()
|
||||
{
|
||||
var data = GContext.container.Resolve<EventGatherCoreData>();
|
||||
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<EventGatherCoreData>();
|
||||
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<bool>();
|
||||
var panel = (await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreRewardPopupPanel)).GetComponent<EventGatherCoreRewardPopupPanel>();
|
||||
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<EventGatherCoreData>();
|
||||
var stageData = data.StageData;
|
||||
UpdateTicketCount();
|
||||
var transitionPanel = await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel);
|
||||
await Task.Delay(TimeSpan.FromSeconds(0.8f));
|
||||
transitionPanel.GetComponent<CloudTransitionPanel>().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<EventGatherCoreData>().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<Task>();
|
||||
var stageId = GContext.container.Resolve<EventGatherCoreData>().StageData.StageId;
|
||||
var targetViewList = new List<EventGatherCoreRewardView>();
|
||||
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<EventGatherCoreData>().ToChainPackData();
|
||||
if (chainData.IsChainPackDepleted)
|
||||
{
|
||||
var normalPanel = (await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreNormalPackPanel))
|
||||
.GetComponent<GeneralEventNormalPackPanel>();
|
||||
normalPanel.Init(EventGatherCoreAct.Ctx.GetNormalPackInfo());
|
||||
}
|
||||
else
|
||||
{
|
||||
var chainPanel = (await UIManager.Instance.ShowUINotLoading(UITypes.EventGatherCoreChainPackPanel))
|
||||
.GetComponent<ChainPackPanel>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user