using asap.core; using cfg; using DG.Tweening; using GameCore; using System; using System.Collections; using System.Collections.Generic; using TMPro; using UniRx; using UnityEngine; using UnityEngine.UI; namespace game { public class EventPinballPanel : BasePanel { public float m_ProgressBarSpeed = 0.5f; public float m_PauseTimeAfterProgressBarIsFull = 0.1f; #region 新手引导 [Header("新手相关设置")] [SerializeField] private GameObject m_FakeFiringPinOwner, finger; [SerializeField] private Image m_FakeFiringPinImage; IDisposable _guideDisposable; public void InitGuidance() { EventPinballMain pinballMain = m_DataManager.GetCurrentEventPinballMain(); if (pinballMain != null) { bool isGuide = GContext.container.Resolve().InspectTriggerGuide(pinballMain.UIPanel); if (isGuide) { FishingPinballAct.Publish(new EventPinballHideFiringPinData()); m_FakeFiringPinOwner.SetActive(true); finger.SetActive(false); _guideDisposable = GContext.OnEvent().Subscribe(ShowComboTipsGuide); } else { m_FakeFiringPinOwner.SetActive(false); } } } void ShowComboTipsGuide(AddIndexEvent addIndexEvent) { Debug.Log("addIndexEvent.guideStep:" + addIndexEvent.guideSubIndex); Debug.Log("addIndexEvent.CompleteGuide:" + addIndexEvent.CompleteGuide); //Debug.Log("addIndexEvent.isAutoNext:" + addIndexEvent.isAutoNext); if (addIndexEvent.guideSubIndex == 2) { m_FakeFiringPinOwner.SetActive(true); finger.SetActive(true); } else if (addIndexEvent.guideSubIndex > 2) { FishingPinballAct.Publish(new EventPinballShowFiringPinData()); m_FakeFiringPinOwner.SetActive(false); } if (addIndexEvent.CompleteGuide) { _guideDisposable?.Dispose(); FishingPinballAct.Publish(new EventPinballShowFiringPinData()); m_FakeFiringPinOwner.SetActive(false); } } public void SetIconPinball(Transform pos) { icon_pinball.position = ConvertTools.WorldToScreenPoint(pos.position, false); } public void CreateFakeFiringPin(SpriteRenderer firingPin) { if (firingPin == null) return; Vector3 spriteSize = firingPin.bounds.size; Vector3 screenSize = Camera.main.WorldToScreenPoint(spriteSize) - Camera.main.WorldToScreenPoint(Vector3.zero); m_FakeFiringPinImage.rectTransform.sizeDelta = screenSize; Vector3 screenPos = Camera.main.WorldToScreenPoint(firingPin.transform.position); //m_FakeFiringPinOwner.rectTransform.position = screenPos; RectTransformUtility.ScreenPointToLocalPointInRectangle( m_FakeFiringPinOwner.transform.parent.transform as RectTransform, screenPos, UIManager.Instance.UICanvas.worldCamera, out Vector2 localPoint); m_FakeFiringPinOwner.GetComponent().localPosition = localPoint; } #endregion #region 事件相关 private void InitEvent() { FishingPinballAct.Subscribe(UpdateToken); FishingPinballAct.Subscribe(ResetMagnification); FishingPinballAct.Subscribe(UpdateReward); FishingPinballAct.Subscribe(ShowPopup); FishingPinballAct.Subscribe(HidePopup); FishingPinballAct.Subscribe(ShowMultipleText); FishingPinballAct.Subscribe(ResetPelletInUI); FishingPinballAct.Subscribe(LaunchPelletInUI); // 监听关闭奖励面板 GContext.OnEvent().Subscribe(OnRewardPanelClose).AddTo(FishingPinballAct.Disposables); } private bool m_IsPelletRunning = false; public void LaunchPelletInUI(EventPinballLaunchPelletStatusData data) { m_IsPelletRunning = true; } public void ResetPelletInUI(EventPinballResetPelletStatusData data) { if (bg_popup != null) { bg_popup.gameObject.SetActive(false); } m_IsPelletRunning = false; } private void OnRewardPanelClose(RewardPanelClose rewardPanelClose) { // 刷新奖励 UpdateReward(null); // 重置小球 FishingPinballAct.Publish(new EventPinballResumePelletData()); } private void UpdateToken(EventPinballTokenUpdateData data) { if (m_DataManager == null || Txt_num == null) return; //int token = m_DataManager.GetToken() - m_DataManager.TemporaryConsumedToken; int token = m_DataManager.GetToken(); Txt_num.text = "" + token; } public void ResetMagnification(EventPinballResetMagnification data) { //m_DataManager.ResetMagnification(); int magnification = m_DataManager.GetCurMagnification(); string text = "x" + magnification; text_beilv_normal.text = text; text_beilv_max.text = text; if (m_DataManager.IsMaxMagnification()) { beilv_normal.SetActive(false); beilv_max.SetActive(true); } else { beilv_normal.SetActive(true); beilv_max.SetActive(false); } FishingPinballAct.Publish(new EventPinballBasicScore() { Score = magnification }); } public void UpdateReward(EventPinballRewardUpdateData data) { if (m_DataManager == null) return; PlayerItemData playerItemData = GContext.container.Resolve(); var curDataItem = playerItemData.GetItemDataOne(m_DataManager.PinballData.CurDropID); Obj_reward.SetData(curDataItem, abbr: true); var finalDataItem = playerItemData.GetItemDataOne(m_DataManager.PinballData.FinalDropID); Obj_finalreward.SetData(finalDataItem, abbr: true); if (data == null) { EventPinballReward curReward = m_DataManager.GetEventPinballReward(m_DataManager.PinballData.RewardIndex); int curLevelScore = curReward.SpinPoint; EventPinballReward preReward = curReward; int preLevelScore = preReward.SpinPoint; if (m_DataManager.PinballData.RewardIndex < 1) { preLevelScore = 0; } else { preReward = m_DataManager.GetEventPinballReward(m_DataManager.PinballData.RewardIndex - 1); preLevelScore = preReward.SpinPoint; } int baseScore = curLevelScore - preLevelScore; float displayScore = m_DataManager.PinballData.Scores - preLevelScore; Img_bar.fillAmount = displayScore / baseScore; bar_text_num.text = displayScore + "/" + baseScore; } else { this.StartCoroutine(StartProgressBar(data)); } } public List GetRewardUpdateDisplayDataList(int fromScore, int targetScore, int fromRewardIndex, int targetRewardIndex) { List list = new List(); int tmpFromScore = fromScore; int tmpTargetScore = targetScore; int tmpFromRewardIndex = fromRewardIndex; while (tmpFromRewardIndex <= targetRewardIndex) { EventPinballReward curReward = m_DataManager.GetEventPinballReward(tmpFromRewardIndex); int curSpinPoint = curReward.SpinPoint; EventPinballReward preReward = curReward; int preSpinPoint = 0; if (tmpFromRewardIndex > 0) { preReward = m_DataManager.GetEventPinballReward(tmpFromRewardIndex - 1); preSpinPoint = preReward.SpinPoint; } int tmpLevelScoreDisplay = curSpinPoint - preSpinPoint; int tmpFromScoreDisplay = tmpFromScore - preSpinPoint; int tmpTargetScoreDisplay = (tmpTargetScore > curSpinPoint) ? tmpLevelScoreDisplay : (tmpTargetScore - preSpinPoint); float tmpFromRatio = (float)tmpFromScoreDisplay / tmpLevelScoreDisplay; float tmpTargetRatio = (float)tmpTargetScoreDisplay / tmpLevelScoreDisplay; EventPinballRewardDisplayUpdateData updateData = new EventPinballRewardDisplayUpdateData() { RewardId = curReward.ID, RewardIndex = tmpFromRewardIndex, FromScore = tmpFromScoreDisplay, TargetScore = tmpTargetScoreDisplay, LevelScore = tmpLevelScoreDisplay, FromRatio = tmpFromRatio, TargetRatio = tmpTargetRatio, DropId = (tmpTargetScoreDisplay >= tmpLevelScoreDisplay) ? curReward.DropID : -1, RewardDisplayDropId = curReward.DropID }; list.Add(updateData); tmpFromScore = curReward.SpinPoint; tmpFromRewardIndex++; } return list; } public IEnumerator StartProgressBar(EventPinballRewardUpdateData data) { Queue updateQueue = new Queue(); int fromScore = m_DataManager.PinballData.Scores; int targetScore = fromScore + data.Scores; int curRewardIndex = m_DataManager.PinballData.RewardIndex; int rewardMaxIndex = m_DataManager.PinballData.RewardMaxIndex; int targetRewardIndex = rewardMaxIndex; EventPinballReward finalReward = m_DataManager.GetEventPinballReward(rewardMaxIndex); int maxSpinPoint = finalReward.SpinPoint; if (targetScore >= maxSpinPoint) { List list1 = GetRewardUpdateDisplayDataList(fromScore, targetScore, curRewardIndex, rewardMaxIndex); int count = list1.Count; for (int i = 0; i < count; ++i) { updateQueue.Enqueue(list1[i]); } list1.Clear(); fromScore = 0; targetScore -= maxSpinPoint; curRewardIndex = 0; targetRewardIndex = m_DataManager.FindInsertionIndex(m_DataManager.RewardList, targetScore); List list2 = GetRewardUpdateDisplayDataList(fromScore, targetScore, curRewardIndex, targetRewardIndex); count = list2.Count; for (int i = 0; i < count; ++i) { updateQueue.Enqueue(list2[i]); } list2.Clear(); curRewardIndex = count - 1; } else { targetRewardIndex = m_DataManager.FindInsertionIndex(m_DataManager.RewardList, targetScore); List list1 = GetRewardUpdateDisplayDataList(fromScore, targetScore, curRewardIndex, targetRewardIndex); int count = list1.Count; for (int i = 0; i < count; ++i) { updateQueue.Enqueue(list1[i]); } list1.Clear(); curRewardIndex += count - 1; } bool syncData = updateQueue.Count > 0; //foreach (var item in updateQueue) //{ // Debug.LogError("---- item:" + Newtonsoft.Json.JsonConvert.SerializeObject(item)); //} List rewardList = new List(); PlayerItemData playerItemData = GContext.container.Resolve(); while (updateQueue.Count > 0) { var item = updateQueue.Dequeue(); int levelScore = item.LevelScore; float tmpRatio = item.FromRatio; int displayScore = 0; received.SetActive(false); displayScore = (int)(item.LevelScore * tmpRatio); bar_text_num.text = displayScore + "/" + levelScore; Img_bar.fillAmount = tmpRatio; if (item.RewardDisplayDropId > 0) { var curDataItem = playerItemData.GetItemDataOne(item.RewardDisplayDropId); if (curDataItem != null) { Obj_reward.SetData(curDataItem, abbr: true); } } yield return null; while (tmpRatio < item.TargetRatio) { tmpRatio += m_ProgressBarSpeed * Time.deltaTime; displayScore = (int)(item.LevelScore * tmpRatio); bar_text_num.text = displayScore + "/" + levelScore; Img_bar.fillAmount = tmpRatio; yield return null; } displayScore = item.TargetScore; tmpRatio = item.TargetRatio; bar_text_num.text = displayScore + "/" + levelScore; Img_bar.fillAmount = tmpRatio; if (item.DropId > 0) { rewardList.Add(item.DropId); } if (tmpRatio >= 1f) { received.SetActive(true); yield return new WaitForSeconds(m_PauseTimeAfterProgressBarIsFull); } else { yield return null; } } EventPinballReward curReward = m_DataManager.GetEventPinballReward(curRewardIndex); if (syncData) { m_DataManager.PinballData.Scores = targetScore; m_DataManager.PinballData.RewardIndex = curRewardIndex; m_DataManager.PinballData.CurDropID = curReward.DropID; m_DataManager.SyncTemporaryData(); m_DataManager.SyncData(); } #if AGG using (var e = GEvent.GameEvent("event_pinball")) { e.AddContent("force", m_DataManager.PinballData.Force) .AddContent("consume_item", m_DataManager.TemporaryConsumedToken) .AddContent("bounce_count", m_DataManager.AccumulatedTriggerCount) .AddContent("result_bonus", m_DataManager.PinballData.Multiple) .AddContent("result_points", m_DataManager.TemporaryScore) .AddContent("reward_level", curReward.ID) .AddContent("reward_id", Newtonsoft.Json.JsonConvert.SerializeObject(rewardList)); } #endif // 弹出奖励面板 if (rewardList.Count > 0) { //#if AGG // using (var e = GEvent.GameEvent("event_pinball_reward")) // { // e.AddContent("total_item", m_DataManager.PinballData.TotalConsumedToken) // .AddContent("total_point", m_DataManager.PinballData.TotalScores) // .AddContent("reward_id", Newtonsoft.Json.JsonConvert.SerializeObject(rewardList)) // .AddContent("reward_level", curReward.ID); // } //#endif GContext.container.Resolve()?.AddItemByDropList(rewardList); GContext.Publish(new ShowData()); } else { FishingPinballAct.Publish(new EventPinballResumePelletData()); } } private void ShowPopup(EventPinballShowPopupData data) { if (bg_popup.gameObject.activeSelf == false) { bg_popup.gameObject.SetActive(true); } bg_popup.Play("point_popup_in"); popup_icon_point.gameObject.SetActive(true); string text = "" + data.Scores; TMP_Text hideText1 = popup_Txt_num_normal; TMP_Text hideText2 = popup_Txt_num_max; TMP_Text showText = popup_Txt_num; if (data.BonusType == EventPinballBonusType.TypeMultiple) { hideText1 = popup_Txt_num; if (data.IsMultipleMax) { hideText2 = popup_Txt_num_normal; showText = popup_Txt_num_max; } else { hideText2 = popup_Txt_num_max; showText = popup_Txt_num_normal; } } else { hideText1 = popup_Txt_num_normal; hideText2 = popup_Txt_num_max; showText = popup_Txt_num; } hideText1.gameObject.SetActive(false); hideText2.gameObject.SetActive(false); showText.gameObject.SetActive(true); showText.text = text; } private void HidePopup(EventPinballHidePopupData data) { popup_icon_point.gameObject.SetActive(false); bg_popup.Play("point_popup_out"); } [Header("MultipleText 动画设置")] [SerializeField] private float m_MultipleTextScaleMax = 1.2f; [SerializeField] private float m_MultipleTextScaleMin = 1.1f; [SerializeField] private int m_MultipleTextScaleTimes = 2; [SerializeField] private float m_MultipleTextPerScaleDuration = 0.1f; [SerializeField] private float m_MultipleTextFlyingDuration = 0.6f; public void ShowMultipleText(EventPinballShowMultipleTextData data) { if (data == null) return; if (m_DataManager.IsSimulatorMode) { FishingPinballAct.Publish(new EventPinballResumePelletData()); return; } popup_icon_point.gameObject.SetActive(true); TMP_Text showText = MultipleText; TMP_Text hideText = MultipleText_max; if (data.IsMultipleMax) { showText = MultipleText_max; hideText = MultipleText; } hideText.gameObject.SetActive(false); showText.gameObject.SetActive(true); showText.text = data.Tips; showText.transform.localScale = new Vector3(m_MultipleTextScaleMin, m_MultipleTextScaleMin, 1f); Vector3 screenPos = Camera.main.WorldToScreenPoint(data.Position); Vector2 localPoint; RectTransformUtility.ScreenPointToLocalPointInRectangle( UIManager.Instance.UICanvas.transform as RectTransform, screenPos, UIManager.Instance.UICanvas.worldCamera, out localPoint); showText.rectTransform.anchoredPosition = localPoint; showText.DOKill(); float gap = (m_MultipleTextScaleMax - m_MultipleTextScaleMin) / m_MultipleTextScaleTimes; var sequence = DOTween.Sequence(); var scale = m_MultipleTextScaleMax; for (int i = 1; i < m_MultipleTextScaleTimes; ++i) { float tmpScale = scale; sequence.Append(showText.transform.DOScale(tmpScale, m_MultipleTextPerScaleDuration).SetEase(Ease.Linear)); sequence.Append(showText.transform.DOScale(m_MultipleTextScaleMin, m_MultipleTextPerScaleDuration).SetEase(Ease.Linear)); scale -= gap; } sequence.Append(showText.transform.DOMove(MultipleTextTargetPosition.position, m_MultipleTextFlyingDuration).SetEase(Ease.Linear)); sequence.AppendCallback(() => { showText.gameObject.SetActive(false); hideText.gameObject.SetActive(false); string text = "" + m_DataManager.TemporaryScore; TMP_Text hidePopupText1 = popup_Txt_num_normal; TMP_Text hidePopupText2 = popup_Txt_num_max; TMP_Text showPopupText = popup_Txt_num; if (data.BonusType == EventPinballBonusType.TypeMultiple) { hidePopupText1 = popup_Txt_num; if (data.IsMultipleMax) { hidePopupText2 = popup_Txt_num_normal; showPopupText = popup_Txt_num_max; } else { hidePopupText2 = popup_Txt_num_max; showPopupText = popup_Txt_num_normal; } } else { hidePopupText1 = popup_Txt_num_normal; hidePopupText2 = popup_Txt_num_max; showPopupText = popup_Txt_num; } hidePopupText1.gameObject.SetActive(false); hidePopupText2.gameObject.SetActive(false); showPopupText.gameObject.SetActive(true); showPopupText.text = text; //FishingPinballAct.Publish(new EventPinballHidePopupData()); // 播放动画 FlyTemporaryIconAndScore(data.BonusType, data.IsMultipleMax, text, popup_icon_point.transform.position, popup_icon_point.transform.localScale); //if (!data.IsMultipleMax) //{ // FishingPinballAct.Publish(new EventPinballRewardUpdateData() // { // Scores = data.Scores // }); //} }); sequence.Play(); } #endregion #region 动画/特效 [Header("icon_energy 动画设置")] [SerializeField] private float m_FlyingIconAndScoreScale1 = 1.2f; [SerializeField] private float m_FlyingIconAndScoreStep1Duration1 = 0.5f; [SerializeField] private float m_FlyingIconAndScoreEffect1Duration1 = 0.6f; [SerializeField] private float m_FlyingIconAndScoreScale2 = 0.6f; [SerializeField] private float m_FlyingIconAndScoreDuration2 = 0.5f; //[SerializeField] private Vector3 m_IconEnergyScale = new Vector3(0.2f, 0.2f, 0f); [SerializeField] private float m_IconEnergyScale = 1.2f; [SerializeField] private float m_IconEnergyScaleDuration = 0.5f; [SerializeField] private int m_IconEnergyScaleTimes = 10; private void FlyTemporaryIconAndScore(EventPinballBonusType bonusType, bool isMultipleMax, string text, Vector3 srcPosition, Vector3 srcScale) { Vector3 targetScale = new Vector3(icon_energy.transform.localScale.x, icon_energy.transform.localScale.y, icon_energy.transform.localScale.z); Vector3 targetPosition = new Vector3(icon_energy.transform.position.x, icon_energy.transform.position.y, icon_energy.transform.position.z); TemporaryIconAndScore.sprite = popup_icon_point.sprite; TMP_Text hideText1 = TemporaryIconAndScore_Txt_num; TMP_Text hideText2 = TemporaryIconAndScore_Txt_num_max; TMP_Text showText = TemporaryIconAndScore_Txt_num_normal; if (bonusType == EventPinballBonusType.TypeMultiple) { hideText1 = TemporaryIconAndScore_Txt_num; if (isMultipleMax) { hideText2 = TemporaryIconAndScore_Txt_num_normal; showText = TemporaryIconAndScore_Txt_num_max; } else { hideText2 = TemporaryIconAndScore_Txt_num_max; showText = TemporaryIconAndScore_Txt_num_normal; } } else { hideText1 = TemporaryIconAndScore_Txt_num_normal; hideText2 = TemporaryIconAndScore_Txt_num_max; showText = TemporaryIconAndScore_Txt_num; } hideText1.gameObject.SetActive(false); hideText2.gameObject.SetActive(false); showText.gameObject.SetActive(true); showText.text = text; popup_icon_point.gameObject.SetActive(false); Vector3 tmpScale = new Vector3(srcScale.x, srcScale.y, srcScale.z); TemporaryIconAndScore.transform.localScale = tmpScale; TemporaryIconAndScore.transform.position = srcPosition; TemporaryIconAndScore.gameObject.SetActive(true); TemporaryIconAndScore.transform.DOKill(); TemporaryIconAndScore_Effect1.SetActive(true); var sequence = DOTween.Sequence(); sequence.Append(TemporaryIconAndScore.transform.DOScale(m_FlyingIconAndScoreScale1, m_FlyingIconAndScoreStep1Duration1).SetEase(Ease.Linear)); //sequence.AppendCallback(() => //{ // TemporaryIconAndScore_Effect1.SetActive(true); //}); sequence.Append(TemporaryIconAndScore.transform.DOScale(tmpScale.x, m_FlyingIconAndScoreStep1Duration1).SetEase(Ease.Linear)); sequence.AppendInterval(m_FlyingIconAndScoreEffect1Duration1); sequence.AppendCallback(() => { TemporaryIconAndScore_Effect1.SetActive(false); FishingPinballAct.Publish(new EventPinballHidePopupData()); }); sequence.Append(TemporaryIconAndScore.transform.DOMove(targetPosition, m_FlyingIconAndScoreDuration2).SetEase(Ease.Linear)); sequence.Join(TemporaryIconAndScore.transform.DOScale(m_FlyingIconAndScoreScale2, m_FlyingIconAndScoreDuration2).SetEase(Ease.Linear)); sequence.AppendCallback(() => { TemporaryIconAndScore.gameObject.SetActive(false); FishingPinballAct.Publish(new EventPinballRewardUpdateData() { Scores = m_DataManager.TemporaryScore }); icon_energy.transform.DOKill(); icon_energy_Effect1.SetActive(true); var sequence1 = DOTween.Sequence(); sequence1.Append(icon_energy.transform.DOScale(m_IconEnergyScale, m_IconEnergyScaleDuration).SetEase(Ease.Linear)); //sequence1.AppendCallback(() => //{ // icon_energy_Effect1.SetActive(true); //}); sequence1.Append(icon_energy.transform.DOScale(targetScale.x, m_IconEnergyScaleDuration).SetEase(Ease.Linear)); //sequence1.Append(icon_energy.transform.DOScale(targetScale.x, m_IconEnergyScaleDuration).SetEase(Ease.Linear)); sequence1.AppendCallback(() => { icon_energy.transform.localScale = targetScale; icon_energy_Effect1.SetActive(false); }); sequence1.Play(); }); sequence.Play(); } [Header("倍率按钮 动画设置")] [SerializeField] private float m_BtnMagnificationReactTime = 0.12f; [SerializeField] private string m_BtnMagnificationPressedAnim = "Pressed"; [SerializeField] private string m_BtnMagnificationNormalAnim = "Normal"; #endregion #region UI private Button Btn_questionmark; private TMP_Text Txt_titleName; private TMP_Text Txt_time; private Image icon_energy; private GameObject icon_energy_Effect1; private Image Img_bar; private RewardItemNew Obj_reward; private RewardItemNew Obj_finalreward; private GameObject received; private TMP_Text bar_text_num; private TMP_Text Txt_num; private Button btn_beilv; private Animator btn_beilv_animator; private GameObject beilv_normal; private TMP_Text text_beilv_normal; private GameObject beilv_max; private TMP_Text text_beilv_max; private Button Btn_close; private Animator bg_popup; private Image popup_icon_point; private TMP_Text popup_Txt_num; private TMP_Text popup_Txt_num_normal; private TMP_Text popup_Txt_num_max; private Transform MultipleTextTargetPosition; private TMP_Text MultipleText; private TMP_Text MultipleText_max; private Image TemporaryIconAndScore; private TMP_Text TemporaryIconAndScore_Txt_num; private TMP_Text TemporaryIconAndScore_Txt_num_normal; private TMP_Text TemporaryIconAndScore_Txt_num_max; private GameObject TemporaryIconAndScore_Effect1; Transform icon_pinball; private void InitUI() { Btn_questionmark = transform.Find("root/title/Btn_questionmark").GetComponent