Files
ft/Client/Assets/Scripts/UI/ScratchTicket/EventScratchTicketPanel.cs
2026-06-29 21:18:33 +08:00

902 lines
36 KiB
C#

using asap.core;
using cfg;
using GameCore;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.UI;
namespace game
{
public class EventScratchTicketPanel : BasePanel
{
[Header("奖励设置")]
[SerializeField] private float m_ProgressBarSpeed = 0.5f;
[SerializeField] private float m_PauseTimeAfterProgressBarIsFull = 0.1f;
[SerializeField] private List<EventScratchTicketStampRewardView> m_StampRewardList;
// [SerializeField] private GameObject m_RewardFlyPrefab;
[Header("brush设置")]
[SerializeField] private float m_Auto_Brush_Waiting_Time = 0.1f;
[Header("动画效果")]
[SerializeField] private string m_AnimScratchStart = "scratch_start";
[SerializeField] private float m_AnimScratchStartDurationTime = 0.3f;
[SerializeField] private string m_AnimScrachEnd = "scrach_end";
[SerializeField] private float m_AnimScrachEndDurationTime = 0.2f;
[SerializeField] private Animation m_AnimEmptyRewardAnim;
[SerializeField] private string m_AnimEmptyReward = "emoji_show";
[SerializeField] private float m_AnimEmptyRewardDurationTime = 0.5f;
[SerializeField] private string m_AnimMaskShow = "mask_show";
[SerializeField] private string m_AnimMaskDisappear = "mask_disappear";
[SerializeField] private float m_AnimMaskWaitingTime = 0.3f;
[Header("RewardFly")]
[SerializeField] private RewardFlyBatchController rewardFlyBatchController;
#region
public async void InitGuidance()
{
//var scratchMain = m_DataManager.GetCurrentEventScratchMain();
//GContext.container.Resolve<GuideDataCenter>().InspectTriggerGuide(scratchMain.UIPanel, curPanelName: gameObject.name);
if (m_DataManager.HasSaveKey(EventScratchTicketConfig.key_first_in)) return;
m_DataManager.SaveData(EventScratchTicketConfig.key_first_in, "ok");
await UIManager.Instance.ShowUI(m_DataManager.GetInfoPanel());
}
#endregion
#region
private void StartScratch1()
{
brush_coin2.gameObject.SetActive(true);
FishingScratchTicketAct.Publish(new EventScratchTicketChangeScratchTypeData()
{
ScratchType = EventScratchTicketScratchType.TypeScratch1
});
}
private int m_Scratch5MaxNum = 5;
private int m_Scratch5CumulativeNum = 0;
private void StartScratch5()
{
brush_coin2.gameObject.SetActive(true);
if (m_Scratch5CumulativeNum >= m_Scratch5MaxNum)
{
autoProgress.SetActive(false);
// 5连刮奖励
FishingScratchTicketAct.Publish(new EventScratchTicketStampRewardFlyData()
{
ScratchType = EventScratchTicketScratchType.TypeScratch5
});
}
else
{
// 更换卡片
m_DataManager.UpdateLuckyValueAndWeight();
FishingScratchTicketAct.Publish(new EventScratchTicketUpdateEventScratchCardData());
FishingScratchTicketAct.Publish(new EventScratchTicketChangeScratchTypeData()
{
ScratchType = EventScratchTicketScratchType.TypeScratch5
});
StartCoroutine(StartAutoBrush());
++m_Scratch5CumulativeNum;
text_title.text = LocalizationMgr.GetFormatTextValue("UI_EventScratchTicketPanel_10", m_Scratch5CumulativeNum, m_Scratch5MaxNum);
}
}
private IEnumerator StartAutoBrush()
{
yield return new WaitForSeconds(m_Auto_Brush_Waiting_Time);
int count = brush_coin2_anim_list.Count;
int index = UnityEngine.Random.Range(0, count);
string anim = brush_coin2_anim_list[index];
brush_coin2.Play(brush_coin2_anim_list[index]);
Debug.LogWarning("--- 当前五连刮使用动画:" + anim);
}
#endregion
#region & &
private async void GotoChainPack()
{
EventScratchTicketChainPackData chainPackData = m_DataManager.GetChainPackData();
if (chainPackData == null) return;
if (chainPackData.IsChainPackDepleted)
{
// 普通礼包
GameObject go = await UIManager.Instance.ShowUI(m_DataManager.GetPackPanel());
var normalPackPanel = go.GetComponent<EventScratchTicket2FestPackPanel>();
normalPackPanel.Init(m_DataManager.GetNormalPackData());
}
else
{
// 链式礼包
GameObject go = await UIManager.Instance.ShowUI(m_DataManager.GetChainPackPanel());
var chainPackPanel = go.GetComponent<ChainPackPanel>();
chainPackPanel.Init(chainPackData);
}
}
private void CheckForStampReward(EventScratchTicketScratchType scratchType)
{
if (m_DataManager.GetStampRewardNum() > 0)
{
HandleStampRewardList(scratchType);
}
else
{
FishingScratchTicketAct.Publish(new EventScratchTicketPanelPlayEndAnimData()
{
ScratchType = scratchType
});
}
}
private async void HandleStampRewardList(EventScratchTicketScratchType scratchType)
{
if (m_DataManager.GetStampRewardNum() > 0)
{
PlayerItemData playerItemData = GContext.container.Resolve<PlayerItemData>();
EventScratchCard card = m_DataManager.GetFirstStampReward();
if (card != null)
{
ItemData rewardItem = playerItemData.GetItemDataOneLureInflation(m_DataManager.ScratchTicketData.InflationRate, card.DropReward);
m_DataManager.RemoveFirstStampReward();
GameObject go = await UIManager.Instance.ShowUI(m_DataManager.GetRewardPanel());
var rewardPopupPanel = go.GetComponent<EventScratchTicketRewardPopupPanel>();
rewardPopupPanel.Init(rewardItem, card, () =>
{
HandleStampRewardList(scratchType);
});
}
}
else
{
await HandleReward(scratchType);
}
}
#endregion
#region
private IEnumerator ScratchStartAnim(Action action)
{
m_animation.Play(m_AnimScratchStart);
yield return new WaitForSeconds(m_AnimScratchStartDurationTime);
if (action != null)
{
action.Invoke();
}
}
private IEnumerator ScratchEndAnim(EventScratchTicketScratchType scratchType, Action<EventScratchTicketScratchType> action)
{
m_animation.Play(m_AnimScrachEnd);
yield return new WaitForSeconds(m_AnimScrachEndDurationTime);
FishingScratchTicketAct.Publish(new EventScratchTicketChangeScratchTypeData()
{
ScratchType = EventScratchTicketScratchType.TypeInvalid
});
if (action != null)
{
action.Invoke(scratchType);
}
}
private void StopScratch()
{
brush_coin2.gameObject.SetActive(false);
FishingScratchTicketAct.Publish(new EventScratchTicketChangeScratchTypeData()
{
ScratchType = EventScratchTicketScratchType.TypeTemporary
});
}
private List<Transform> GetRewardFlyTransformList(int count)
{
Transform pos;
if (count <= 5)
{
pos = transform.Find($"pos{count}");
}
else if (count <= 10)
{
pos = transform.Find("pos10");
}
else
{
pos = transform.Find("pos20");
}
List<Transform> result = new List<Transform>();
int childCount = pos.childCount;
for (int i = 0; i < childCount; i++)
{
result.Add(pos.GetChild(i));
}
return result;
}
private async Task PlayRewardFlyAnim(EventScratchTicketStampRewardFlyData data)
{
if (data.ScratchType == EventScratchTicketScratchType.TypeScratch1)
{
await PlayStampRewardFlyAnimInTypeScratch1(data);
await HandleReward(data.ScratchType);
}
else if (data.ScratchType == EventScratchTicketScratchType.TypeScratch5)
{
FishingScratchTicketAct.Publish(new EventScratchTicketStartStampRewardCountUpdateData());
//mask.gameObject.SetActive(true);
FishingScratchTicketAct.Publish(new EventScratchTicketStartMaskData());
var taskList = new List<Task>();
int count = m_DataManager.ScratchStampList.Count;
if (count > 0)
{
List<Transform> transformList = GetRewardFlyTransformList(count);
for (int i = 0; i < count; i++)
{
int cardID = m_DataManager.ScratchStampList[i];
EventScratchCard card = m_DataManager.GetEventScratchCard(cardID);
if (card.DropReward > 0)
{
taskList.Add(PlayStampRewardFlyAnimInTypeScratch5(data, card, transformList, i));
}
}
if (taskList.Count > 0)
{
await Task.WhenAll(taskList.ToArray());
}
}
m_DataManager.ClearScratchStampList();
//mask.gameObject.SetActive(false);
StopMask();
FishingScratchTicketAct.Publish(new EventScratchTicketStopStampRewardCountUpdateData());
await HandleReward(data.ScratchType);
}
}
private async Task HandleReward(EventScratchTicketScratchType scratchType)
{
int count = m_StampRewardList.Count;
var taskArr = new Task<bool>[count];
for (var i = 0; i < count; i++)
{
taskArr[i] = m_StampRewardList[i].CheckReward();
}
await Task.WhenAll(taskArr);
bool flag = false;
foreach (var task in taskArr)
{
if (task.Result)
{
flag = true;
break;
}
}
m_DataManager.SyncData();
if (flag)
{
CheckForStampReward(scratchType);
}
else
{
FishingScratchTicketAct.Publish(new EventScratchTicketPanelPlayEndAnimData()
{
ScratchType = scratchType
});
}
}
private async Task PlayStampRewardFlyAnimInTypeScratch1(EventScratchTicketStampRewardFlyData data)
{
FishingScratchTicketAct.Publish(new EventScratchTicketStartStampRewardCountUpdateData());
//mask.gameObject.SetActive(true);
FishingScratchTicketAct.Publish(new EventScratchTicketStartMaskData());
EventScratchCard scratchCard = m_DataManager.GetFirstScratchStamp();
EventScratchTicketStampRewardView stampRewardView = null;
foreach (var item in m_StampRewardList)
{
if (item.EventScratchQuality == scratchCard.Quality)
{
stampRewardView = item;
break;
}
}
if (stampRewardView == null)
{
Debug.LogError("--- PlayRewardFlyAnimStep 数据错误,找不到对应的 EventScratchTicketStampRewardView");
return;
}
Sprite icon = m_DataManager.SpriteAtlas.GetSprite(scratchCard.Icon);
Vector3 srcPosition = data.SrcPosition;
var targetImg = stampRewardView.GetFirstEmptyImage();
int rewardNum = stampRewardView.RewardNum;
var recordData = m_DataManager.AddRecordData();
recordData.TicketID = scratchCard.ID;
recordData.TicketFinishID = ((rewardNum % scratchCard.Count) == 0) ? scratchCard.DropReward : 0;
var request = new BatchedRewardFlyRequest()
{
Icon = new BatchedRewardFlyRequestIcon
{
icon = m_DataManager.SpriteAtlas.GetSprite(scratchCard.Icon),
},
StartPoint = new BatchedRewardFlyStartPoint(srcPosition),
EndPoint = new BatchedRewardFlyEndPoint(targetImg.rectTransform),
IsDestinationRewardStash = false
};
await rewardFlyBatchController.OnRewardFlyRequestAsync(request);
StopMask();
targetImg.gameObject.SetActive(true);
m_DataManager.ClearScratchStampList();
FishingScratchTicketAct.Publish(new EventScratchTicketStopStampRewardCountUpdateData());
}
private async Task PlayStampRewardFlyAnimInTypeScratch5(EventScratchTicketStampRewardFlyData data, EventScratchCard scratchCard, List<Transform> transformList, int index)
{
EventScratchTicketStampRewardView stampRewardView = null;
foreach (var item in m_StampRewardList)
{
if (item.EventScratchQuality == scratchCard.Quality)
{
stampRewardView = item;
break;
}
}
if (stampRewardView == null)
{
Debug.LogError("--- PlayRewardFlyAnimStep 数据错误,找不到对应的 EventScratchTicketStampRewardView");
return;
}
Sprite icon = m_DataManager.SpriteAtlas.GetSprite(scratchCard.Icon);
Vector3 srcPosition = data.SrcPosition;
var targetImg = stampRewardView.GetFirstEmptyImage();
if (index >= transformList.Count) { index %= transformList.Count; }
var rewardFlyTransform = transformList[index];
int rewardNum = stampRewardView.RewardNum;
var recordData = m_DataManager.AddRecordData();
recordData.TicketID = scratchCard.ID;
recordData.TicketFinishID = ((rewardNum % scratchCard.Count) == 0) ? scratchCard.DropReward : 0;
// Debug.Log("[ScratchTicket] fly 5", this);
var request = new BatchedRewardFlyRequest()
{
Icon = new BatchedRewardFlyRequestIcon
{
icon = m_DataManager.SpriteAtlas.GetSprite(scratchCard.Icon),
},
StartPoint = new BatchedRewardFlyStartPoint(rewardFlyTransform as RectTransform),
EndPoint = new BatchedRewardFlyEndPoint(targetImg.rectTransform),
IsDestinationRewardStash = false
};
await rewardFlyBatchController.OnRewardFlyRequestAsync(request);
targetImg.gameObject.SetActive(true);
}
private IEnumerator PlayRewardEmptyAnim(EventScratchTicketRewardEmptyData data)
{
// 播放空奖动画
m_AnimEmptyRewardAnim.gameObject.SetActive(true);
m_AnimEmptyRewardAnim.Play(m_AnimEmptyReward);
yield return new WaitForSeconds(m_AnimEmptyRewardDurationTime);
m_AnimEmptyRewardAnim.gameObject.SetActive(false);
EventScratchCard scratchCard = m_DataManager.GetCurrentEventScratchCard();
var recordData = m_DataManager.AddRecordData();
recordData.TicketID = scratchCard.ID;
recordData.TicketFinishID = 0;
FishingScratchTicketAct.Publish(new EventScratchTicketOutData()
{
ScratchType = data.ScratchType
});
}
private IEnumerator StartMask()
{
mask.gameObject.SetActive(true);
mask.Play(m_AnimMaskShow);
yield return new WaitForSeconds(m_AnimMaskWaitingTime);
mask.Play(m_AnimMaskDisappear);
}
private void StopMask()
{
// 停止播放动画
mask.gameObject.SetActive(false);
}
#endregion
#region
private void InitEvent()
{
FishingScratchTicketAct.Subscribe<EventScratchTicketTokenUpdateData>(UpdateToken);
FishingScratchTicketAct.Subscribe<EventScratchTicketStampRewardFlyData>(OnStampRewardFlyEvent);
FishingScratchTicketAct.Subscribe<EventScratchTicketPanelPlayEndAnimData>(PlayScratchEndAnim);
FishingScratchTicketAct.Subscribe<EventScratchTicketRewardTaskUpdateData>(UpdateRewardTask);
FishingScratchTicketAct.Subscribe<EventScratchTicketPlayScratchType5>(PlayScratchType5);
FishingScratchTicketAct.Subscribe<EventScratchTicketRewardEmptyData>(OnRewardEmptyEvent);
FishingScratchTicketAct.Subscribe<EventScratchTicketRevealedAllData>(OnScratchCardRevealedAll);
FishingScratchTicketAct.Subscribe<EventScratchTicketStartMaskData>(OnStartMaskEvent);
// 监听关闭奖励面板
GContext.OnEvent<RewardPanelClose>().Subscribe(OnRewardPanelClose).AddTo(FishingScratchTicketAct.Disposables);
}
private void OnStartMaskEvent(EventScratchTicketStartMaskData data)
{
StartCoroutine(StartMask());
}
private void OnScratchCardRevealedAll(EventScratchTicketRevealedAllData data)
{
if (brush_coin2 == null) return;
brush_coin2.Stop();
brush_coin2.gameObject.SetActive(false);
}
private void OnRewardEmptyEvent(EventScratchTicketRewardEmptyData data)
{
this.StartCoroutine(PlayRewardEmptyAnim(data));
}
private void OnRewardPanelClose(RewardPanelClose data)
{
//FishingScratchTicketAct.Publish(new EventScratchTicketPanelPlayEndAnimData());
}
private void PlayScratchType5(EventScratchTicketPlayScratchType5 data)
{
StartScratch5();
}
private void PlayScratchEndAnim(EventScratchTicketPanelPlayEndAnimData data)
{
if (m_DataManager.ScratchTicketData.ConsumedToken > 0)
{
StartCoroutine(ScratchEndAnim(data.ScratchType, CheckTokenReward));
}
else
{
StartCoroutine(ScratchEndAnim(data.ScratchType, null));
}
StopScratch();
}
private void CheckTokenReward(EventScratchTicketScratchType scratchType)
{
// token 消费积分奖励
FishingScratchTicketAct.Publish(new EventScratchTicketRewardTaskUpdateData()
{
ScratchType = scratchType,
Token = m_DataManager.ScratchTicketData.ConsumedToken
});
}
private async void OnStampRewardFlyEvent(EventScratchTicketStampRewardFlyData data)
{
if (data == null) return;
await PlayRewardFlyAnim(data);
}
private void UpdateToken(EventScratchTicketTokenUpdateData data)
{
if (m_DataManager == null || token_text_num == null) return;
int token = m_DataManager.GetToken();
token_text_num.text = "" + token;
}
private async void UpdateRewardTask(EventScratchTicketRewardTaskUpdateData data)
{
if (m_DataManager == null) return;
PlayerItemData playerItemData = GContext.container.Resolve<PlayerItemData>();
EventScratchReward finalReward = m_DataManager.GetEventScratchFinalReward();
var finalDataItem = playerItemData.GetItemDataOneLureInflation(m_DataManager.ScratchTicketData.InflationRate, finalReward.DropReward);
//top_reward.InflationRate = m_DataManager.ScratchTicketData.InflationRate;
top_reward.SetData(finalDataItem, abbr: true);
if (data == null && m_DataManager.ScratchTicketData.ConsumedToken > 0)
{
data = new EventScratchTicketRewardTaskUpdateData()
{
ScratchType = EventScratchTicketScratchType.TypeInvalid,
Token = m_DataManager.ScratchTicketData.ConsumedToken
};
}
if (data == null)
{
EventScratchReward curReward = m_DataManager.GetEventScratchReward(m_DataManager.ScratchTicketData.EventScratchRewardTaskID);
var curDataItem = playerItemData.GetItemDataOneLureInflation(m_DataManager.ScratchTicketData.InflationRate, curReward.DropReward);
reward.SetData(curDataItem, abbr: true);
img_bar.fillAmount = (float)m_DataManager.ScratchTicketData.RewardTaskConsumedToken / curReward.TokenRequired;
text_progress.text = m_DataManager.ScratchTicketData.RewardTaskConsumedToken + "/" + curReward.TokenRequired;
}
else
{
await StartUpdateProgressBar(data);
}
}
private Queue<EventScratchTicketRewardDisplayUpdateData> GetRewardDisplayUpdateDataQueue(EventScratchTicketRewardTaskUpdateData data)
{
Queue<EventScratchTicketRewardDisplayUpdateData> updateQueue = new Queue<EventScratchTicketRewardDisplayUpdateData>();
int fromToken = m_DataManager.ScratchTicketData.RewardTaskConsumedToken;
int targetToken = fromToken + data.Token;
int taskID = m_DataManager.ScratchTicketData.EventScratchRewardTaskID;
EventScratchReward curScratchReward = m_DataManager.GetEventScratchReward(taskID);
while (targetToken >= curScratchReward.TokenRequired)
{
EventScratchTicketRewardDisplayUpdateData rewardDisplayUpdateData = new EventScratchTicketRewardDisplayUpdateData();
rewardDisplayUpdateData.TaskID = taskID;
rewardDisplayUpdateData.Reward = m_DataManager.GetEventScratchReward(rewardDisplayUpdateData.TaskID);
rewardDisplayUpdateData.FromToken = fromToken;
rewardDisplayUpdateData.TargetToken = curScratchReward.TokenRequired;
rewardDisplayUpdateData.LevelToken = curScratchReward.TokenRequired;
rewardDisplayUpdateData.FromRatio = (float)rewardDisplayUpdateData.FromToken / rewardDisplayUpdateData.LevelToken;
rewardDisplayUpdateData.TargetRatio = (float)rewardDisplayUpdateData.TargetToken / rewardDisplayUpdateData.LevelToken;
updateQueue.Enqueue(rewardDisplayUpdateData);
fromToken = 0;
targetToken -= curScratchReward.TokenRequired;
taskID = curScratchReward.NextTask;
curScratchReward = m_DataManager.GetEventScratchReward(taskID);
}
{
EventScratchTicketRewardDisplayUpdateData rewardDisplayUpdateData = new EventScratchTicketRewardDisplayUpdateData();
rewardDisplayUpdateData.TaskID = taskID;
rewardDisplayUpdateData.Reward = m_DataManager.GetEventScratchReward(rewardDisplayUpdateData.TaskID);
rewardDisplayUpdateData.FromToken = fromToken;
rewardDisplayUpdateData.TargetToken = targetToken;
rewardDisplayUpdateData.LevelToken = curScratchReward.TokenRequired;
rewardDisplayUpdateData.FromRatio = (float)rewardDisplayUpdateData.FromToken / rewardDisplayUpdateData.LevelToken;
rewardDisplayUpdateData.TargetRatio = (float)rewardDisplayUpdateData.TargetToken / rewardDisplayUpdateData.LevelToken;
updateQueue.Enqueue(rewardDisplayUpdateData);
}
return updateQueue;
}
public async Task StartUpdateProgressBar(EventScratchTicketRewardTaskUpdateData data)
{
Queue<EventScratchTicketRewardDisplayUpdateData> updateQueue = GetRewardDisplayUpdateDataQueue(data);
bool syncData = updateQueue.Count > 0;
PlayerItemData playerItemData = GContext.container.Resolve<PlayerItemData>();
EventScratchReward curReward = null;
int finalToken = 0;
while (updateQueue.Count > 0)
{
var item = updateQueue.Dequeue();
int fromToken = item.FromToken;
int targetToken = item.TargetToken;
int levelToken = item.LevelToken;
float fromRatio = item.FromRatio;
float targetRatio = item.TargetRatio;
finalToken = targetToken;
curReward = item.Reward;
var curDataItem = playerItemData.GetItemDataOneLureInflation(m_DataManager.ScratchTicketData.InflationRate, curReward.DropReward);
reward.SetData(curDataItem, abbr: true);
text_progress.text = fromToken + "/" + levelToken;
img_bar.fillAmount = fromRatio;
await Awaiters.NextFrame;
while (fromRatio < targetRatio)
{
fromRatio += m_ProgressBarSpeed * Time.deltaTime;
fromToken = (int)(levelToken * fromRatio);
text_progress.text = fromToken + "/" + levelToken;
img_bar.fillAmount = fromRatio;
await Awaiters.NextFrame;
}
text_progress.text = targetToken + "/" + levelToken;
img_bar.fillAmount = targetRatio;
if (targetToken >= levelToken && curReward.DropReward > 0)
{
await HandleTokenReward(curReward.DropReward);
}
if (fromToken >= 0f)
{
await Awaiters.Seconds(m_PauseTimeAfterProgressBarIsFull);
}
else
{
await Awaiters.NextFrame;
}
}
m_DataManager.RecordStatisticalData();
m_DataManager.ScratchTicketData.EventScratchRewardTaskID = curReward.TaskID;
m_DataManager.ScratchTicketData.ConsumedToken = 0;
m_DataManager.ScratchTicketData.RewardTaskConsumedToken = finalToken;
m_DataManager.SyncData();
m_DataManager.ClearRecordList();
}
private async Task HandleTokenReward(int rewardId)
{
//mask.gameObject.SetActive(true);
ItemData itemData = GContext.container.Resolve<PlayerItemData>().GetItemDataOneLureInflation(m_DataManager.ScratchTicketData.InflationRate, rewardId);
Vector3 srcPosition = reward.transform.position;
//var targetImg = stampRewardView.GetFirstEmptyImage();
Vector3 destPosition = m_BtnPack.transform.position;
float iconSize = m_BtnPack.Icon.rect.width;
var request = new BatchedRewardFlyRequest()
{
Icon = new BatchedRewardFlyRequestIcon
{
itemID = itemData.id,
},
StartPoint = new BatchedRewardFlyStartPoint(reward),
EndPoint = new BatchedRewardFlyEndPoint(m_BtnPack.Icon),
IsDestinationRewardStash = false
};
await rewardFlyBatchController.OnRewardFlyRequestAsync(request);
itemData.changeSource = new ChangeSource(m_DataManager.ScratchTicketData.EventID, "Event_Minigame2", "Event_Minigame2_Scratch", "TaskReward");
GContext.Publish(new DeferredRewardStashService.EventStashItem { Item = itemData });
}
#endregion
#region UI
// animation
private Animation m_animation;
// questionmark
private Button btn_questionmark;
private TMP_Text text_time;
// 关闭按钮
private Button btn_close;
// icon_ticket
private TMP_Text token_text_num;
private Button icon_ticket;
// mask
private Image click_mask;
private Animation mask;
// reward_fly
//private List<RewardFly> m_RewardFlyList = new List<RewardFly>();
// scratch 1 & scratch 5
private Button btn_scratch_1;
TMP_Text btn_scratch_text;
Button btn_beilv;
TMP_Text text_beilv;
TMP_Text text_beilv_max;
GameObject beilv;
GameObject beilv_max;
// brush
private Image brush_coin1;
private Animation brush_coin2;
private List<string> brush_coin2_anim_list = new List<string>();
// bar
private Animation anim_bar;
private RewardItemNew top_reward;
private Image img_bar;
private RewardItemNew reward;
private TMP_Text text_progress;
GameObject autoProgress;
TMP_Text text_title;
// pack
private DeferredRewardStashButton m_BtnPack;
private void InitUI()
{
// animation
m_animation = transform.GetComponent<Animation>();
// btn_questionmark
btn_questionmark = transform.Find("root/title/btn_questionmark").GetComponent<Button>();
btn_questionmark.onClick.AddListener(OnBtnQuestionmarkClickListener);
text_time = transform.Find("root/title/text_time").GetComponent<TMP_Text>();
text_time.text = LocalizationMgr.GetFormatTextValue("UI_COMMON_end", ConvertTools.ConvertTime2(m_DataManager.RemainingTime));
Observable.Interval(TimeSpan.FromSeconds(1.0f)).Subscribe(_ =>
{
text_time.text = LocalizationMgr.GetFormatTextValue("UI_COMMON_end", ConvertTools.ConvertTime2(m_DataManager.RemainingTime));
}).AddTo(this);
// 关闭按钮
btn_close = transform.Find("btn_close").GetComponent<Button>();
btn_close.onClick.AddListener(OnBtnCloseClickListener);
// icon_ticket
icon_ticket = transform.Find("root/icon_ticket").GetComponent<Button>();
icon_ticket.onClick.AddListener(OnBtnIconTicketClickListener);
token_text_num = icon_ticket.transform.Find("text_num").GetComponent<TMP_Text>();
// mask
click_mask = transform.Find("click_mask").GetComponent<Image>();
click_mask.gameObject.SetActive(false);
mask = transform.Find("mask").GetComponent<Animation>();
mask.gameObject.SetActive(false);
// reward_fly
//for (int i = 1; i < 6; ++i)
//{
// var rewardFly = transform.Find($"RewardFly{i}").GetComponent<RewardFly>();
// rewardFly.gameObject.SetActive(false);
// m_RewardFlyList.Add(rewardFly);
//}
// scratch 1 & scratch 5
btn_scratch_1 = transform.Find("root/btn_scratch/btn_green").GetComponent<Button>();
btn_scratch_text = transform.Find("root/btn_scratch/btn_green/Ani_Container/p_text").GetComponent<TMP_Text>();
btn_scratch_1.onClick.AddListener(OnBtnScratch1ClickListener);
btn_beilv = transform.Find("root/btn_beilv").GetComponent<Button>();
beilv = transform.Find("root/btn_beilv/beilv").gameObject;
beilv_max = transform.Find("root/btn_beilv/beilv_max").gameObject;
text_beilv = transform.Find("root/btn_beilv/beilv/text_beilv").GetComponent<TMP_Text>();
text_beilv_max = transform.Find("root/btn_beilv/beilv_max/text_beilv").GetComponent<TMP_Text>();
btn_beilv.onClick.AddListener(ChangeScratchMag);
SetBeilvBtn();
// brush
brush_coin1 = transform.Find("root/coin1").GetComponent<Image>();
brush_coin1.gameObject.SetActive(true);
brush_coin2 = transform.Find("root/coin2").GetComponent<Animation>();
brush_coin2.gameObject.SetActive(false);
brush_coin2_anim_list.Clear();
foreach (AnimationState animation in brush_coin2)
{
brush_coin2_anim_list.Add(animation.name);
}
// bar
anim_bar = transform.Find("root/bar").GetComponent<Animation>();
top_reward = anim_bar.transform.Find("top_reward").GetComponent<RewardItemNew>();
img_bar = anim_bar.transform.Find("bar").GetComponent<Image>();
reward = anim_bar.transform.Find("reward").GetComponent<RewardItemNew>();
text_progress = anim_bar.transform.Find("text_progress").GetComponent<TMP_Text>();
autoProgress = transform.Find("root/autoProgress").gameObject;
text_title = transform.Find("root/autoProgress/text_title").GetComponent<TMP_Text>();
// pack
m_BtnPack = transform.Find("root/btn_pack").GetComponent<DeferredRewardStashButton>();
}
private void OnBtnScratch1ClickListener()
{
OnBtnScratchClickListener(m_DataManager.GetScratchMag());
}
void ChangeScratchMag()
{
m_DataManager.ChangeScratchMag();
//刷新UI
SetBeilvBtn();
}
void SetBeilvBtn()
{
int mag = m_DataManager.GetScratchMag();
bool isMax = m_DataManager.IsMaxMag();
text_beilv.text = text_beilv_max.text = $"x{mag}";
beilv.SetActive(!isMax);
beilv_max.SetActive(isMax);
btn_scratch_text.text = LocalizationMgr.GetFormatTextValue("UI_EventScratchTicketPanel_2", mag);
}
/// <summary>
/// 多连抽
/// </summary>
/// <param name="count"></param>
void OnBtnScratchClickListener(int count)
{
// 更换卡片
m_DataManager.GetNextScratchTicketData();
FishingScratchTicketAct.Publish(new EventScratchTicketUpdateEventScratchCardData());
m_DataManager.SyncTempRecordData();
m_Scratch5MaxNum = count;
m_Scratch5CumulativeNum = 0;
bool flag = m_DataManager.ConsumeTokens(count);
if (flag)
{
autoProgress.SetActive(count > 1);
if (count == 1)
{
StartCoroutine(ScratchStartAnim(StartScratch1));
}
else
{
text_title.text = LocalizationMgr.GetFormatTextValue("UI_EventScratchTicketPanel_10", 1, m_Scratch5MaxNum);
StartCoroutine(ScratchStartAnim(StartScratch5));
}
}
else
{
GotoChainPack();
}
}
private async void OnBtnQuestionmarkClickListener()
{
await UIManager.Instance.ShowUI(m_DataManager.GetInfoPanel());
//UIManager.Instance.HideUI(m_DataManager.GetUIPanel());
}
public void OnBtnCloseClickListener()
{
// 关闭当前Act
GContext.Publish(new UnloadActToNextAct());
}
private void OnBtnIconTicketClickListener()
{
GotoChainPack();
}
public void RefreshData()
{
UpdateToken(null);
UpdateRewardTask(null);
}
#endregion
#region
private EventScratchTicketDataManager m_DataManager;
protected override void Start()
{
base.Start();
m_DataManager = GContext.container.Resolve<EventScratchTicketDataManager>();
InitUI();
InitEvent();
RefreshData();
InitGuidance();
}
protected override void OnDestroy()
{
base.OnDestroy();
}
#endregion
}
}