Squashes 146 commits from battle-engine-extraction. Net: 2,045 files changed, +11,896 / -158,687 lines. Ships engine passes 4-7 (dead-code cull, view-layer stub, receive-path shrink) plus the Phase-5 AsyncLocal ambient deletion that turns concurrent battles into a type-system property rather than a scope contract. ## What landed **Passes 4-7 (chunks 1-34):** Extended the Phase-4 const-false collapse into a cascading cull across the skill graph, view layer, and receive-path periphery. Six mode flags (IsWatchBattle/IsReplayBattle/IsAdmin/IsAdminWatch/IsPuzzleQuest/ IsAINetwork) became `const false`, every guarded block deleted. Field*.cs subclass ctors + BackGroundBase + ObjectChecker culled to no-ops. Mulligan family reworked to take a mgr param through IMulliganMgr.InitMulligan. Emotion/Recovery/Resource clusters null-stubbed. Prediction/OperationSimulator/ skill filters converted from static ambient reads to per-mgr reads via SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr / ins.BattleMgr / this.BattleMgr. **Phase-5 ambient rip (chunks 35-47):** Deleted BattleAmbient / BattleAmbient- Context / TestBattleScope in full. Every per-battle mutable slot now lives on the mgr instance itself: mgr.InstanceIsForecast / InstanceIsRandomDraw / InstanceRecoveryInfo / InstanceViewerId / InstanceNetworkAgent / GameMgr BattleManagerBase.GetIns() returns null unconditionally; the residual static flags + 3 façades (Certification.ViewerId, Data.BattleRecoveryInfo, ToolboxGame.RealTimeNetworkAgent) are null-tolerant defaults kept for the handful of engine-internal readers that still reference their types. Zero BattleAmbient references anywhere in engine + node + tests. Added pre-seeded GameMgr ctor overload threaded through the mgr chain (BattleManagerBase → SingleBattleMgr / NetworkBattleManagerBase → NetworkStandard- BattleMgr → HeadlessBattleMgr / HeadlessNetworkBattleMgr). Fixtures build a GameMgr, seed it via HeadlessEngineEnv.SeedCharaIds/SeedNetUser, and pass it to the mgr's ctor — no ambient reach. Node side (SVSim.BattleNode/SessionBattleEngine): _ctx replaced with a plain GameMgr field; 34 `using var _ambient = BattleAmbient.Enter(_ctx)` scope wraps ripped from every accessor and mutator; EngineGlobalInit.WirePerSessionGameMgr takes GameMgr as a param and runs from SessionBattleEngine.SetupInternal BEFORE mgr construction. Test side: TestBattleScope deleted; 18 fixture [SetUp]s migrated to `HeadlessEngineEnv.EnsureProcessGlobals()`; MultiInstanceEngineTests rewritten around per-mgr construction (GetIns() → null is the pinned invariant). ## Regression fixes - **chunk-48** (MulliganCtrl): chunk-35's `= null` stubs on card lookups broke the live receive-driven Deal path (BattlePlayerBase.DrawCard NRE'd downstream of NetworkPlayerMulliganCtrl.StartMulliganVfx). Restored the three lookups via `_battlePlayer.BattleMgr.GetBattleCardIdx`. Engine tests were satisfied by the WireMulliganPhase seam; unit tests exposed the live-path gap. ## Ship state - SVSim.BattleEngine.Tests: 56/56 pass, 2 skip - SVSim.UnitTests: 1554/1554 pass (was 1523/31-fail before chunk 48) - Solution build: 0 source warnings (40 pre-existing NU1902 MessagePack CVEs in SVSim.EmulatedEntrypoint, unrelated) - Sequential PVP smoke: verified live (two back-to-back battles, no regression on cleanup/spinup) - Concurrent PVP smoke: verified live Adds tools/engine-port/ClosureAnalyzer/ — the Roslyn transitive-type-closure analyzer needed to make future cascade cleanup safe (per feedback memory "Engine cleanup needs closure tool" from the 2026-06-28 pass-3 failure). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1420 lines
46 KiB
C#
1420 lines
46 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Cute;
|
|
using UnityEngine;
|
|
using Wizard;
|
|
|
|
public class GachaUI : UIBase
|
|
{
|
|
public enum CardPackType
|
|
{
|
|
NONE,
|
|
CRYSTAL_MULTI,
|
|
DAILY,
|
|
TICKET,
|
|
TICKET_MULTI,
|
|
RUPY,
|
|
RUPY_MULTI,
|
|
CRYSTAL_SPECIAL,
|
|
CRYSTAL_SELECT_SKIN,
|
|
FREE_PACKS,
|
|
FREE_PACK_WITH_SKIN,
|
|
ROTATION_STARTER_PACK,
|
|
CRYSTAL_ACQUIRE_SKIN_CARD_PACK
|
|
}
|
|
|
|
private static GachaUI _gachaUiInstance;
|
|
|
|
[SerializeField]
|
|
private UIToggle _skipToggleBtn;
|
|
|
|
[SerializeField]
|
|
private CardPackManager _cardPackManager;
|
|
|
|
[SerializeField]
|
|
private GameObject _cardPackTopPanel;
|
|
|
|
[SerializeField]
|
|
private GameObject _backGroundObj;
|
|
|
|
[SerializeField]
|
|
private UIAnchor _particleAnchor;
|
|
|
|
[SerializeField]
|
|
private CardDetailUI _cardDetailPrefab;
|
|
|
|
private CardDetailUI _cardDetailDialog;
|
|
|
|
[SerializeField]
|
|
private GameObject _cardPackOpenUiPanel;
|
|
|
|
[SerializeField]
|
|
private PurchaseConfirm _prefabDialogPurchaseConfirm;
|
|
|
|
[SerializeField]
|
|
private GachaSelectBuyNumPopup _prefabDialogSelectBuyNumber;
|
|
|
|
[SerializeField]
|
|
private GachaResultBuyCardPackDialog _gachaResultDialog;
|
|
|
|
[SerializeField]
|
|
private GameObject _prefabRewardDialog;
|
|
|
|
private bool _isSkipOpen;
|
|
|
|
private GameObject _cardPackTopBar;
|
|
|
|
private TopBar _topBar;
|
|
|
|
private List<string> _loadList = new List<string>();
|
|
|
|
private PackOpenDetail _packOpenData;
|
|
|
|
[SerializeField]
|
|
private ShopDrumrollScrollManager _drumrollManager;
|
|
|
|
[SerializeField]
|
|
private GameObject _scrollStopCollider;
|
|
|
|
private int _openedPackId;
|
|
|
|
private bool _isCheckGachaPointConfirmDialog;
|
|
|
|
private bool _isPackOpen;
|
|
|
|
private bool _isRotationStarterCardPackOpen;
|
|
|
|
private bool _isBuyConnect;
|
|
|
|
[SerializeField]
|
|
private UIButton _rotationBtn;
|
|
|
|
[SerializeField]
|
|
private UIButton _unlimitedBtn;
|
|
|
|
[SerializeField]
|
|
private GameObject _rotationBadge;
|
|
|
|
[SerializeField]
|
|
private GameObject _unlimitedBadge;
|
|
|
|
[SerializeField]
|
|
private GachaPointExchangeDialog _gachaPointExchangeDialog;
|
|
|
|
private bool _isTutorial;
|
|
|
|
private bool _isRotation = true;
|
|
|
|
private TimerMgr _timerManager;
|
|
|
|
[SerializeField]
|
|
private GachaPackAreaLayout _packAreaLayout;
|
|
|
|
[SerializeField]
|
|
private NotificatonAnimation _notificationAnimationPrefab;
|
|
|
|
[SerializeField]
|
|
private GameObject _achieveLog;
|
|
|
|
[SerializeField]
|
|
public GameObject StarterClassSelectDialog;
|
|
|
|
private NotificatonAnimation _notificationAnimation;
|
|
|
|
private int _localSelectedClassId = 10;
|
|
|
|
public bool IsDuringPackOpen { get; private set; }
|
|
|
|
public override void onFirstStart()
|
|
{
|
|
_gachaUiInstance = this;
|
|
base.IsShowFooterMenu = true;
|
|
_timerManager = new TimerMgr();
|
|
_backGroundObj.layer = LayerMask.NameToLayer("FrontUI");
|
|
SystemText systemText = Data.SystemText;
|
|
UIManager.ChangeViewSceneParam changeViewSceneParam = new UIManager.ChangeViewSceneParam();
|
|
changeViewSceneParam.MyPageMenuIndex = 5;
|
|
changeViewSceneParam.IsCutCardMotion = true;
|
|
changeViewSceneParam.OnFinishChangeView = delegate
|
|
{
|
|
MyPageMenu.Instance.GoToShopCard();
|
|
};
|
|
_topBar = UIManager.GetInstance().CreateTopBar(base.gameObject, systemText.Get("Shop_0001"), UIManager.ViewScene.MyPage, MoneyDraw: true, changeViewSceneParam);
|
|
_cardPackTopBar = _topBar.gameObject;
|
|
_cardPackTopBar.SetActive(value: true);
|
|
if (_cardDetailDialog == null)
|
|
{
|
|
int num = LayerMask.NameToLayer("Detail");
|
|
UIManager.GetInstance().SetLayerRecursive(_cardPackOpenUiPanel.transform, num);
|
|
_cardDetailDialog = UnityEngine.Object.Instantiate(_cardDetailPrefab);
|
|
_cardDetailDialog.transform.parent = base.transform;
|
|
_cardDetailDialog.transform.localPosition = Vector3.zero;
|
|
_cardDetailDialog.transform.localScale = Vector3.one;
|
|
_cardDetailDialog.gameObject.SetActive(value: false);
|
|
_cardDetailDialog.Initialize(num, CardMaster.CardMasterId.Default);
|
|
_cardDetailDialog.IsShowFlavorTextButton = true;
|
|
_cardDetailDialog.IsShowVoiceButton = true;
|
|
_cardDetailDialog.IsShowEvolutionButton = true;
|
|
}
|
|
if (!PlayerPrefsWrapper.GetValue(PlayerPrefsWrapper.CARDPACK_CARD_AUTO_OPEN))
|
|
{
|
|
_isSkipOpen = false;
|
|
_skipToggleBtn.value = false;
|
|
}
|
|
else
|
|
{
|
|
_isSkipOpen = true;
|
|
_skipToggleBtn.value = true;
|
|
}
|
|
EventDelegate.Add(_skipToggleBtn.onChange, OnChangeSkipBtn);
|
|
_particleAnchor.uiCamera = UIManager.GetInstance().getCamera();
|
|
_particleAnchor.enabled = true;
|
|
_rotationBtn.onClick.Add(new EventDelegate(delegate
|
|
{
|
|
if (!_isRotation)
|
|
{
|
|
SetFormat(Format.Rotation);
|
|
|
|
TweenAlpha.Begin(_drumrollManager.gameObject, 0f, 0f);
|
|
CreateCardPackTop(0, fade: false);
|
|
}
|
|
}));
|
|
_unlimitedBtn.onClick.Add(new EventDelegate(delegate
|
|
{
|
|
if (_isRotation)
|
|
{
|
|
SetFormat(Format.Unlimited);
|
|
|
|
TweenAlpha.Begin(_drumrollManager.gameObject, 0f, 0f);
|
|
CreateCardPackTop(0, fade: false);
|
|
}
|
|
}));
|
|
_isTutorial = Data.Load.data._userTutorial.TutorialStep == 41;
|
|
if (_isTutorial)
|
|
{
|
|
ShowTutorialBuyCardPackDialog();
|
|
}
|
|
ShowFirstTips();
|
|
_packAreaLayout.SetCardDetailDialog(_cardDetailDialog);
|
|
_packAreaLayout.SetTimer(_timerManager);
|
|
_packAreaLayout.SetOnClickExchangePackPoint(OnPushExchangeGachaPoint);
|
|
_packAreaLayout.SetOnClickPurchaseButton(OnClickPurchaseButton);
|
|
base.onFirstStart();
|
|
}
|
|
|
|
private void ShowFirstTips()
|
|
{
|
|
if (!_isTutorial)
|
|
{
|
|
UIManager.GetInstance().CheckFirstTips(FirstTips.TipsType.GachaPointExchange, delegate
|
|
{
|
|
});
|
|
}
|
|
}
|
|
|
|
public override void onMove()
|
|
{
|
|
_timerManager.Update();
|
|
base.onMove();
|
|
}
|
|
|
|
private void ShowTutorialBuyCardPackDialog()
|
|
{
|
|
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
|
dialogBase.SetText(Data.SystemText.Get("Tutorial_0013"));
|
|
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.OkBtn);
|
|
dialogBase.gameObject.SetLayer(base.gameObject.layer, isSetChildren: true);
|
|
dialogBase.SetBackViewLayer(base.gameObject.layer);
|
|
dialogBase.SetPanelDepth(1000);
|
|
dialogBase.SetPanelSortingOrder(37);
|
|
MyPageMenu.Instance.SetGuideToOkOnlyDialog(dialogBase);
|
|
dialogBase.OnClose = delegate
|
|
{
|
|
_packAreaLayout.SetTutorialTicketPurchasebutton();
|
|
};
|
|
}
|
|
|
|
protected override void onOpen()
|
|
{
|
|
base.onOpen();
|
|
UIManager.GetInstance().UpDateRupyNum();
|
|
UIManager.GetInstance().UpDateCrystalNum();
|
|
if (_cardPackTopBar != null)
|
|
{
|
|
_cardPackTopBar.SetActive(value: true);
|
|
}
|
|
UIManager.GetInstance().ShowFooterMenu(isShow: true);
|
|
if (_isTutorial && Data.Load.data._userTutorial.TutorialStep == 100)
|
|
{
|
|
SetTutorialMode(isTutorial: false);
|
|
UIManager.GetInstance()._Footer.UpdateArenaBadgeIcon();
|
|
UIManager.GetInstance()._Footer.UpdateSoloPlayBadgeIcon();
|
|
}
|
|
GetPackInfoTask();
|
|
}
|
|
|
|
protected override void onClose()
|
|
{
|
|
base.onClose();
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.CARDPACK_CARD_AUTO_OPEN, _isSkipOpen);
|
|
if (_isPackOpen)
|
|
{
|
|
List<UIBase_CardManager.CardObjData> cardList2DObjs = UIManager.GetInstance().getCardList2DObjs();
|
|
if (cardList2DObjs.Count > 0)
|
|
{
|
|
cardList2DObjs.ForEach(delegate(UIBase_CardManager.CardObjData g)
|
|
{
|
|
UnityEngine.Object.Destroy(g.CardObj);
|
|
});
|
|
}
|
|
if (Toolbox.ResourcesManager.CardListAssetPathList.Count > 0)
|
|
{
|
|
_loadList.AddRange(Toolbox.ResourcesManager.CardListAssetPathList);
|
|
Toolbox.ResourcesManager.CardListAssetPathList.Clear();
|
|
}
|
|
MyPageMenu.SetEnableReloadCard();
|
|
}
|
|
_timerManager.Dispose();
|
|
UnloadAssets();
|
|
UIManager.GetInstance().DestroyView(UIManager.ViewScene.Gacha);
|
|
}
|
|
|
|
private void UnloadAssets()
|
|
{
|
|
Toolbox.ResourcesManager.RemoveAssetGroup(_loadList);
|
|
_loadList.Clear();
|
|
_packAreaLayout.ClearPackBannerResources();
|
|
}
|
|
|
|
private void GetPackInfoTask()
|
|
{
|
|
bool flag = Data.Load.data._userTutorial.TutorialStep != 100;
|
|
PackInfoTask task = new PackInfoTask(flag ? ApiType.Type.PackInfoTutorial : ApiType.Type.PackInfo);
|
|
task.SetParameter();
|
|
StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
|
|
{
|
|
StartLoadCardPack(task.PackFirstTransitionData);
|
|
UIManager.GetInstance()._Footer.SetShopBadgeIconVisible(task.NeedsFooterBadgeIcon);
|
|
}));
|
|
}
|
|
|
|
private void StartLoadCardPack(PackInfoTask.PackFirstTransition packFirstTransition)
|
|
{
|
|
bool isTurorialEnd = _isTutorial && Data.Load.data._userTutorial.TutorialStep == 100;
|
|
StartCoroutine(LoadCardPack_Coroutine(delegate
|
|
{
|
|
int index = SetFormatAndGetIndex(isTurorialEnd, packFirstTransition);
|
|
CreateCardPackTop(index);
|
|
}));
|
|
}
|
|
|
|
private int SetFormatAndGetIndex(bool isTutorialEnd, PackInfoTask.PackFirstTransition packFirstTransition)
|
|
{
|
|
int viewPackId = GetViewPackId(isTutorialEnd, packFirstTransition);
|
|
SetFormat(GetFormatByViewPackId(viewPackId));
|
|
List<PackConfig> currentFormatPackList = GetCurrentFormatPackList();
|
|
int num = currentFormatPackList.FindIndex((PackConfig data) => data.PackId == viewPackId);
|
|
if (num < 0)
|
|
{
|
|
num = 0;
|
|
viewPackId = currentFormatPackList[num].PackId;
|
|
}
|
|
if (packFirstTransition != null && packFirstTransition.PackId == viewPackId)
|
|
{
|
|
packFirstTransition.SaveViewed();
|
|
}
|
|
return num;
|
|
}
|
|
|
|
private int GetViewPackId(bool isTutorialEnd, PackInfoTask.PackFirstTransition packFirstTransition)
|
|
{
|
|
if (Data.Load.data._userTutorial.TutorialStep == 41)
|
|
{
|
|
return GetCurrentLegendPackId();
|
|
}
|
|
if (isTutorialEnd)
|
|
{
|
|
int currentTsRotationTicketPackId = GetCurrentTsRotationTicketPackId();
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID, currentTsRotationTicketPackId);
|
|
packFirstTransition?.SaveViewed();
|
|
return currentTsRotationTicketPackId;
|
|
}
|
|
if (_isPackOpen)
|
|
{
|
|
int num = PlayerPrefsWrapper.GetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID);
|
|
if (IsTsStepupFirstPackId(num))
|
|
{
|
|
PackConfig packConfig = Data.PackInfo.dataList.Find((PackConfig p) => IsTsStepupSecondPackId(p.PackId));
|
|
if (packConfig != null)
|
|
{
|
|
num = packConfig.PackId;
|
|
}
|
|
}
|
|
return num;
|
|
}
|
|
GachaUIParam currentSceneParam = UIManager.GetInstance().GetCurrentSceneParam<GachaUIParam>();
|
|
if (currentSceneParam.EnableOverRideDefaultPackId)
|
|
{
|
|
int overrideDefaultPackId = currentSceneParam.OverrideDefaultPackId;
|
|
switch (overrideDefaultPackId)
|
|
{
|
|
case 90001:
|
|
return GetCurrentLegendPackId();
|
|
case 80001:
|
|
return GetCurrentTsRotationTicketPackId();
|
|
default:
|
|
{
|
|
PackConfig additionalPackByBasePackId = GetAdditionalPackByBasePackId(overrideDefaultPackId);
|
|
if (additionalPackByBasePackId != null)
|
|
{
|
|
if (packFirstTransition != null && packFirstTransition.IsUpdate() && additionalPackByBasePackId.PackId == packFirstTransition.PackId)
|
|
{
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID, packFirstTransition.PackId);
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID_IN_EXIST_ADDITIONALPACK, packFirstTransition.PackId);
|
|
return packFirstTransition.PackId;
|
|
}
|
|
if (additionalPackByBasePackId.PackId == PlayerPrefsWrapper.GetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID_IN_EXIST_ADDITIONALPACK))
|
|
{
|
|
return additionalPackByBasePackId.PackId;
|
|
}
|
|
}
|
|
return GetTsSkinPickupPackByBasePackId(overrideDefaultPackId)?.PackId ?? overrideDefaultPackId;
|
|
}
|
|
}
|
|
}
|
|
if (packFirstTransition != null && packFirstTransition.IsUpdate())
|
|
{
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID, packFirstTransition.PackId);
|
|
if (IsAdditionalPackId(packFirstTransition.PackId))
|
|
{
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID_IN_EXIST_ADDITIONALPACK, packFirstTransition.PackId);
|
|
}
|
|
return packFirstTransition.PackId;
|
|
}
|
|
return PlayerPrefsWrapper.GetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID);
|
|
}
|
|
|
|
private Format GetFormatByViewPackId(int viewPackId)
|
|
{
|
|
if (viewPackId != -1 && IsUnlimitedCardPackId(viewPackId))
|
|
{
|
|
return Format.Unlimited;
|
|
}
|
|
return Format.Rotation;
|
|
}
|
|
|
|
private IEnumerator LoadCardPack_Coroutine(Action callback)
|
|
{
|
|
ResourcesManager resMgr = Toolbox.ResourcesManager;
|
|
bool needTutorialTips = _isTutorial;
|
|
bool isSkipped = _cardPackManager.IsSkipped;
|
|
if (isSkipped && _packOpenData != null)
|
|
{
|
|
needTutorialTips = false;
|
|
_gachaResultDialog.Create(_packOpenData, _cardDetailDialog);
|
|
_gachaResultDialog.AddOnClose(delegate
|
|
{
|
|
CreateRewardFromMisshonDialog(needTutorialTips);
|
|
ShowTutorialFinishTips();
|
|
});
|
|
while (_gachaResultDialog.IsLoading)
|
|
{
|
|
yield return null;
|
|
}
|
|
UIManager.GetInstance().closeInSceneCenterLoading();
|
|
}
|
|
if (_packOpenData != null)
|
|
{
|
|
if (_packOpenData.reward_list.Count > 0)
|
|
{
|
|
_gachaResultDialog.IsFlickEnable = false;
|
|
CreateRewardDialog(needTutorialTips, isSkipped);
|
|
}
|
|
else if (!isSkipped)
|
|
{
|
|
CreateRewardFromMisshonDialog(needTutorialTips);
|
|
}
|
|
}
|
|
_packOpenData = null;
|
|
List<PackConfig> dataList = Data.PackInfo.dataList;
|
|
for (int num = 0; num < dataList.Count; num++)
|
|
{
|
|
PackConfig packConfig = dataList[num];
|
|
_loadList.Add(packConfig.GetPackPosterTexturePath(isFetch: false));
|
|
_loadList.Add(packConfig.GetPackTitleLogoTexturePath(isFetch: false));
|
|
_loadList.Add(packConfig.GetPackIconTexturePath(isFetch: false));
|
|
_loadList.Add(packConfig.GetPackDrumrollLogoTexturePath(isFetch: false));
|
|
if (packConfig.IsPrerelease && !packConfig.PrereleasePurchaseInfo.IsCountLimitedPrerelease)
|
|
{
|
|
_loadList.Add(packConfig.GetPackBounsPosterTexturePath(isFetch: false));
|
|
}
|
|
if (packConfig.IsShowAppealImage)
|
|
{
|
|
string assetTypePath = Toolbox.ResourcesManager.GetAssetTypePath($"card_pack_{packConfig.PackId}_poster_sub", ResourcesManager.AssetLoadPathType.ShopCardPack);
|
|
_loadList.Add(assetTypePath);
|
|
}
|
|
}
|
|
_loadList.Add(resMgr.GetAssetTypePath("cmn_shop_icon_1", ResourcesManager.AssetLoadPathType.Effect2D));
|
|
resMgr.StartCoroutine_LoadAssetGroupAsync(_loadList, delegate
|
|
{
|
|
callback.Call();
|
|
});
|
|
}
|
|
|
|
private void CreateRewardFromMisshonDialog(bool needTutorialTips)
|
|
{
|
|
if (Data.PackOpen.data.AchievedInfo != null && Data.PackOpen.data.AchievedInfo._rewards.Count > 0)
|
|
{
|
|
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
|
dialogBase.SetSize(DialogBase.Size.M);
|
|
dialogBase.SetTitleLabel(Data.SystemText.Get("Story_0029"));
|
|
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.OkBtn);
|
|
dialogBase.gameObject.layer = LayerMask.NameToLayer("MyPage");
|
|
dialogBase.SetBackViewLayer(LayerMask.NameToLayer("MyPage"));
|
|
dialogBase.SetPanelSortingOrder(2);
|
|
dialogBase.gameObject.transform.localPosition = Vector3.back;
|
|
dialogBase.SetBackViewPosition(Vector3.back);
|
|
dialogBase.SetPanelDepth(600);
|
|
dialogBase.OnClose = delegate
|
|
{
|
|
DialogCreator.ShowCpAppliedDialog(Data.PackOpen.data.AchievedInfo._lotteryData, delegate
|
|
{
|
|
if (needTutorialTips)
|
|
{
|
|
ShowTutorialFinishTips();
|
|
}
|
|
ShowGachaPointExchangeable(delegate
|
|
{
|
|
UIManager.GetInstance().StartCoroutine(ShowAchieveLog(Data.PackOpen.data.NotificatonAnimationParams));
|
|
});
|
|
});
|
|
};
|
|
RewardBase component = NGUITools.AddChild(dialogBase.gameObject, _prefabRewardDialog.gameObject).GetComponent<RewardBase>();
|
|
component.GetComponent<UIPanel>().depth = 610;
|
|
component.GetComponent<UIPanel>().sortingOrder = 2;
|
|
component.SetCardDetailUI(_cardDetailDialog);
|
|
for (int num = 0; num < Data.PackOpen.data.AchievedInfo._rewards.Count; num++)
|
|
{
|
|
component.AddReward(Data.PackOpen.data.AchievedInfo._rewards[num]);
|
|
}
|
|
component.EndCreate();
|
|
return;
|
|
}
|
|
DialogCreator.ShowCpAppliedDialog(Data.PackOpen.data.AchievedInfo._lotteryData, delegate
|
|
{
|
|
if (needTutorialTips)
|
|
{
|
|
ShowTutorialFinishTips();
|
|
}
|
|
ShowGachaPointExchangeable(delegate
|
|
{
|
|
UIManager.GetInstance().StartCoroutine(ShowAchieveLog(Data.PackOpen.data.NotificatonAnimationParams));
|
|
});
|
|
});
|
|
}
|
|
|
|
private void CreateRewardDialog(bool needTutorialTips, bool isSkipped)
|
|
{
|
|
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
|
dialogBase.SetSize(DialogBase.Size.M);
|
|
dialogBase.SetTitleLabel(Data.SystemText.Get("Dia_BuyCard_004_Title"));
|
|
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.OkBtn);
|
|
dialogBase.gameObject.layer = LayerMask.NameToLayer("MyPage");
|
|
dialogBase.SetBackViewLayer(LayerMask.NameToLayer("MyPage"));
|
|
dialogBase.SetPanelSortingOrder(2);
|
|
dialogBase.gameObject.transform.localPosition = Vector3.back;
|
|
dialogBase.SetBackViewPosition(Vector3.back);
|
|
dialogBase.SetPanelDepth(600);
|
|
dialogBase.OnClose = delegate
|
|
{
|
|
_gachaResultDialog.IsFlickEnable = true;
|
|
if (!isSkipped)
|
|
{
|
|
CreateRewardFromMisshonDialog(needTutorialTips);
|
|
}
|
|
};
|
|
RewardBase component = NGUITools.AddChild(dialogBase.gameObject, _prefabRewardDialog.gameObject).GetComponent<RewardBase>();
|
|
component.GetComponent<UIPanel>().depth = 610;
|
|
component.GetComponent<UIPanel>().sortingOrder = 2;
|
|
component.SetCardDetailUI(_cardDetailDialog);
|
|
for (int num = 0; num < _packOpenData.reward_list.Count; num++)
|
|
{
|
|
component.AddReward(_packOpenData.reward_list[num]);
|
|
}
|
|
component.EndCreate();
|
|
}
|
|
|
|
private void ShowTutorialFinishTips()
|
|
{
|
|
if (_isTutorial)
|
|
{
|
|
_isTutorial = false;
|
|
UIManager.GetInstance().StartFirstTips(FirstTips.TipsType.ShopCardPack, delegate
|
|
{
|
|
/* Pre-Phase-5b: headless has no InputMgr */
|
|
});
|
|
FirstTips.SaveFinishFirstTips(FirstTips.TipsType.GachaPointExchange);
|
|
}
|
|
}
|
|
|
|
private void CreateCardPackTop(int index, bool fade = true)
|
|
{
|
|
IsDuringPackOpen = false;
|
|
if (!_cardPackTopPanel.activeSelf)
|
|
{
|
|
_cardPackTopPanel.SetActive(value: true);
|
|
}
|
|
UpdateUserItemCount();
|
|
List<PackConfig> packList = GetCurrentFormatPackList();
|
|
List<ShopDrumrollScrollManager.DrumrollItem> list = new List<ShopDrumrollScrollManager.DrumrollItem>();
|
|
foreach (PackConfig item in packList)
|
|
{
|
|
Texture logoImage = Toolbox.ResourcesManager.LoadObject(item.GetPackDrumrollLogoTexturePath(isFetch: true)) as Texture;
|
|
bool flag = false;
|
|
bool isNew = false;
|
|
if (Data.Load.data._userTutorial.TutorialStep != 41)
|
|
{
|
|
flag = item.IsPrerelease;
|
|
isNew = item.IsNew && !flag;
|
|
}
|
|
list.Add(new ShopDrumrollScrollManager.DrumrollItem(logoImage, isNew, flag));
|
|
}
|
|
List<PackConfig> list2 = null;
|
|
List<PackConfig> list3 = null;
|
|
if (_isRotation)
|
|
{
|
|
list2 = packList;
|
|
list3 = GetPackList(rotation: false);
|
|
}
|
|
else
|
|
{
|
|
list2 = GetPackList(rotation: true);
|
|
list3 = packList;
|
|
}
|
|
_rotationBadge.SetActive(value: false);
|
|
for (int i = 0; i < list2.Count; i++)
|
|
{
|
|
if (PlayerStaticData.GetHaveUserGoods(UserGoods.Type.Item, list2[i].GetTicketId()) > 0 && !list2[i].IsPrerelease)
|
|
{
|
|
_rotationBadge.gameObject.SetActive(value: true);
|
|
break;
|
|
}
|
|
}
|
|
_unlimitedBadge.SetActive(value: false);
|
|
for (int j = 0; j < list3.Count; j++)
|
|
{
|
|
if (PlayerStaticData.GetHaveUserGoods(UserGoods.Type.Item, list3[j].GetTicketId()) > 0)
|
|
{
|
|
_unlimitedBadge.gameObject.SetActive(value: true);
|
|
break;
|
|
}
|
|
}
|
|
StartCoroutine(_drumrollManager.CreateDrumrollScroll_Coroutine(list, index, ChangePackTop, delegate
|
|
{
|
|
SetEnableScroll(enable: true);
|
|
for (int k = 0; k < packList.Count; k++)
|
|
{
|
|
PackConfig packConfig = packList[k];
|
|
int haveUserGoods = PlayerStaticData.GetHaveUserGoods(UserGoods.Type.Item, packConfig.GetTicketId());
|
|
ShopDrumrollScrollItem component = _drumrollManager.ItemList[k].GetComponent<ShopDrumrollScrollItem>();
|
|
bool activeBadge = haveUserGoods > 0;
|
|
if (packConfig.IsPrerelease && packConfig.PrereleasePurchaseInfo.TicketRupyCountRemain == 0)
|
|
{
|
|
activeBadge = false;
|
|
}
|
|
component.SetActiveBadge(activeBadge);
|
|
if (Data.Load.data._userTutorial.TutorialStep == 41)
|
|
{
|
|
UIManager.SetObjectToGrey(component.gameObject, !IsLegendPackId(packConfig.PackId));
|
|
}
|
|
}
|
|
ChangePackTop(index);
|
|
if (fade)
|
|
{
|
|
if (_isPackOpen)
|
|
{
|
|
/* Pre-Phase-5b: headless has no InputMgr */
|
|
}
|
|
UIManager.GetInstance().OnReadyViewScene(isFadein: true);
|
|
}
|
|
if (Data.Load.data._userTutorial.TutorialStep == 41)
|
|
{
|
|
SetTutorialMode(isTutorial: true);
|
|
}
|
|
StartCoroutine(ShowTimeslipResurgentFirstTips());
|
|
}));
|
|
}
|
|
|
|
private IEnumerator ShowTimeslipResurgentFirstTips()
|
|
{
|
|
if (!_isTutorial && !_isRotation)
|
|
{
|
|
while (FirstTips.IsFirstTipsOpen(FirstTips.TipsType.GachaPointExchange) || UIManager.GetInstance().IsActiveFirstTips())
|
|
{
|
|
yield return null;
|
|
}
|
|
UIManager.GetInstance().CheckFirstTips(FirstTips.TipsType.TimeslipResurgentCard);
|
|
}
|
|
}
|
|
|
|
private void SetTutorialMode(bool isTutorial)
|
|
{
|
|
UIManager.SetObjectToGrey(_unlimitedBtn.gameObject, isTutorial);
|
|
UIManager.SetObjectToGrey(_topBar.BackButton.gameObject, isTutorial);
|
|
UIManager.SetObjectToGrey(_skipToggleBtn.gameObject, isTutorial);
|
|
_packAreaLayout.SetToGrayRateButton(isTutorial);
|
|
UIManager.SetObjectToGrey(_topBar.BuyCrystalButton.gameObject, b: true);
|
|
_topBar.BuyCrystalButton.isEnabled = false;
|
|
SetEnableScroll(!isTutorial);
|
|
Footer footer = UIManager.GetInstance()._Footer;
|
|
for (int i = 0; i < footer._underButtons.Length; i++)
|
|
{
|
|
footer.SetButtonEnableColorChange(i, !isTutorial);
|
|
}
|
|
footer.SetButtonEnable(5, !isTutorial);
|
|
float alpha = 1f;
|
|
if (!isTutorial)
|
|
{
|
|
MyPageMenu.Instance.FinishTutorialMode();
|
|
if (!_isSkipOpen)
|
|
{
|
|
alpha = 0f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
alpha = 0f;
|
|
}
|
|
_skipToggleBtn.activeSprite.gameObject.GetComponent<UISprite>().alpha = alpha;
|
|
}
|
|
|
|
private void SetEnableScroll(bool enable)
|
|
{
|
|
if (_scrollStopCollider != null)
|
|
{
|
|
_scrollStopCollider.SetActive(!enable);
|
|
}
|
|
}
|
|
|
|
public void UpdateUserItemCount()
|
|
{
|
|
_packAreaLayout.UpdateRupyCount(PlayerStaticData.UserRupyCount);
|
|
_packAreaLayout.UpdateCrystalCount(PlayerStaticData.UserCrystalCount);
|
|
}
|
|
|
|
private void OnChangeSkipBtn()
|
|
{
|
|
if (_skipToggleBtn.value != _isSkipOpen)
|
|
{
|
|
if (_skipToggleBtn.value)
|
|
{
|
|
_isSkipOpen = true;
|
|
|
|
}
|
|
else
|
|
{
|
|
_isSkipOpen = false;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private void GhachaPointConfirmDialog(PackConfig openedPackConfig, Action onFinish = null)
|
|
{
|
|
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
|
dialogBase.SetTitleLabel(Data.SystemText.Get("Shop_0171"));
|
|
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.BlueBtn_CancelBtn);
|
|
dialogBase.SetText(Data.SystemText.Get("Shop_0172"));
|
|
dialogBase.SetLayer("MyPage");
|
|
dialogBase.SetPanelSortingOrder(2);
|
|
dialogBase.gameObject.transform.localPosition = Vector3.back;
|
|
dialogBase.SetBackViewPosition(Vector3.back);
|
|
dialogBase.SetPanelDepth(600);
|
|
dialogBase.OnClose = delegate
|
|
{
|
|
onFinish.Call();
|
|
};
|
|
dialogBase.SetButtonText(Data.SystemText.Get("Shop_0154"));
|
|
dialogBase.onPushButton1 = delegate
|
|
{
|
|
OnPushExchangeGachaPoint(openedPackConfig);
|
|
};
|
|
}
|
|
|
|
private List<PackConfig> GetCurrentFormatPackList()
|
|
{
|
|
return GetPackList(_isRotation);
|
|
}
|
|
|
|
private List<PackConfig> GetPackList(bool rotation)
|
|
{
|
|
if (rotation)
|
|
{
|
|
Func<PackConfig, bool> rotationCheck = delegate(PackConfig packInfo)
|
|
{
|
|
if (packInfo.IsHideNotEnoughBuy)
|
|
{
|
|
return packInfo.EnableBuyPack();
|
|
}
|
|
return packInfo.IsRotationStarterCardPack ? (packInfo.OpenCountLimit > packInfo.OpenCount || _isRotationStarterCardPackOpen) : (!IsUnlimitedCardPackId(packInfo.PackId));
|
|
};
|
|
return Data.PackInfo.dataList.FindAll((PackConfig data) => rotationCheck(data));
|
|
}
|
|
return Data.PackInfo.dataList.FindAll((PackConfig data) => IsUnlimitedCardPackId(data.PackId));
|
|
}
|
|
|
|
private bool IsBasicPackId(int packId)
|
|
{
|
|
if (10000 < packId)
|
|
{
|
|
return packId <= 14999;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool IsAdditionalPackId(int packId)
|
|
{
|
|
if (15000 < packId)
|
|
{
|
|
return packId <= 15999;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool IsTsSkinPickupPackId(int packId)
|
|
{
|
|
if (16000 < packId)
|
|
{
|
|
return packId <= 16999;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool IsTsStepupPackId(int packId)
|
|
{
|
|
if (!IsTsStepupFirstPackId(packId))
|
|
{
|
|
return IsTsStepupSecondPackId(packId);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static bool IsTsStepupFirstPackId(int packId)
|
|
{
|
|
if (97000 < packId)
|
|
{
|
|
return packId <= 97999;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static bool IsTsStepupSecondPackId(int packId)
|
|
{
|
|
if (98000 < packId)
|
|
{
|
|
return packId <= 98999;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private bool IsTsRotationTicketPackId(int packId)
|
|
{
|
|
if (80000 < packId)
|
|
{
|
|
return packId <= 89001;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private bool IsLegendPackId(int packId)
|
|
{
|
|
if (packId != 90001)
|
|
{
|
|
return packId >= 99000;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private int GetCurrentTsRotationTicketPackId()
|
|
{
|
|
return Data.PackInfo.dataList.FirstOrDefault((PackConfig p) => IsTsRotationTicketPackId(p.PackId)).PackId;
|
|
}
|
|
|
|
private int GetCurrentLegendPackId()
|
|
{
|
|
return Data.PackInfo.dataList.FirstOrDefault((PackConfig p) => IsLegendPackId(p.PackId)).PackId;
|
|
}
|
|
|
|
private PackConfig GetAdditionalPackByBasePackId(int basePackId)
|
|
{
|
|
List<PackConfig> list = Data.PackInfo.dataList.FindAll((PackConfig p) => p.BasePackId == basePackId);
|
|
PackConfig result = null;
|
|
if (list != null)
|
|
{
|
|
result = list.FirstOrDefault((PackConfig p) => IsAdditionalPackId(p.PackId));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private PackConfig GetTsSkinPickupPackByBasePackId(int basePackId)
|
|
{
|
|
List<PackConfig> list = Data.PackInfo.dataList.FindAll((PackConfig p) => p.BasePackId == basePackId);
|
|
PackConfig result = null;
|
|
if (list != null)
|
|
{
|
|
result = list.FirstOrDefault((PackConfig p) => IsTsSkinPickupPackId(p.PackId));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private bool IsUnlimitedCardPackId(int packId)
|
|
{
|
|
if (!IsBasicPackId(packId))
|
|
{
|
|
return false;
|
|
}
|
|
if (Data.Load.data.RotationCardSetList.Contains(packId))
|
|
{
|
|
return false;
|
|
}
|
|
if (Prerelease.Status == Prerelease.eStatus.PRE_ROTATION && Prerelease.Instance.RotationCardSetList.Contains(packId))
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void SetFormat(Format format)
|
|
{
|
|
_isRotation = format == Format.Rotation;
|
|
if (format == Format.Rotation)
|
|
{
|
|
_rotationBtn.normalSprite = "btn_gacha_timesliprotation_on";
|
|
_unlimitedBtn.normalSprite = "btn_gacha_unlimited_off";
|
|
}
|
|
else
|
|
{
|
|
_rotationBtn.normalSprite = "btn_gacha_timesliprotation_off";
|
|
_unlimitedBtn.normalSprite = "btn_gacha_unlimited_on";
|
|
}
|
|
}
|
|
|
|
private void ShowGachaPointExchangeable(Action onFinish = null)
|
|
{
|
|
if (!_isCheckGachaPointConfirmDialog)
|
|
{
|
|
onFinish.Call();
|
|
return;
|
|
}
|
|
_isCheckGachaPointConfirmDialog = false;
|
|
PackConfig openedPackInfo = Data.PackInfo.dataList.FirstOrDefault((PackConfig data) => data.PackId == _openedPackId);
|
|
if (openedPackInfo == null || openedPackInfo.GachaPointData == null)
|
|
{
|
|
onFinish.Call();
|
|
return;
|
|
}
|
|
PackConfig packConfig = ((!openedPackInfo.IsSpecialCardPack) ? openedPackInfo : Data.PackInfo.dataList.FirstOrDefault((PackConfig data) => data.PackId == openedPackInfo.GachaPointData.GachaPointPackId));
|
|
if (packConfig.GachaPointData == null)
|
|
{
|
|
onFinish.Call();
|
|
}
|
|
else if (packConfig.GachaPointData.IsExchangeableGachaPoint)
|
|
{
|
|
GhachaPointConfirmDialog(packConfig, onFinish);
|
|
}
|
|
else
|
|
{
|
|
onFinish.Call();
|
|
}
|
|
}
|
|
|
|
private void OnPushExchangeGachaPoint(PackConfig packConfig)
|
|
{
|
|
|
|
_gachaPointExchangeDialog.CreateGachaPointExchangeDialog(packConfig, GetPackInfoTask);
|
|
}
|
|
|
|
private void ChangePackTop(int index)
|
|
{
|
|
PackConfig packConfig = GetCurrentFormatPackList()[index];
|
|
_packAreaLayout.ShowPackLayout(packConfig, _loadList);
|
|
}
|
|
|
|
private void OnClickPurchaseButton(PackConfig packConfig, PackChildGachaInfo gachaInfo)
|
|
{
|
|
|
|
switch (gachaInfo.PackType)
|
|
{
|
|
case CardPackType.CRYSTAL_SPECIAL:
|
|
if (CheckBuyPackWithCrystal(gachaInfo))
|
|
{
|
|
CreatePurchasePackConfirmDialog(packConfig, gachaInfo, 10);
|
|
}
|
|
break;
|
|
case CardPackType.DAILY:
|
|
if (CheckBuyPackWithCrystal(gachaInfo))
|
|
{
|
|
CreatePurchasePackConfirmDialog(packConfig, gachaInfo, 1);
|
|
}
|
|
break;
|
|
case CardPackType.CRYSTAL_SELECT_SKIN:
|
|
if (CheckBuyPackWithCrystal(gachaInfo))
|
|
{
|
|
PurchaseSelectSkinCard(packConfig, gachaInfo);
|
|
}
|
|
break;
|
|
case CardPackType.CRYSTAL_ACQUIRE_SKIN_CARD_PACK:
|
|
if (CheckBuyPackWithCrystal(gachaInfo))
|
|
{
|
|
PurchaseAcquireSkinCard(packConfig, gachaInfo);
|
|
}
|
|
break;
|
|
case CardPackType.CRYSTAL_MULTI:
|
|
if (CheckBuyPackWithCrystal(gachaInfo))
|
|
{
|
|
CreateSelectBuyNumDialog(packConfig, gachaInfo);
|
|
}
|
|
break;
|
|
case CardPackType.ROTATION_STARTER_PACK:
|
|
if (CheckBuyPackWithCrystal(gachaInfo))
|
|
{
|
|
StarterPackClassSelect(packConfig, gachaInfo);
|
|
}
|
|
break;
|
|
case CardPackType.TICKET_MULTI:
|
|
CreateSelectBuyNumDialog(packConfig, gachaInfo);
|
|
break;
|
|
case CardPackType.RUPY_MULTI:
|
|
CreateSelectBuyNumDialog(packConfig, gachaInfo);
|
|
break;
|
|
case CardPackType.FREE_PACKS:
|
|
case CardPackType.FREE_PACK_WITH_SKIN:
|
|
if (packConfig.Category == PackCategory.RotationStarterCardPack)
|
|
{
|
|
StarterPackClassSelect(packConfig, gachaInfo);
|
|
}
|
|
else
|
|
{
|
|
CreatePurchasePackConfirmDialog(packConfig, gachaInfo, gachaInfo.PackCountBuyPer);
|
|
}
|
|
break;
|
|
case CardPackType.TICKET:
|
|
case CardPackType.RUPY:
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void StarterPackClassSelect(PackConfig packConfig, PackChildGachaInfo info)
|
|
{
|
|
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
|
GameObject gameObject = UnityEngine.Object.Instantiate(StarterClassSelectDialog);
|
|
dialogBase.SetObj(gameObject);
|
|
gameObject.GetComponent<StarterClassSelectDialog>().Init(dialogBase, packConfig, info, _localSelectedClassId, PurchasePack, SetSelectedClassId);
|
|
}
|
|
|
|
private void SetSelectedClassId(int classId)
|
|
{
|
|
_localSelectedClassId = classId;
|
|
}
|
|
|
|
private bool CheckBuyPackWithCrystal(PackChildGachaInfo gachaInfo)
|
|
{
|
|
if (PlayerStaticData.IsLootBoxRegulation(PlayerStaticData.LootBoxType.GACHA))
|
|
{
|
|
LootBoxDialogUtility.CreateLootBoxRegulationDialog(PlayerStaticData.LootBoxType.GACHA);
|
|
return false;
|
|
}
|
|
int minimumPurchasePackNum = GetMinimumPurchasePackNum(gachaInfo);
|
|
if (PlayerStaticData.UserCrystalCount < gachaInfo.Cost * minimumPurchasePackNum)
|
|
{
|
|
ShopCommonUtility.CreateCrystalShortagePopup();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void CreateSelectBuyNumDialog(PackConfig packConfig, PackChildGachaInfo info)
|
|
{
|
|
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
|
dialogBase.SetSize(DialogBase.Size.M);
|
|
dialogBase.SetTitleLabel(Data.SystemText.Get("Dia_BuyCard_002_Title"));
|
|
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.NONE);
|
|
dialogBase.SetReturnMsg(null, "");
|
|
dialogBase.SetPanelDepth(610);
|
|
int ablePackNumByGachaInfo = GetAblePackNumByGachaInfo(packConfig, info);
|
|
GachaSelectBuyNumPopup gachaSelectBuyNumPopup = UnityEngine.Object.Instantiate(_prefabDialogSelectBuyNumber);
|
|
dialogBase.SetObj(gachaSelectBuyNumPopup.gameObject);
|
|
gachaSelectBuyNumPopup.Init(dialogBase, packConfig, info, ablePackNumByGachaInfo, CreatePurchasePackConfirmDialog);
|
|
if (Data.Load.data._userTutorial.TutorialStep == 41)
|
|
{
|
|
dialogBase.gameObject.SetLayer(base.gameObject.layer, isSetChildren: true);
|
|
dialogBase.SetBackViewLayer(base.gameObject.layer);
|
|
dialogBase.SetDialogNoClose();
|
|
gachaSelectBuyNumPopup.SetTutorialGuide();
|
|
}
|
|
}
|
|
|
|
private void CreatePurchasePackConfirmDialog(PackConfig packConfig, PackChildGachaInfo gachaInfo, int buyPackNum)
|
|
{
|
|
int ablePackNumByGachaInfo = GetAblePackNumByGachaInfo(packConfig, gachaInfo);
|
|
if (buyPackNum > ablePackNumByGachaInfo || ablePackNumByGachaInfo <= 0)
|
|
{
|
|
return;
|
|
}
|
|
SystemText systemText = Data.SystemText;
|
|
DialogBase dialogBase = ShopCommonUtility.CreateBasePopupPurchaseConfirm(new EventDelegate(delegate
|
|
{
|
|
PurchasePack(packConfig, gachaInfo, buyPackNum);
|
|
}));
|
|
dialogBase.SetTitleLabel(Data.SystemText.Get("Dia_BuyCard_001_Title"));
|
|
dialogBase.ClickSe_Btn1 = 0;
|
|
if (Data.Load.data._userTutorial.TutorialStep == 41)
|
|
{
|
|
dialogBase.SetButtonDisable(isEnableOK: false, isEnableCancel: true);
|
|
dialogBase.SetDialogNoClose();
|
|
dialogBase.gameObject.SetLayer(base.gameObject.layer, isSetChildren: true);
|
|
dialogBase.SetBackViewLayer(base.gameObject.layer);
|
|
dialogBase.SetPanelDepth(1000);
|
|
MyPageMenu.Instance.SetGuideEffect(dialogBase.Btn1GameObject.transform, new Vector3(-110f, 0f, 0f), -90f);
|
|
dialogBase.OnCloseStart = delegate
|
|
{
|
|
MyPageMenu.Instance.ResetFirstGuide();
|
|
};
|
|
}
|
|
PurchaseConfirm purchaseConfirm = UnityEngine.Object.Instantiate(_prefabDialogPurchaseConfirm);
|
|
dialogBase.SetObj(purchaseConfirm.gameObject);
|
|
string purchaseText = systemText.Get("Shop_0043", packConfig.Title, buyPackNum.ToString());
|
|
int num = gachaInfo.Cost * buyPackNum;
|
|
switch (gachaInfo.PackType)
|
|
{
|
|
case CardPackType.CRYSTAL_MULTI:
|
|
purchaseConfirm.SetClystalConfirmDialog(num, purchaseText, PlayerStaticData.UserCrystalCount, packConfig.ExpirtyInfo);
|
|
ChangePurchaceConfirmDialogLayout(purchaseConfirm, packConfig.PackId);
|
|
break;
|
|
case CardPackType.DAILY:
|
|
purchaseConfirm.SetClystalConfirmDialog(num, purchaseText, PlayerStaticData.UserCrystalCount, packConfig.ExpirtyInfo);
|
|
ChangePurchaceConfirmDialogLayout(purchaseConfirm, packConfig.PackId);
|
|
dialogBase.SetTitleLabel(Data.SystemText.Get("Dia_BuyCard_003_Title"));
|
|
break;
|
|
case CardPackType.TICKET_MULTI:
|
|
{
|
|
Texture icon = Toolbox.ResourcesManager.LoadObject(packConfig.GetPackIconTexturePath(isFetch: true)) as Texture;
|
|
purchaseConfirm.SetTicketConfirmDialog(num, purchaseText, gachaInfo.CostGoodsCount, icon);
|
|
break;
|
|
}
|
|
case CardPackType.RUPY_MULTI:
|
|
purchaseConfirm.SetRupyConfirmDialog(num, purchaseText, PlayerStaticData.UserRupyCount);
|
|
break;
|
|
case CardPackType.CRYSTAL_SPECIAL:
|
|
{
|
|
string purchaseText2 = systemText.Get("Shop_0101", packConfig.Title);
|
|
purchaseConfirm.SetClystalConfirmDialog(num, purchaseText2, PlayerStaticData.UserCrystalCount, packConfig.ExpirtyInfo);
|
|
ChangePurchaceConfirmDialogLayout(purchaseConfirm, packConfig.PackId);
|
|
dialogBase.SetTitleLabel(packConfig.Title);
|
|
break;
|
|
}
|
|
case CardPackType.FREE_PACKS:
|
|
case CardPackType.FREE_PACK_WITH_SKIN:
|
|
purchaseConfirm.SetFreePacksConfirmDialog(purchaseText, num, gachaInfo.AvailableCount, gachaInfo.PackCountBuyPer, gachaInfo.CampaignName);
|
|
break;
|
|
}
|
|
if (packConfig.GachaPointData != null)
|
|
{
|
|
GachaPointData gachaPointData = packConfig.GachaPointData;
|
|
int num2 = gachaPointData.IncreaseGachaPoint;
|
|
if (gachaInfo.OverrideIncreaseGachaPoint > 0)
|
|
{
|
|
num2 = gachaInfo.OverrideIncreaseGachaPoint;
|
|
}
|
|
int num3 = (packConfig.IsSpecialCardPack ? num2 : (num2 * buyPackNum));
|
|
if (packConfig.IsPrerelease && (gachaInfo.PackType == CardPackType.CRYSTAL_MULTI || gachaInfo.PackType == CardPackType.CRYSTAL_SPECIAL))
|
|
{
|
|
int preReleasePointCurent = packConfig.PrereleasePurchaseInfo.PreReleasePointCurent;
|
|
int num4 = preReleasePointCurent + num3;
|
|
bool arleadyLimitPreReleasePoint = preReleasePointCurent == packConfig.PrereleasePurchaseInfo.PreReleasePointLimit;
|
|
if (num4 > packConfig.PrereleasePurchaseInfo.PreReleasePointLimit)
|
|
{
|
|
num4 = packConfig.PrereleasePurchaseInfo.PreReleasePointLimit;
|
|
}
|
|
StartCoroutine(purchaseConfirm.SetCardPackPointWithPreRelease(gachaPointData.GachaPoint, gachaPointData.GachaPoint + num3, preReleasePointCurent, num4, arleadyLimitPreReleasePoint));
|
|
}
|
|
else
|
|
{
|
|
StartCoroutine(purchaseConfirm.SetCardPackPoint(gachaPointData.GachaPoint, gachaPointData.GachaPoint + num3));
|
|
}
|
|
}
|
|
if (gachaInfo.PackType == CardPackType.FREE_PACKS || gachaInfo.PackType == CardPackType.FREE_PACK_WITH_SKIN)
|
|
{
|
|
purchaseConfirm.SetFreePacksLayout();
|
|
}
|
|
}
|
|
|
|
private void ChangePurchaceConfirmDialogLayout(PurchaseConfirm purchaseConfirm, int packId)
|
|
{
|
|
if (packId == 94001)
|
|
{
|
|
purchaseConfirm.ChangePurchaceConfirmTextWidth();
|
|
}
|
|
}
|
|
|
|
private int GetAblePackNumByGachaInfo(PackConfig packConfig, PackChildGachaInfo gachaInfo)
|
|
{
|
|
int num = 0;
|
|
switch (gachaInfo.PackType)
|
|
{
|
|
case CardPackType.RUPY_MULTI:
|
|
num = Mathf.Min(PlayerStaticData.UserRupyCount / gachaInfo.Cost, 10);
|
|
if (packConfig.IsPrerelease)
|
|
{
|
|
num = Mathf.Min(num, packConfig.PrereleasePurchaseInfo.TicketRupyCountRemain);
|
|
}
|
|
break;
|
|
case CardPackType.CRYSTAL_MULTI:
|
|
case CardPackType.DAILY:
|
|
case CardPackType.CRYSTAL_SPECIAL:
|
|
case CardPackType.CRYSTAL_SELECT_SKIN:
|
|
case CardPackType.CRYSTAL_ACQUIRE_SKIN_CARD_PACK:
|
|
num = Mathf.Min(PlayerStaticData.UserCrystalCount / gachaInfo.Cost, 10);
|
|
if (packConfig.IsPrerelease && packConfig.PrereleasePurchaseInfo.IsCountLimitedPrerelease)
|
|
{
|
|
num = Mathf.Min(num, packConfig.PrereleasePurchaseInfo.GetAbleBuyPackNum());
|
|
}
|
|
break;
|
|
case CardPackType.TICKET_MULTI:
|
|
num = Mathf.Min(gachaInfo.CostGoodsCount / gachaInfo.Cost, 10);
|
|
if (packConfig.IsPrerelease)
|
|
{
|
|
num = Mathf.Min(num, packConfig.PrereleasePurchaseInfo.TicketRupyCountRemain);
|
|
}
|
|
break;
|
|
case CardPackType.FREE_PACKS:
|
|
case CardPackType.FREE_PACK_WITH_SKIN:
|
|
num = ((gachaInfo.AvailableCount / gachaInfo.Cost > 0) ? gachaInfo.PackCountBuyPer : 0);
|
|
break;
|
|
}
|
|
return num;
|
|
}
|
|
|
|
private int GetMinimumPurchasePackNum(PackChildGachaInfo gachaInfo)
|
|
{
|
|
int result = 0;
|
|
switch (gachaInfo.PackType)
|
|
{
|
|
case CardPackType.CRYSTAL_MULTI:
|
|
case CardPackType.DAILY:
|
|
case CardPackType.TICKET_MULTI:
|
|
case CardPackType.RUPY_MULTI:
|
|
result = 1;
|
|
break;
|
|
case CardPackType.CRYSTAL_SPECIAL:
|
|
case CardPackType.CRYSTAL_SELECT_SKIN:
|
|
case CardPackType.CRYSTAL_ACQUIRE_SKIN_CARD_PACK:
|
|
result = 10;
|
|
break;
|
|
case CardPackType.FREE_PACKS:
|
|
case CardPackType.FREE_PACK_WITH_SKIN:
|
|
result = gachaInfo.PackCountBuyPer;
|
|
break;
|
|
case CardPackType.ROTATION_STARTER_PACK:
|
|
result = 10;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private void PurchaseSelectSkinCard(PackConfig packConfig, PackChildGachaInfo gachaInfo)
|
|
{
|
|
GetSelectSkinOwnedStatusTask task = new GetSelectSkinOwnedStatusTask();
|
|
task.SetParameter(packConfig.PackId);
|
|
StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
|
|
{
|
|
bool flag = false;
|
|
for (CardBasePrm.ClanType clanType = CardBasePrm.ClanType.MIN; clanType < CardBasePrm.ClanType.MAX; clanType++)
|
|
{
|
|
List<SelectSkinCardInfo> source = task.SkinCardListInClassDic[clanType];
|
|
flag |= source.Any((SelectSkinCardInfo x) => x.HasSkin);
|
|
}
|
|
if (flag)
|
|
{
|
|
ConfirmExcludeHasSkinCard(packConfig, gachaInfo, task.SkinCardListInClassDic);
|
|
}
|
|
else
|
|
{
|
|
CreateSelectSkinCardDialog(packConfig, gachaInfo, task.SkinCardListInClassDic, isDefaultExclude: false);
|
|
}
|
|
}));
|
|
}
|
|
|
|
private void ConfirmExcludeHasSkinCard(PackConfig packConfig, PackChildGachaInfo gachaInfo, Dictionary<CardBasePrm.ClanType, List<SelectSkinCardInfo>> skinCardDict)
|
|
{
|
|
SystemText systemText = Data.SystemText;
|
|
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
|
|
dialogBase.SetSize(DialogBase.Size.S);
|
|
dialogBase.SetTitleLabel(systemText.Get("Shop_0207"));
|
|
dialogBase.SetText(systemText.Get("Shop_0208"));
|
|
GameObject gameObject = UnityEngine.Object.Instantiate(Resources.Load("UI/layoutParts/Dialog/DialogSubText")) as GameObject;
|
|
dialogBase.SetObj(gameObject);
|
|
DialogSubText component = gameObject.GetComponent<DialogSubText>();
|
|
UILabel labelSubText = component.LabelSubText;
|
|
labelSubText.color = LabelDefine.TEXT_COLOR_CREAM;
|
|
labelSubText.fontSize = 18;
|
|
UIUtil.AddPositionY(labelSubText.transform, -16f);
|
|
component.SetSubText(systemText.Get("Shop_0209"));
|
|
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.BlueBtn_GrayBtn);
|
|
dialogBase.SetButtonText(systemText.Get("Shop_0210"), systemText.Get("Shop_0211"));
|
|
dialogBase.SetButtonDelegate(delegate
|
|
{
|
|
CreateSelectSkinCardDialog(packConfig, gachaInfo, skinCardDict, isDefaultExclude: true);
|
|
}, delegate
|
|
{
|
|
CreateSelectSkinCardDialog(packConfig, gachaInfo, skinCardDict, isDefaultExclude: false);
|
|
});
|
|
}
|
|
|
|
private void CreateSelectSkinCardDialog(PackConfig packConfig, PackChildGachaInfo gachaInfo, Dictionary<CardBasePrm.ClanType, List<SelectSkinCardInfo>> skinCardDict, bool isDefaultExclude)
|
|
{
|
|
SelectSkinCardDialog.Create(skinCardDict, delegate(Dictionary<int, bool> selectStateDict)
|
|
{
|
|
CreateSelectSkinConfirmDialog(packConfig, gachaInfo, selectStateDict);
|
|
}, isDefaultExclude, isAcquireSkinCardPack: false, null);
|
|
}
|
|
|
|
private void CreateSelectSkinConfirmDialog(PackConfig packConfig, PackChildGachaInfo gachaInfo, Dictionary<int, bool> _selectCardStateDict)
|
|
{
|
|
List<int> selectCardIdList = (from x in _selectCardStateDict
|
|
where x.Value
|
|
select x.Key).ToList();
|
|
SelectCardPurchaseConfirmDialog.Create(packConfig, gachaInfo, 10, selectCardIdList, delegate
|
|
{
|
|
int[] excludeCardIds = (from x in _selectCardStateDict
|
|
where !x.Value
|
|
select x.Key).ToArray();
|
|
PurchasePack(packConfig, gachaInfo, 10, excludeCardIds);
|
|
}, isAcquireSkinCardPack: false);
|
|
}
|
|
|
|
private void PurchaseAcquireSkinCard(PackConfig packConfig, PackChildGachaInfo gachaInfo)
|
|
{
|
|
GetSelectSkinOwnedStatusTask task = new GetSelectSkinOwnedStatusTask();
|
|
task.SetParameter(packConfig.PackId);
|
|
StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
|
|
{
|
|
CreateAcquireSkinCardDialog(packConfig, gachaInfo, task.SkinCardListInClassDic);
|
|
}));
|
|
}
|
|
|
|
private void CreateAcquireSkinCardDialog(PackConfig packConfig, PackChildGachaInfo gachaInfo, Dictionary<CardBasePrm.ClanType, List<SelectSkinCardInfo>> skinCardDict)
|
|
{
|
|
SelectSkinCardDialog.Create(skinCardDict, null, isDefaultExclude: false, isAcquireSkinCardPack: true, delegate(int targetCardId, bool hasTargetSkin)
|
|
{
|
|
CreateAcquireSkinCardConfirmDialog(packConfig, gachaInfo, targetCardId, hasTargetSkin);
|
|
});
|
|
}
|
|
|
|
private void CreateAcquireSkinCardConfirmDialog(PackConfig packConfig, PackChildGachaInfo gachaInfo, int targetCardId, bool hasTargetSkin)
|
|
{
|
|
SelectCardPurchaseConfirmDialog.Create(packConfig, gachaInfo, 10, new List<int> { targetCardId }, delegate
|
|
{
|
|
PurchasePack(packConfig, gachaInfo, 10, null, CardBasePrm.ClanType.NONE, targetCardId);
|
|
}, isAcquireSkinCardPack: true, hasTargetSkin);
|
|
}
|
|
|
|
private void PurchasePack(PackConfig packConfig, PackChildGachaInfo gachaInfo, int packNum, int[] excludeCardIds = null, CardBasePrm.ClanType selectedClassId = CardBasePrm.ClanType.NONE, int? targetCardId = null)
|
|
{
|
|
if (_isBuyConnect)
|
|
{
|
|
return;
|
|
}
|
|
_isBuyConnect = true;
|
|
if (excludeCardIds == null)
|
|
{
|
|
excludeCardIds = new int[0];
|
|
}
|
|
/* Pre-Phase-5b: headless has no InputMgr */
|
|
UIManager.GetInstance().CreatFadeClose(delegate
|
|
{
|
|
UIManager.GetInstance().createInSceneLoading();
|
|
PackOpenTask task = new PackOpenTask(Data.Load.data._userTutorial.TutorialStep != 100, packConfig);
|
|
if (CardBasePrm.ClanTypeIsUseable(selectedClassId))
|
|
{
|
|
task.SetStarterPackParameter(packConfig.PackId, gachaInfo.GachaId, packConfig.GachaType, packNum, excludeCardIds, (int)selectedClassId);
|
|
}
|
|
else if (targetCardId.HasValue)
|
|
{
|
|
task.SetAcquireSkinCardPackParameter(packConfig.PackId, gachaInfo.GachaId, packConfig.GachaType, packNum, targetCardId.Value);
|
|
}
|
|
else
|
|
{
|
|
task.SetParameter(packConfig.PackId, gachaInfo.GachaId, packConfig.GachaType, packNum, excludeCardIds);
|
|
}
|
|
_openedPackId = packConfig.PackId;
|
|
_isCheckGachaPointConfirmDialog = false;
|
|
if (packConfig.GachaPointData != null)
|
|
{
|
|
int gachaPointPackId = (IsTsSkinPickupPackId(packConfig.PackId) ? packConfig.PackId : packConfig.GachaPointData.GachaPointPackId);
|
|
if (!Data.PackInfo.dataList.FirstOrDefault((PackConfig data) => data.PackId == gachaPointPackId).GachaPointData.IsExchangeableGachaPoint)
|
|
{
|
|
_isCheckGachaPointConfirmDialog = true;
|
|
}
|
|
}
|
|
StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
|
|
{
|
|
_isBuyConnect = false;
|
|
_packOpenData = Data.PackOpen.data;
|
|
SuccessPurchasePack(packConfig, task.IsSpecialEffect || task.IsExistFreePackLeaderSkin);
|
|
}, null, OnFailedErrorCodePackOpen));
|
|
});
|
|
}
|
|
|
|
private void OnFailedErrorCodePackOpen(int errorCode)
|
|
{
|
|
_isBuyConnect = false;
|
|
ToolboxGame.UIManager.closeInSceneLoading();
|
|
UIManager.GetInstance().CreatFadeOpen();
|
|
}
|
|
|
|
private void SuccessPurchasePack(PackConfig packConfig, bool isCoutainSpecialCard)
|
|
{
|
|
List<UIBase_CardManager.CardObjData> cardList2DObjs = UIManager.GetInstance().getCardList2DObjs();
|
|
if (cardList2DObjs.Count > 0 && _isPackOpen)
|
|
{
|
|
cardList2DObjs.ForEach(delegate(UIBase_CardManager.CardObjData g)
|
|
{
|
|
UnityEngine.Object.Destroy(g.CardObj);
|
|
});
|
|
}
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID, packConfig.PackId);
|
|
if (GetAdditionalPackByBasePackId(packConfig.BasePackId) != null)
|
|
{
|
|
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.LAST_PURCHASE_PACK_ID_IN_EXIST_ADDITIONALPACK, packConfig.PackId);
|
|
}
|
|
_isPackOpen = true;
|
|
if (packConfig.IsRotationStarterCardPack)
|
|
{
|
|
_isRotationStarterCardPackOpen = true;
|
|
}
|
|
IsDuringPackOpen = true;
|
|
_cardPackManager.Init(_isSkipOpen, _cardDetailDialog, UIManager.ViewScene.Gacha, isCoutainSpecialCard, delegate
|
|
{
|
|
UnloadAssets();
|
|
_cardPackTopBar.SetActive(value: false);
|
|
_cardPackTopPanel.SetActive(value: false);
|
|
UIManager.GetInstance().ShowFooterMenu(isShow: false);
|
|
_cardPackManager.StartInstantiateCardPack(packConfig);
|
|
});
|
|
}
|
|
|
|
private IEnumerator ShowAchieveLog(List<NotificatonAnimation.Param> paramList)
|
|
{
|
|
if (_notificationAnimation != null)
|
|
{
|
|
UnityEngine.Object.Destroy(_notificationAnimation.gameObject);
|
|
_notificationAnimation = null;
|
|
}
|
|
_notificationAnimation = NGUITools.AddChild(_achieveLog, _notificationAnimationPrefab.gameObject).GetComponent<NotificatonAnimation>();
|
|
yield return StartCoroutine(_notificationAnimation.Exec(paramList));
|
|
}
|
|
}
|