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(); } private void Start() { GContext.OnEvent().Where(x => x.Type == 8).Subscribe(x => { TicketAddAnim(); }).AddTo(this); luckyCardsSystem = GContext.container.Resolve(); 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().InspectTriggerGuide("EventLuckyCardsPanel"); } void RefreshCost() { ticketCount = luckyCardsSystem.TicketCount; int itemCost = luckyCardsSystem.config.ItemCost; costNum.text = ticketCount < itemCost ? $"{itemCost}" : $"{itemCost}"; textTicketCount.text = ticketCount == 0 ? "0" : $"{ticketCount} "; } void TicketAddAnim() { //播放跳字 int old = ticketCount; ticketCount = luckyCardsSystem.TicketCount; int itemCost = luckyCardsSystem.config.ItemCost; costNum.text = ticketCount < itemCost ? $"{itemCost}" : $"{itemCost}"; 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 milestoneList = cardsMain.MilestoneList; List 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().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().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().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 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().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 milestoneList = cardsMain.MilestoneList; List 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().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().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.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(); 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 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 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 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 clickPos = luckyCardsSystem.LuckyCardsData.pos; List 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()); } }