//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Monday, November 27, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using System; namespace vnxbqy.UI { public class FunctionalGuideCenter : Singleton { public event Action beginGuideEvent; public event Action finishGuideEevent; public event Action removeGuideEvent; List underwayGuides = new List(); Dictionary guideStartTimes = new Dictionary(); List unfoldAreas = new List(); TaskModel taskmodel { get { return ModelCenter.Instance.GetModel(); } } TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel(); } } PlayerMainDate onMainModel { get { return ModelCenter.Instance.GetModel(); } } LogicUpdate update = new LogicUpdate(); public FunctionalGuideCenter() { TaskModel.tryGetTaskAwardEvent += OnTryGetMainLineTaskReward; TaskModel.Event_MainlineTask += OnMainLineTaskUpdate; TaskModel.CardLevelChange += OnQuestLimitStateChange; TaskModel.SideQuestChangeEvent += OnBranchQuestStateChange; treasureModel.treasureStateChangeEvent += OnTreasureStateChange; taskmodel.taskDescriptionRefresh += OnMainLineDescriptionChange; update.Start(OnUpdate); } public void CheckGuides(int[] _guides) { for (int i = 0; i < _guides.Length; i++) { var guideId = _guides[i]; if (NewBieCenter.Instance.completeGuidesBuf.Contains(guideId)) { continue; } if (underwayGuides.Contains(guideId)) { continue; } if (CheckGuideCondition(guideId)) { StartGuide(guideId); } } } public List GetUnderwayGuides() { return new List(underwayGuides); } public bool ExistAnyUnderwayGuide() { return underwayGuides != null && underwayGuides.Count > 0; } public bool ExistUnderwayGuide(int _guidId) { return underwayGuides != null && underwayGuides.Contains(_guidId); } public void StartGuide(int _id) { RemoveAllUnderWayGuide(); underwayGuides.Add(_id); guideStartTimes[_id] = Time.time; UpdateUnfoldAreas(); if (beginGuideEvent != null) { beginGuideEvent(_id); } } public void FinishGuide(int _id) { RecordCompletedGuide(_id); if (finishGuideEevent != null) { finishGuideEevent(_id); } } public void RemoveGuide(int _guideId) { RecordCompletedGuide(_guideId); if (removeGuideEvent != null) { removeGuideEvent(_guideId); } } public void RemoveAllUnderWayGuide() { for (int i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); if (config.RemoveWhenOtherGuide == 1) { RemoveGuide(guideId); } } } private void OnMainLineTaskUpdate(int _taskId, int _state) { for (int i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); if (config.Condition != _taskId) { continue; } switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.QuestCanAccept: if (_state > 0) { RemoveGuide(guideId); } break; case GuideTriggerType.MainLineQuestCanDo: if (_state > 1) { RemoveGuide(guideId); } break; } } } private void OnQuestLimitStateChange(int _taskId) { for (int i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); if (config.Condition != _taskId) { continue; } var limitState = taskmodel.GetTaskStatus(config.Condition); switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.MainLineQuestLimit: case GuideTriggerType.BranchQuestLimit: if (limitState != TaskModel.TaskStatus.CardLevel || limitState != TaskModel.TaskStatus.TreasureCardLevel) { RemoveGuide(guideId); } break; } } } private void OnMainLineDescriptionChange(int taskId) { for (int i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); if (config.Condition != taskId) { continue; } switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.MainLineQuestCanDo: MissionDetailDates datas; if (taskmodel.TryGetTaskData(config.Condition, out datas)) { var descriptionIndex = datas.descIndex; if (descriptionIndex != config.SupplementCondition) { RemoveGuide(guideId); } } break; } } } private void OnBranchQuestStateChange(int _taskId) { for (int i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); if (config.Condition != _taskId) { continue; } var state = taskmodel.SideQuestState(config.Condition); switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.BranchQuestCando: if (state != 1) { RemoveGuide(guideId); } break; case GuideTriggerType.BranchQuestCanAward: if (state != 2) { RemoveGuide(guideId); } break; } } } private void OnTryGetMainLineTaskReward() { for (int i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.MainLineQuestCanAward: case GuideTriggerType.MainLineQuestCanDo: case GuideTriggerType.QuestCanAccept: case GuideTriggerType.MainLineQuestContinue: case GuideTriggerType.MainLineQuestLimit: case GuideTriggerType.BranchQuestLimit: case GuideTriggerType.BranchQuestContinue: RemoveGuide(guideId); break; } } } private void OnTreasureStateChange(int _treasureId) { for (int i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.TreasureDungeon: Treasure treasure; treasureModel.TryGetTreasure(config.Condition, out treasure); if (treasure != null && treasure.state != TreasureState.Collecting) { RemoveGuide(guideId); } break; } } } private bool CheckGuideCondition(int _guideId) { var config = GuideConfig.Get(_guideId); if (config.PreGuideId != 0 && !NewBieCenter.Instance.completeGuidesBuf.Contains(config.PreGuideId)) { return false; } var mainTaskId = taskmodel.currentMission; switch ((GuideTriggerType)config.TriggerType) { case GuideTriggerType.MainLineQuestCanDo: if (config.SupplementCondition == 0) { return mainTaskId == config.Condition && taskmodel.currentMissionState == 1; } else { MissionDetailDates datas; if (taskmodel.TryGetTaskData(config.Condition, out datas)) { return mainTaskId == config.Condition && datas.descIndex == config.SupplementCondition; } else { return false; } } case GuideTriggerType.MainLineQuestCanAward: // 支线第一次引导领取特殊处理 if (taskmodel.SideQuestsDic.ContainsKey(config.Condition) && taskmodel.SideQuestState(config.Condition) == 2) { return true; } return mainTaskId == config.Condition && taskmodel.currentMissionState == 2; case GuideTriggerType.MainLineQuestLimit: case GuideTriggerType.BranchQuestLimit: return taskmodel.GetTaskStatus(config.Condition) == TaskModel.TaskStatus.CardLevel || taskmodel.GetTaskStatus(config.Condition) == TaskModel.TaskStatus.TreasureCardLevel; case GuideTriggerType.MainLineQuestContinue: case GuideTriggerType.BranchQuestContinue: var questState = taskmodel.SideQuestState(config.Condition); var taskStatus = taskmodel.GetTaskStatus(config.Condition); return questState == 1 && (taskStatus == TaskModel.TaskStatus.Normal); case GuideTriggerType.Treasure: if (!treasureModel.newGotShowing) { Treasure treasure1; return treasureModel.TryGetTreasure(config.Condition, out treasure1) && treasure1.state == TreasureState.Collected; } else { return false; } case GuideTriggerType.TreasureDungeon: Treasure treasure2; treasureModel.TryGetTreasure(config.Condition, out treasure2); return treasure2 != null && treasure2.state == TreasureState.Collecting; case GuideTriggerType.TreasureCollectSoul: return IsTreasureCollectSoul(config.Condition); case GuideTriggerType.TreasureAwaken: return false; case GuideTriggerType.Map: return PlayerDatas.Instance.baseData.MapID == config.Condition; case GuideTriggerType.BranchQuestCando: return taskmodel.SideQuestState(config.Condition) == 1; case GuideTriggerType.BranchQuestCanAward: return taskmodel.SideQuestState(config.Condition) == 2; default: return false; } } private void RecordCompletedGuide(int _guideId) { if (underwayGuides.Contains(_guideId)) { underwayGuides.Remove(_guideId); guideStartTimes.Remove(_guideId); UpdateUnfoldAreas(); } var send = new CA222_tagCMSetGuideOK(); send.GuideIndex = (byte)_guideId; send.IsOK = 1; GameNetSystem.Instance.SendInfo(send); if (!NewBieCenter.Instance.completeGuidesBuf.Contains(_guideId) && onMainModel.createAwardState > 0) { NewBieCenter.Instance.completeGuidesBuf.Add(_guideId); } } private bool IsTreasureCollectSoul(int _treasureId) { return false; } public bool IsAreaNeedUnflod(int area) { return unfoldAreas.Contains(area); } private void UpdateUnfoldAreas() { unfoldAreas.Clear(); foreach (var guid in underwayGuides) { var config = GuideConfig.Get(guid); foreach (var unfoldArea in config.UnfoldAreas) { if (!unfoldAreas.Contains(unfoldArea)) { unfoldAreas.Add(unfoldArea); } } } } private void OnUpdate() { for (var i = underwayGuides.Count - 1; i >= 0; i--) { var guideId = underwayGuides[i]; var config = GuideConfig.Get(guideId); if (config.AutoCompleteTime != 0) { var startTime = guideStartTimes.ContainsKey(guideId) ? guideStartTimes[guideId] : Time.time; if (Time.time > startTime + config.AutoCompleteTime) { RemoveGuide(guideId); } } } } public struct UnderWayGuide { public int guideId; public float startTime; } } }