Files
2026-05-26 16:15:54 +08:00

595 lines
20 KiB
C#

using asap.core;
using DG.Tweening;
using game;
using Game;
using GameCore;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UniRx;
using UnityEngine;
public partial class EventLuckyCardsPanel : MonoBehaviour
{
const string ViewPanel = "Event{0}PrizetViewPopupPanel";
string EventPanelName = "LuckyCards";
LuckyCardsSystem luckyCardsSystem;
int currentMultiplier = 0;
bool isCanClick = false;
int ticketCount;
private void Awake()
{
luckyTaskBtn = transform.Find("root/btn_task").GetComponent<LuckyTaskBtn>();
}
private void Start()
{
GContext.OnEvent<ResAddEvent>().Where(x => x.Type == 8).Subscribe(x =>
{
TicketAddAnim();
}).AddTo(this);
luckyCardsSystem = GContext.container.Resolve<LuckyCardsSystem>();
luckyCardsSystem.Init();
luckyTaskBtn.Init(luckyCardsSystem.model, luckyCardsSystem.model.LuckyTaskRedPointKey);
btnClose.onClick.AddListener(OnCloseButtonClick);
btnTicket.onClick.AddListener(OnClickPack);
btnInfo.onClick.AddListener(OnClickInfo);
btnView.onClick.AddListener(OnClickView);
btn_start.onClick.AddListener(ClickRestartGame);
btn_reward.onClick.AddListener(OnClickReward);
InitProgress();
InitCardsItems();
InitLuckyCardsPrizetSelecte();
UpdateTimer();
Observable.Interval(TimeSpan.FromSeconds(1f)).Subscribe(UpdateTimer).AddTo(this);
CardRewardShowData show = luckyCardsSystem.GetWishPrizeShow();
if (show.id == 0)
{
btn_select.gameObject.SetActive(true);
wishprize.SetActive(false);
StartGame();
btn_start.gameObject.SetActive(true);
multiplier.SetActive(false);
}
else
{
btn_select.gameObject.SetActive(false);
wishprize.SetActive(true);
Init();
}
RefreshCost();
if (currentMultiplier > 0)
{
multiplierNum.text = currentMultiplier.ToString();
}
else
{
multiplierNum.text = "1";
}
npc.PlayIdle();
GContext.container.Resolve<GuideDataCenter>().InspectTriggerGuide("EventLuckyCardsPanel");
}
void RefreshCost()
{
ticketCount = luckyCardsSystem.TicketCount;
int itemCost = luckyCardsSystem.config.ItemCost;
costNum.text = ticketCount < itemCost ? $"<color=red>{itemCost}</color>" : $"<color=#13FF00>{itemCost}</color>";
textTicketCount.text = ticketCount == 0 ? "<color=red>0</color>" : $"{ticketCount} ";
}
void TicketAddAnim()
{
//播放跳字
int old = ticketCount;
ticketCount = luckyCardsSystem.TicketCount;
int itemCost = luckyCardsSystem.config.ItemCost;
costNum.text = ticketCount < itemCost ? $"<color=red>{itemCost}</color>" : $"<color=#13FF00>{itemCost}</color>";
DOTween.Kill("text_ticket");
DOTween.To(() => old, x => old = x, ticketCount, 1f).OnUpdate(() =>
{
textTicketCount.text = $"{old} ";
}).SetId("text_ticket");
}
void InitProgress()
{
var cardsMain = luckyCardsSystem.CardsMain;
List<int> milestoneList = cardsMain.MilestoneList;
List<int> milestoneRewardList = cardsMain.MilestoneRewardList;
int milestoneCount = milestoneList.Count;
ProgressMilestone progressMilestone = luckyCardsSystem.progressMilestone;
//计算奖励
int newProgress = progressMilestone.progress;
float fill = 1;
int index = 0;
for (int i = 0; i < milestoneCount; i++)
{
if (newProgress >= milestoneList[i])
{
index = i + 1;
}
else
{
int dropId = milestoneRewardList[i];
var rewardData = GContext.container.Resolve<PlayerItemData>().GetItemDataOne(dropId);
rewardItem.SetData(rewardData);
break;
}
}
if (index < milestoneCount)
{
int startCount = 0;
if (index > 0)
{
startCount = milestoneList[index - 1];
}
fill = (newProgress - startCount) * 1f / (milestoneList[index] - startCount);
text_progress.text = $"{newProgress - startCount}/{milestoneList[index] - startCount}";
}
else
{
int dropId = milestoneRewardList[milestoneCount - 1];
var rewardData = GContext.container.Resolve<PlayerItemData>().GetItemDataOne(dropId);
rewardItem.SetData(rewardData);
text_progress.text = LocalizationMgr.GetText("UI_EventRankPopupPanel_15");
}
bar.fillAmount = fill;
}
void InitCardsItems()
{
for (int i = 0; i < luckyCardsItems.Count; i++)
{
luckyCardsItems[i].index = i;
luckyCardsItems[i].OnClickCard = OnClickCard;
}
}
void InitLuckyCardsPrizetSelecte()
{
btn_select.onClick.AddListener(OpenSelect);
btn_nextround.onClick.AddListener(OpenSelect);
selectePanel.btn_close.onClick.AddListener(CloseSelect);
selectePanel.btn_confrim.onClick.AddListener(OnConfirmWishPrize);
}
void OpenSelect()
{
finger.SetActive(false);
var itemDatas = luckyCardsSystem.GetWishPrizeReward();
var rewardItemNews = selectePanel.rewardItemNews;
for (int i = 0; i < rewardItemNews.Count; i++)
{
if (i < itemDatas.Count)
{
rewardItemNews[i].SetData(itemDatas[i]);
}
}
selectePanel.OpenSelect();
}
void OnConfirmWishPrize()
{
RestartGame();
}
void RestartGame()
{
GContext.container.Resolve<GuideDataCenter>().InspectTriggerGuide("EventLuckyCardsPanel");
int index = selectePanel.GetSelectedIndex();
if (index < 0)
{
Debug.LogWarning("[EventLucky] Selected index is out of range.");
return;
}
if (luckyCardsSystem.LuckyCardsData.rewardData.Count == 0)
{
ani.Play("EventLuckyCards_change_2");
luckyCardsSystem.RefreshReward();
}
luckyCardsSystem.OnConfirmWishPrize(index);
RefreshCost();
Restart();
CloseSelect();
}
void CloseSelect()
{
selectePanel.gameObject.SetActive(false);
}
void OnClickCard(int index)
{
if (!isCanClick)
{
if (btn_start.gameObject.activeSelf)
{
ClickRestartGame();
}
return;
}
ItemData itemData = luckyCardsSystem.OnClickCard(index);
if (itemData == null)
{
return;
}
List<int> previewPos = luckyCardsSystem.LuckyCardsData.pos;
var cardRewardShowData = luckyCardsSystem.cardRewardShowDatas;
IEventLuckyCardItem luckyCardItem = luckyCardsItems[index];
CardRewardShowData rewardShowData = cardRewardShowData[previewPos.Count - 1];
rewardShowData.isHas = true;
luckyCardItem.OpenReward(rewardShowData);
if (rewardShowData.id == LuckyCardsSystem.ItemID)
{
GContext.container.Resolve<GuideDataCenter>().TriggerGuide(GroupName.LuckyCard02.ToString(), "EventLuckyCardsPanel", false);
}
if (rewardShowData.isWishPrize)
{
npc.PlayCelebrate02();
luckyCardItem.PlayWishprize(true);
}
else
{
luckyCardItem.PlayWishprize(false);
}
RefreshCost();
Fly(rewardShowData, index);
}
async void Fly(CardRewardShowData rewardShowData, int index)
{
clickMask.SetActive(true);
Vector3 srcPosition = luckyCardsItems[index].GetPosition();
ItemData itemData = new ItemData(rewardShowData.id, rewardShowData.num);
await Awaiters.Seconds(0.5f);
if (rewardShowData.isWishPrize)
{
//先飞上面,再飞下面
if (currentMultiplier > 0)
{
if (rewardShowData.multiplier != currentMultiplier)
{
Debug.Log($"[EventLuckyCards] Multiplier mismatch: {rewardShowData.multiplier} != {currentMultiplier}.");
}
itemData.count *= currentMultiplier;
}
currentMultiplier = 0;
multiplierNum.text = "1";
await FlyMultiplierFx(srcPosition, wishprize_fly, wishprize_light, multiplier_fly_time);
wishprizeReward.text_num.text = $"x{ConvertTools.GetNumberString(itemData.count)}";
ani.Play("EventLuckyCards_change_1");
await Awaiters.Seconds(1);
Vector3 destPosition = wishprizeReward.transform.position;
await FlyToPack(destPosition, itemData);
wishprize_light.gameObject.SetActive(false);
}
else if (rewardShowData.id == LuckyCardsSystem.ItemID)
{
//倍率
currentMultiplier += rewardShowData.num;
//动画
await FlyMultiplierFx(srcPosition, multiplier_fly, multiplier_light, multiplier_fly_time);
multiplierNum.text = currentMultiplier.ToString();
}
else
{
//飞到背包
if (currentMultiplier > 0)
{
if (rewardShowData.multiplier != currentMultiplier)
{
Debug.Log($"[EventLuckyCards] Multiplier mismatch: {rewardShowData.multiplier} != {currentMultiplier}.");
}
itemData.count *= currentMultiplier;
currentMultiplier = 0;
multiplierNum.text = "1";
await Awaiters.Seconds(1f);
}
await FlyToPack(srcPosition, itemData);
}
//进度奖励动画
await PlayProgress();
multiplier_light.SetActive(false);
clickMask.SetActive(false);
}
async Task FlyMultiplierFx(Vector3 srcPosition, GameObject fly, GameObject light, float duration)
{
fly.transform.position = srcPosition;
fly.SetActive(true);
fly.transform.DOMove(light.transform.position, duration)
.OnComplete(() =>
{
fly.SetActive(false);
light.SetActive(true);
});
await Awaiters.Seconds(duration + 0.2f);
}
async Task PlayProgress()
{
ProgressMilestone progressMilestone = luckyCardsSystem.progressMilestone;
if (progressMilestone.oldProgress == progressMilestone.progress)
{
return;
}
luckyCardsSystem.progressMilestone.oldProgress = progressMilestone.progress;
var cardsMain = luckyCardsSystem.CardsMain;
List<int> milestoneList = cardsMain.MilestoneList;
List<int> milestoneRewardList = cardsMain.MilestoneRewardList;
int milestoneCount = milestoneList.Count;
//计算奖励
int newProgress = progressMilestone.progress;
int index = 0;
if (progressMilestone.rewardIndex != null && progressMilestone.rewardIndex.Count > 0)
{
for (int i = 0; i < progressMilestone.rewardIndex.Count; i++)
{
index = progressMilestone.rewardIndex[i];
if (index >= 0)
{
//==========飞奖励===========
int dropId = milestoneRewardList[index];
var rewardData = GContext.container.Resolve<PlayerItemData>().GetItemDataOne(dropId);
rewardItem.SetData(rewardData);
int startCount = 0;
if (index > 0)
startCount = milestoneList[index - 1];
int maxPro = milestoneList[index] - startCount;
bar.DOFillAmount(1, 0.5f)
.OnUpdate(() =>
{
text_progress.text = $"{(int)(maxPro * bar.fillAmount)}/{maxPro}";
})
.OnComplete(() =>
{
text_progress.text = $"{maxPro}/{maxPro}";
})
;
await Awaiters.Seconds(0.5f);
await FlyToPack(rewardItem.transform.position, rewardData);
//===========飞奖励==========
bar.fillAmount = 0f;
}
}
}
index = 0;
for (int i = 0; i < milestoneCount; i++)
{
if (newProgress >= milestoneList[i])
{
index = i + 1;
}
else
{
int dropId = milestoneRewardList[i];
var rewardData = GContext.container.Resolve<PlayerItemData>().GetItemDataOne(dropId);
rewardItem.SetData(rewardData);
break;
}
}
if (index < milestoneCount)
{
int startCount = 0;
if (index > 0)
startCount = milestoneList[index - 1];
int curProgress = newProgress - startCount;
int maxPro = milestoneList[index] - startCount;
float fill = curProgress * 1f / maxPro;
bar.DOFillAmount(fill, 0.3f).OnUpdate(() =>
{
text_progress.text = $"{(int)(maxPro * bar.fillAmount)}/{maxPro}";
})
.OnComplete(() =>
{
text_progress.text = $"{curProgress}/{maxPro}";
});
}
else
{
bar.fillAmount = 1f;
text_progress.text = LocalizationMgr.GetText("UI_EventRankPopupPanel_15");
}
}
async Task FlyToPack(Vector3 srcPosition, ItemData itemData)
{
//var targetImg = stampRewardView.GetFirstEmptyImage();
Vector3 destPosition = rewardStashButton.transform.position;
float iconSize = rewardStashButton.Icon.rect.width;
CollectionItemFly collectionItemFly = new CollectionItemFly()
{
itemID = itemData.id,
numStr = itemData.count.ToString(),
sourcePos = srcPosition,
destPos = destPosition,
isPlayOpen = true,
isPlayClose = true,
isDestinationRewardStash = true,
targetIconSize = iconSize
};
var rewardFly = Instantiate(rewardFlyPrefab, rewardFlyPrefab.transform.parent).GetComponent<RewardFly>();
rewardFly.gameObject.SetActive(true);
await rewardFly.ShowAsync(collectionItemFly);
Destroy(rewardFly.gameObject);
//mask.gameObject.SetActive(false);
rewardStashButton.PlayReceiveAnimationWithDelay(0);
}
private void OnClickPack()
{
luckyCardsSystem.OnClickPack();
}
private void UpdateTimer(long _ = 0L)
{
textTimer.text = LocalizationMgr.GetFormatTextValue("UI_COMMON_end", ConvertTools.ConvertTime2(luckyCardsSystem.RemainingTime));
if (luckyCardsSystem.RemainingTime.TotalSeconds <= 0)
OnCloseButtonClick();
}
void OnClickReward()
{
RewradPopup.SetActive(true);
}
private async void OnClickInfo()
{
var cardsMain = luckyCardsSystem.CardsMain;
await UIManager.Instance.ShowUINotLoading(new UIType(cardsMain.InfoPanel));
}
async void OnClickView()
{
try
{
GameObject popup = await UIManager.Instance.ShowUINotLoading(new UIType(string.Format(ViewPanel, EventPanelName)));
if (popup != null)
{
var popupPanel = popup.GetComponent<EventLuckyCardsPrizetViewPopupPanel>();
if (popupPanel != null)
{
popupPanel.btnClose.onClick.AddListener(() => UIManager.Instance.DestroyUI(string.Format(ViewPanel, EventPanelName)));
popupPanel.btn_confrim.onClick.AddListener(() => UIManager.Instance.DestroyUI(string.Format(ViewPanel, EventPanelName)));
var popupItems = popupPanel.luckyCardsItems;
List<int> previewPos = luckyCardsSystem.previewPos;
var cardRewardShowData = luckyCardsSystem.cardRewardShowDatas;
for (int i = 0; i < popupItems.Count; i++)
{
popupItems[i].ViewReward(cardRewardShowData[previewPos[i]]);
}
}
}
}
catch (Exception e)
{
Debug.LogWarning($"[EventLuckyCards] Error in OnclickView: {e.Message}");
}
}
void ShowWishPrize()
{
CardRewardShowData show = luckyCardsSystem.GetWishPrizeShow();
wishprizeReward.SetData(new ItemData(show.id, show.num));
}
async void Restart()
{
isCanClick = false;
clickMask.SetActive(true);
wishprize_show_1.SetActive(true);
ShowWishPrize();
wishprize_show_2.SetActive(false);
wishprize.SetActive(true);
btn_select.gameObject.SetActive(false);
var popupItems = luckyCardsItems;
List<int> previewPos = luckyCardsSystem.previewPos;
var cardRewardShowData = luckyCardsSystem.cardRewardShowDatas;
for (int i = 0; i < popupItems.Count; i++)
{
popupItems[i].OpenReward(cardRewardShowData[previewPos[i]]);
popupItems[i].PlayReward();
}
CardRewardShowData WishPrizeShow = luckyCardsSystem.GetWishPrizeShow();
CardRewardShowData showData = new CardRewardShowData();
showData.isHas = false;
showData.isWishPrize = true;
popupItems[0].OpenReward(showData);
await Awaiters.Seconds(wishprize_show);
popupItems[0].OpenReward(WishPrizeShow);
wishprize_show_2.SetActive(true);
await PlayProgress();
clickMask.SetActive(false);
btn_start.gameObject.SetActive(true);
ShowStartText(true);
wishprize_show_1.SetActive(false);
}
async void ClickRestartGame()
{
CardRewardShowData show = luckyCardsSystem.GetWishPrizeShow();
if (show.id == 0)
{
finger.SetActive(true);
return;
}
isCanClick = true;
btn_start.gameObject.SetActive(false);
ShowStartText(false);
clickMask.SetActive(true);
var popupItems = luckyCardsItems;
for (int i = 0; i < popupItems.Count; i++)
{
popupItems[i].PlayBack();
}
await Awaiters.Seconds(0.5f);
cardAni.Play();
mask.Play();
await Awaiters.Seconds(3f);
npc.PlayStart();
clickMask.SetActive(false);
}
void ShowStartText(bool value)
{
multiplier.SetActive(!value);
text_start.SetActive(value);
}
void StartGame()
{
ShowWishPrize();
var popupItems = luckyCardsItems;
List<int> previewPos = luckyCardsSystem.previewPos;
var cardRewardShowData = luckyCardsSystem.cardRewardShowDatas;
for (int i = 0; i < popupItems.Count; i++)
{
popupItems[i].OpenReward(cardRewardShowData[previewPos[i]]);
popupItems[i].PlayReward();
}
isCanClick = false;
}
private void Init()
{
ShowWishPrize();
var popupItems = luckyCardsItems;
List<int> clickPos = luckyCardsSystem.LuckyCardsData.pos;
List<CardRewardShowData> cardRewardShowData = luckyCardsSystem.cardRewardShowDatas;
IEventLuckyCardItem luckyCardItem = null;
for (int i = 0; i < clickPos.Count; i++)
{
CardRewardShowData cardRewardShow = cardRewardShowData[i];
luckyCardItem = popupItems[clickPos[i]];
luckyCardItem.OpenReward(cardRewardShow);
if (cardRewardShow.id == LuckyCardsSystem.ItemID)
{
currentMultiplier += cardRewardShow.num;
}
else
{
currentMultiplier = 0;
}
luckyCardItem.PlayReward();
}
isCanClick = true;
}
private void OnCloseButtonClick()
{
GContext.Publish(new UnloadActToNextAct());
}
}