using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using proto; namespace MoleMole { public class TutorialModule : BaseModule { private enum WaitingListStatus { Invalid = 0, SendToServer = 1, WaitingFinish = 2, Finished = 3 } private enum TutorialWaitingStatus { NoWaiting = 0, WaitingFinishOnStart = 1, WaitingFinishOnEndPre = 2, WaitingFinishOnEnd = 3, WaitingSkip = 4 } private List _finishTutorialList; private Dictionary> _contextTutorialDict; private Dictionary> _missionTutorialDict; private bool _isInTutorial; private List _waitingList; private WaitingListStatus _waitingListStatus; private LoadingWheelWidgetContext _wheelContext; private TutorialWaitingStatus _tutorialWaitingStatus; private Coroutine _waitingFinishOnStartCoroutine; private Coroutine _waitingFinishOnEndPreCoroutine; private Coroutine _waitingFinishOnEndCoroutine; private List _skipList; private Coroutine _waitingSkip; public bool IsInTutorial { get { return _isInTutorial; } } public TutorialModule() { Singleton.Instance.RegisterModule(this); _finishTutorialList = new List(); _contextTutorialDict = new Dictionary>(); _missionTutorialDict = new Dictionary>(); _skipList = new List(); } public override bool OnPacket(NetPacketV1 pkt) { switch (pkt.getCmdId()) { case 128: return OnGetFinishGuideDataRsp(pkt.getData()); case 130: return OnFinishGuideReportRsp(pkt.getData()); default: return false; } } public void TryToDoTutoialWhenShowContext(BaseContext context) { if (!_isInTutorial) { bool flag = false; if (_contextTutorialDict.ContainsKey(context.config.contextName)) { flag = DoTutorialWhenShowContext(context); } if (!flag) { TryToDoTutorialByCheckPlayerStatusWidget(); } } } public void TryToDoTutoialWhenUpdateMissionStatus(Mission mission) { if (_isInTutorial || !_missionTutorialDict.ContainsKey((int)mission.mission_id)) { return; } List list = _missionTutorialDict[(int)mission.mission_id]; foreach (int item in list) { TutorialData tutorialDataByKey = TutorialDataReader.GetTutorialDataByKey(item); BaseContext baseContext = CheckContextEnable(tutorialDataByKey.triggerUIContextName); if (baseContext == null || !CheckCanDoStep(tutorialDataByKey, tutorialDataByKey.startStepID)) { continue; } DoTutorial(tutorialDataByKey, tutorialDataByKey.startStepID); break; } } public void SetTutorialFlag(bool isInTutorial) { _isInTutorial = isInTutorial; } public bool IsTutorialIDFinish(int tutorialID) { return _finishTutorialList.Contains(tutorialID); } public void Destroy() { StopAllCoroutines(); } public void TryToSkipTutorial(int tutorialID, Action skipUICallback) { int skipGroup = TutorialDataReader.GetTutorialDataByKey(tutorialID).SkipGroup; if (skipGroup == 0) { Debug.LogError("skip group is zero"); return; } _skipList.Clear(); foreach (TutorialData item in TutorialDataReader.GetItemList()) { if (item.SkipGroup == skipGroup) { _skipList.Add(item.id); } } if (MarkTutorialIDFinishToServer(_skipList, true)) { if (_wheelContext != null) { _wheelContext.Finish(); } _wheelContext = new LoadingWheelWidgetContext(130, delegate { RetryRequestFinishGuideReport(_skipList, true); }); Singleton.Instance.ShowWidget(_wheelContext); if (Singleton.Instance != null) { _waitingSkip = Singleton.Instance.StartCoroutine(SkipWait(_skipList, skipUICallback)); } } else { skipUICallback(); } } private IEnumerator SkipWait(List skipList, Action skipUICallback) { _tutorialWaitingStatus = TutorialWaitingStatus.WaitingSkip; while (_waitingList == skipList && _waitingListStatus == WaitingListStatus.SendToServer) { yield return null; } _waitingList = null; _waitingListStatus = WaitingListStatus.Invalid; _waitingSkip = null; _wheelContext = null; _tutorialWaitingStatus = TutorialWaitingStatus.NoWaiting; skipUICallback(); } private void TryToDoTutorialByCheckPlayerStatusWidget() { string key = "PlayerStatusWidgetContext"; if (_contextTutorialDict.ContainsKey(key)) { BaseContext baseContext = CheckPlayerStatusWidgetEnable(); if (baseContext != null) { DoTutorialWhenShowContext(baseContext); } } } private bool DoTutorialWhenShowContext(BaseContext context) { List list = _contextTutorialDict[context.config.contextName]; foreach (int item in list) { TutorialData tutorialDataByKey = TutorialDataReader.GetTutorialDataByKey(item); if (!CheckCanDoStep(tutorialDataByKey, tutorialDataByKey.startStepID)) { continue; } DoTutorial(tutorialDataByKey, tutorialDataByKey.startStepID); return true; } return false; } private void DoTutorial(TutorialData tutorialData, int tutorialStepID) { _tutorialWaitingStatus = TutorialWaitingStatus.NoWaiting; SetTutorialFlag(true); TutorialStepData tutorialStepDataByKey = TutorialStepDataReader.GetTutorialStepDataByKey(tutorialStepID); CheckAndSetScrollViewBegin(tutorialStepID); List finishOnStartList = tutorialStepDataByKey.FinishOnStart; if (finishOnStartList.Count > 0) { if (MarkTutorialIDFinishToServer(finishOnStartList, true)) { if (_wheelContext != null) { _wheelContext.Finish(); } _wheelContext = new LoadingWheelWidgetContext(130, delegate { RetryRequestFinishGuideReport(finishOnStartList, true); }); Singleton.Instance.ShowWidget(_wheelContext); if (Singleton.Instance != null) { _waitingFinishOnStartCoroutine = Singleton.Instance.StartCoroutine(FinishOnStartWait(finishOnStartList, tutorialData, tutorialStepDataByKey)); } } else { DoAfterFinishOnStart(tutorialData, tutorialStepDataByKey); } } else { DoAfterFinishOnStart(tutorialData, tutorialStepDataByKey); } } private bool CheckCanSkip(TutorialData tutorialData, int tutorialStepID) { if (tutorialData.SkipGroup == 0) { return false; } if (tutorialStepID == tutorialData.startStepID) { int num = Singleton.Instance.LocalData.IsVisited_Tutorial(tutorialStepID); if (num >= 0) { Singleton.Instance.LocalData.SetVisited_Tutorial(tutorialStepID); return true; } Singleton.Instance.LocalData.SetVisited_Tutorial(tutorialStepID); return false; } int num2 = Singleton.Instance.LocalData.IsVisited_Tutorial(tutorialData.startStepID); return num2 > 0; } private void CheckAndSetScrollViewBegin(int tutorialStepID) { TutorialStepData tutorialStepDataByKey = TutorialStepDataReader.GetTutorialStepDataByKey(tutorialStepID); string scrollUIPath = tutorialStepDataByKey.scrollUIPath; if (!(scrollUIPath != string.Empty)) { return; } BaseMonoCanvas sceneCanvas = Singleton.Instance.SceneCanvas; if (!(sceneCanvas == null)) { Transform transform = sceneCanvas.transform.FindChild(scrollUIPath); if (!(transform == null) && transform.gameObject.activeInHierarchy && !(transform.GetComponent() == null)) { MonoGridScroller component = transform.GetComponent(); component.ScrollToBegin(); } } } private void DoNextStep(TutorialData tutorialData, TutorialStepData currentTutorialStepData) { int nextStepID = currentTutorialStepData.nextStepID; if (!CheckCanDoStepByHighlight(nextStepID)) { _tutorialWaitingStatus = TutorialWaitingStatus.NoWaiting; SetTutorialFlag(false); } else { DoTutorial(tutorialData, nextStepID); } } private void DoTutorialOver(TutorialData tutorialData, TutorialStepData currentTutorialStepData) { _tutorialWaitingStatus = TutorialWaitingStatus.NoWaiting; SetTutorialFlag(false); } private bool CheckCanDoStep(TutorialData tutorialData, int tutorialStepID) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Invalid comparison between Unknown and I4 //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Invalid comparison between Unknown and I4 //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Invalid comparison between Unknown and I4 if (!CheckCanDoStepSpecialCondition(tutorialData)) { return false; } MissionDataItem missionDataItem = Singleton.Instance.GetMissionDataItem(tutorialData.triggerMissionID); if (missionDataItem == null) { return false; } if ((!tutorialData.triggerOnDoing || (int)missionDataItem.status != 2) && (!tutorialData.triggerOnFinish || (int)missionDataItem.status != 3) && (!tutorialData.triggerOnClose || (int)missionDataItem.status != 5)) { return false; } if (!CheckCanDoStepByHighlight(tutorialStepID)) { return false; } return true; } private bool CheckCanDoStepSpecialCondition(TutorialData tutorialData) { //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Invalid comparison between Unknown and I4 //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Invalid comparison between Unknown and I4 if (tutorialData.triggerSpecial == 99) { return false; } if (tutorialData.triggerSpecial == 1 && !Singleton.Instance.anyAvatarCanUnlock) { return false; } if (tutorialData.triggerSpecial == 2) { BasePageContext currentPageContext = Singleton.Instance.CurrentPageContext; if (currentPageContext != null && currentPageContext is StorageItemDetailPageContext) { StorageDataItemBase storageItem = ((StorageItemDetailPageContext)currentPageContext).storageItem; if (storageItem is StigmataDataItem && !((StigmataDataItem)storageItem).IsAffixIdentify) { return true; } } return false; } if (tutorialData.triggerSpecial == 3) { BasePageContext currentPageContext2 = Singleton.Instance.CurrentPageContext; if (currentPageContext2 != null && currentPageContext2 is StorageItemDetailPageContext) { Transform transform = ((StorageItemDetailPageContext)currentPageContext2).view.transform.Find("ActionBtns/NewAffixBtn"); if (transform != null && transform.gameObject.activeInHierarchy && transform.GetComponent