using System.Collections.Generic; using System.Linq; using Core.Language; using Excel2Json; using Fort23.Core; using Fort23.UTool; using GameLogic.Combat; using GameLogic.Combat.CombatTool; using UnityEngine; using Utility; using Random = UnityEngine.Random; public class EventSystemManager : Singleton { List eventConfigs = new List(); List eventDatas = new List(); IDialogueMono dialogueMono; public AccountFileInfo.EventList CurrentEventList; public bool isTriggerEvent; public void CustomInit(IDialogueMono dialogueMono) { eventConfigs = ConfigComponent.Instance.GetAll().ToList(); this.dialogueMono = dialogueMono; StaticUpdater.Instance.AddRenderUpdateCallBack(Update); } private float timer = 0; private void Update() { timer += Time.deltaTime; if (timer > 1) { timer = 0; AccountFileInfo.Instance.playerData.divineSensePoint += 3; EventManager.Instance.Dispatch(CustomEventType.DivineSensePointChange, null); AccountFileInfo.Instance.SavePlayerData(); } } public List UseDivinesense(int bigMapId) { DivineSenseConfig divineSenseConfig = ConfigComponent.Instance.Get(AccountFileInfo.Instance.playerData.divineSenseLevel); int count = AccountFileInfo.Instance.playerData.divineSensePoint / PlayerManager.Instance.gameConstantConfig.DetectEventCount; if (count <= 0) { //神识值不够 return null; } AccountFileInfo.Instance.playerData.divineSenseexp += AccountFileInfo.Instance.playerData.divineSensePoint; AccountFileInfo.Instance.playerData.divineSensePoint = 0; EventManager.Instance.Dispatch(CustomEventType.DivineSensePointChange, null); //todo 神识升级逻辑 AccountFileInfo.Instance.SavePlayerData(); var eventConfigs = DetectEvents(bigMapId, count); if (eventConfigs == null || eventConfigs.Count == 0) return default; List eventLists = new List(); for (var i = 0; i < eventConfigs.Count; i++) { AccountFileInfo.EventList eventList = new AccountFileInfo.EventList(); eventList.eventID = eventConfigs[i].ID; eventLists.Add(eventList); } return eventLists; } private List DetectEvents(int bigMapId, int eventCount) { if (isTriggerEvent) return default; BigMap bigMap = ConfigComponent.Instance.Get(bigMapId); DivineSenseConfig divineSenseConfig = ConfigComponent.Instance.Get(AccountFileInfo.Instance.playerData.divineSenseLevel); List qualitys = new List() { 1, 2, 3, 4, 5, 6 }; //先掉落出品质 int quality = UtilTools.GetRandomByWeight(qualitys, divineSenseConfig.QualityBonusChance); // 获取通用事件 List globalEvents = eventConfigs.Where(e => e.EventTriggerType == 1 && CanTriggerEvent(e.ID) && e.EventQuality == quality).ToList(); //神识场景事件 List candidateEvents = eventConfigs.Where(e => bigMap.DivineSenseGeneralEvent.Contains(e.ID) && CanTriggerEvent(e.ID) && e.EventQuality == quality).ToList(); if (candidateEvents.Count == 0 && globalEvents.Count == 0) { LogTool.Error("没有可以刷新的事件"); return default; } var triggeredEvents = new List(); for (int i = 0; i < eventCount; i++) { int randomValue1 = Random.Range(0, 101); //刷场景事件 if (randomValue1 >= bigMap.DivineSenseGeneralProbability && candidateEvents.Count > 0) { int randomValue2 = Random.Range(0, candidateEvents.Count); triggeredEvents.Add(candidateEvents[randomValue2]); candidateEvents.RemoveAll(ew => ew.ID == candidateEvents[randomValue2].ID); } else if (globalEvents.Count > 0) { int randomValue2 = Random.Range(0, globalEvents.Count); triggeredEvents.Add(globalEvents[randomValue2]); globalEvents.RemoveAll(ew => ew.ID == globalEvents[randomValue2].ID); } } if (triggeredEvents.Count == 0) { LogTool.Error("没有可以触发的事件"); return default; } return triggeredEvents; } /// /// 触发随机事件 /// public void DetectRandomEvents() { if (isTriggerEvent) return; // 获取随机事件 List randomEvents = eventConfigs.Where(e => e.EventTriggerType == 2 && CanTriggerEvent(e.ID)).ToList(); if (randomEvents.Count == 0) { LogTool.Warning("没有可以刷新的事件"); return; } int idex = Random.Range(0, randomEvents.Count); TriggerEvent(randomEvents[idex]); } /// /// 触发事件 /// public void TriggerEvent(EventConfig evt) { if (isTriggerEvent) return; isTriggerEvent = true; LogTool.Log($"触发事件: {evt.Description} (ID: {evt.ID}, 品质: {evt.EventQuality})"); dialogueMono.ChangeComabtState(CombatController.idle); DialogueManager.Instance.StartDialogue(evt.EventType, evt.ID, () => { CompleteEvent(evt.ID); }); } /// /// 触发事件 /// public void TriggerEvent(AccountFileInfo.EventList evt) { if (isTriggerEvent) return; isTriggerEvent = true; EventConfig eventConfig = ConfigComponent.Instance.Get(evt.eventID); LogTool.Log($"触发事件: {LanguageManager.Instance.Text(eventConfig.Description)} (ID: {eventConfig.ID}, 品质: {eventConfig.EventQuality})"); int dialogueID = 0; if (evt.curStep == 0) { dialogueID = eventConfig.EventType; } else { dialogueID = evt.curStep; } CurrentEventList = evt; dialogueMono.ChangeComabtState(CombatController.idle); DialogueManager.Instance.StartDialogue(dialogueID, eventConfig.ID, () => { CompleteEvent(); }); } /// /// 检查事件是否满足触发条件。 /// private bool CanTriggerEvent(int eventID) { var evt = eventConfigs.Find(e => e.ID == eventID); if (evt.ID == 0) return false; for (var i = 0; i < evt.EventConditionId?.Length; i++) { if (!CheckCondition(evt.EventConditionId[i], evt.EventVlaue[i])) return false; } return true; } /// /// 检查单个触发条件。 /// private bool CheckCondition(int conditionid, int EventVlaue) { //>= if (EventVlaue == 1) { } //= else if (EventVlaue == 2) { } // <= else if (EventVlaue == 3) { } return true; } /// /// 完成事件 /// /// 事件ID public void CompleteEvent(int eventID) { isTriggerEvent = false; LogTool.Log($"完成事件{eventID}"); AccountFileInfo.EventData eventData = AccountFileInfo.Instance.playerData.events.FirstOrDefault((e) => e.eventID == eventID); if (eventData == null) { eventData = new AccountFileInfo.EventData(); eventData.eventID = eventID; } eventData.completeCount++; AccountFileInfo.Instance.playerData.events.Add(eventData); if (AccountFileInfo.Instance.playerData.senceExplorationProgress < 100) AccountFileInfo.Instance.playerData.senceExplorationProgress += 5; AccountFileInfo.Instance.SavePlayerData(); dialogueMono.ChangeComabtState(CombatController.update); // EventManager.Instance.Dispatch(CustomEventType.CompleteEvent, null); } /// /// 完成事件 /// /// 事件ID public void CompleteEvent() { isTriggerEvent = false; LogTool.Log($"完成事件{CurrentEventList.eventID}"); AccountFileInfo.EventData eventData = AccountFileInfo.Instance.playerData.events.FirstOrDefault((e) => e.eventID == CurrentEventList.eventID); if (eventData == null) { eventData = new AccountFileInfo.EventData(); eventData.eventID = CurrentEventList.eventID; } eventData.completeCount++; AccountFileInfo.Instance.playerData.events.Add(eventData); if (AccountFileInfo.Instance.playerData.senceExplorationProgress < 100) AccountFileInfo.Instance.playerData.senceExplorationProgress += 5; AccountFileInfo.Instance.playerData.eventList.Remove(CurrentEventList); AccountFileInfo.Instance.SavePlayerData(); EventManager.Instance.Dispatch(CustomEventType.CompleteEvent, null); dialogueMono.ChangeComabtState(CombatController.update); } }