local EventSystem = require('Event/EventSystem') -- DecisionManager ----- local DecisionManager = {} local _decisionDic = {} local _decisionDataDic = {} --加载需要的模块 local private = { Decision_Idle = require "Battle/Logic/AI/Decision/Decision_Idle", Decision_RunToTarget = require "Battle/Logic/AI/Decision/Decision_RunToTarget", Decision_UseSkill = require "Battle/Logic/AI/Decision/Decision_UseSkill", Decision_Wander = require "Battle/Logic/AI/Decision/Decision_Wander", Decision_Birth = require "Battle/Logic/AI/Decision/Decision_Birth", Decision_ChangeTarget = require "Battle/Logic/AI/Decision/Decision_ChangeTarget", Decision_Patrol = require "Battle/Logic/AI/Decision/Decision_Patrol", Decision_Return = require "Battle/Logic/AI/Decision/Decision_Return", Decision_RunToRoadPoint = require "Battle/Logic/AI/Decision/Decision_RunToRoadPoint", Decision_LeaveBattle = require "Battle/Logic/AI/Decision/Decision_LeaveBattle", Decision_RunFleeTarget = require "Battle/Logic/AI/Decision/Decision_RunFleeTarget", Decision_RunToBornPoint = require "Battle/Logic/AI/Decision/Decision_RunToBornPoint", Decision_RunToPoint = require "Battle/Logic/AI/Decision/Decision_RunToPoint", Decision_AddBuff = require "Battle/Logic/AI/Decision/Decision_AddBuff", Decision_DestroySelf = require "Battle/Logic/AI/Decision/Decision_DestroySelf", Decision_WanderToTarget = require "Battle/Logic/AI/Decision/Decision_WanderToTarget", Decision_KeepDistance = require "Battle/Logic/AI/Decision/Decision_KeepDistance", Decision_FleeGroupLeader = require "Battle/Logic/AI/Decision/Decision_FleeGroupLeader", Decision_WanderToGroupLeader = require "Battle/Logic/AI/Decision/Decision_WanderToGroupLeader", Decision_WanderFleeFriend = require "Battle/Logic/AI/Decision/Decision_WanderFleeFriend", Decision_Broadcast = require "Battle/Logic/AI/Decision/Decision_Broadcast", Decision_ChangeAvoidPriority = require "Battle/Logic/AI/Decision/Decision_ChangeAvoidPriority", Decision_ResetAvoidPriority = require "Battle/Logic/AI/Decision/Decision_ResetAvoidPriority", Decision_PatrolOnPath = require "Battle/Logic/AI/Decision/Decision_PatrolOnPath", Decision_RecoverOrder = require "Battle/Logic/AI/Decision/Decision_RecoverOrder", Decision_AutoFightPath = require "Battle/Logic/AI/Decision/Decision_AutoFightPath", Decision_SendLevelMessage = require "Battle/Logic/AI/Decision/Decision_SendLevelMessage", Decision_Dialog = require "Battle/Logic/AI/Decision/Decision_Dialog", Decision_Timeline = require "Battle/Logic/AI/Decision/Decision_Timeline", Decision_ChangeFollowTarget = require "Battle/Logic/AI/Decision/Decision_ChangeFollowTarget", Decision_RunToFollowTarget = require "Battle/Logic/AI/Decision/Decision_RunToFollowTarget", Decision_UseRandomSkill = require "Battle/Logic/AI/Decision/Decision_UseRandomSkill", Decision_SetAiRecord = require "Battle/Logic/AI/Decision/Decision_SetAiRecord", Decision_Timer = require "Battle/Logic/AI/Decision/Decision_Timer", Decision_ChangeAi = require "Battle/Logic/AI/Decision/Decision_ChangeAi", Decision_Convey = require "Battle/Logic/AI/Decision/Decision_Convey", Decision_SendAiMessage = require "Battle/Logic/AI/Decision/Decision_SendAiMessage", Decision_ChaseUseSkill = require "Battle/Logic/AI/Decision/Decision_ChaseUseSkill", Decision_MinionAi8 = require "Battle/Logic/AI/Decision/Decision_MinionAi8", Decision_AutoFightTest = require "Battle/Logic/AI/Decision/Decision_AutoFightTest", Decision_TeamPVPAutoFight = require "Battle/Logic/AI/Decision/Decision_TeamPVPAutoFight", Decision_FourForceFight = require "Battle/Logic/AI/Decision/Decision_FourForceFight", Decision_PveFight = require "Battle/Logic/AI/Decision/Decision_PveFight", Decision_WorldBossFight = require "Battle/Logic/AI/Decision/Decision_WorldBossFight", Decision_WorldBossRobotFight = require "Battle/Logic/AI/Decision/Decision_WorldBossRobotFight", Decision_CommonPetTargetSet = require "Battle/Logic/AI/Decision/Decision_CommonPetTargetSet", Decision_SoloFight = require "Battle/Logic/AI/Decision/Decision_SoloFight", Decision_TeamFollow = require "Battle/Logic/AI/Decision/Decision_TeamFollow", Decision_DeleteBuff = require "Battle/Logic/AI/Decision/Decision_DeleteBuff", Decision_RandomWanderInCircle = require "Battle/Logic/AI/Decision/Decision_RandomWanderInCircle", Decision_EscapeMove = require "Battle/Logic/AI/Decision/Decision_EscapeMove", Decision_ClearCommonCD = require "Battle/Logic/AI/Decision/Decision_ClearCommonCD", Decision_DetourMove = require "Battle/Logic/AI/Decision/Decision_DetourMove", Decision_SetRotation = require "Battle/Logic/AI/Decision/Decision_SetRotation", Decision_PriorChangeTarget = require "Battle/Logic/AI/Decision/Decision_PriorChangeTarget", Decision_ChangeTargetByResource = require "Battle/Logic/AI/Decision/Decision_ChangeTargetByResource", Decision_HarassMove = require "Battle/Logic/AI/Decision/Decision_HarassMove", Decision_ChangeTargetByFlagAmount = require "Battle/Logic/AI/Decision/Decision_ChangeTargetByFlagAmount", Decision_RunToDynamicPos = require "Battle/Logic/AI/Decision/Decision_RunToDynamicPos", Decision_SwitchAiRecord = require"Battle/Logic/AI/Decision/Decision_SwitchAiRecord", Decision_UseNormalAttack = require"Battle/Logic/AI/Decision/Decision_UseNormalAttack", Decision_AiForbidAiSkillType = require"Battle/Logic/AI/Decision/Decision_AiForbidAiSkillType", Decision_MultiBossChangeTarget = require"Battle/Logic/AI/Decision/Decision_MultiBossChangeTarget", Decision_StopAutoFight = require"Battle/Logic/AI/Decision/Decision_StopAutoFight", Decision_SetRandomIntValueToAiRecord = require"Battle/Logic/AI/Decision/Decision_SetRandomIntValueToAiRecord", Decision_PhalanxKeepDistanceLeader = require"Battle/Logic/AI/Decision/Decision_PhalanxKeepDistanceLeader", Decision_PhalanxSquareMoveMember = require"Battle/Logic/AI/Decision/Decision_PhalanxSquareMoveMember", Decision_TargetOnlyBossFight = require"Battle/Logic/AI/Decision/Decision_TargetOnlyBossFight", Decision_TargetOnMasterLastHurtEnemy = require"Battle/Logic/AI/Decision/Decision_TargetOnMasterLastHurtEnemy", Decision_RetinueFollow = require"Battle/Logic/AI/Decision/Decision_RetinueFollow", Decision_SetLeader = require"Battle/Logic/AI/Decision/Decision_SetLeader", Decision_PhalanxPatrolOnPathLeader = require"Battle/Logic/AI/Decision/Decision_PhalanxPatrolOnPathLeader", Decision_UseBuffSkill = require"Battle/Logic/AI/Decision/Decision_UseBuffSkill", Decision_RunToAndInteract = require"Battle/Logic/AI/Decision/Decision_RunToAndInteract", Decision_FourCountry = require"Battle/Logic/AI/Decision/Decision_FourCountry", Decision_IdleShow = require "Battle/Logic/AI/Decision/Decision_IdleShow", Decision_RunToSkillJoyEndPos = require"Battle/Logic/AI/Decision/Decision_RunToSkillJoyEndPos", } --[[ 初始化 --]] function DecisionManager.Init() --预处理DecisionData数据 DecisionManager.PreprocessDecisionData() _decisionDic = {} _decisionDic[LuaConst.DecisionType.Idle] = private.Decision_Idle:new() _decisionDic[LuaConst.DecisionType.IdleShow] = private.Decision_IdleShow:new() _decisionDic[LuaConst.DecisionType.RunToTarget] = private.Decision_RunToTarget:new() _decisionDic[LuaConst.DecisionType.UseSkill] = private.Decision_UseSkill:new() _decisionDic[LuaConst.DecisionType.Wander] = private.Decision_Wander:new() _decisionDic[LuaConst.DecisionType.Birth] = private.Decision_Birth:new() _decisionDic[LuaConst.DecisionType.ChangeTarget] = private.Decision_ChangeTarget:new() _decisionDic[LuaConst.DecisionType.Patrol] = private.Decision_Patrol:new() _decisionDic[LuaConst.DecisionType.Return] = private.Decision_Return:new() _decisionDic[LuaConst.DecisionType.RunToRoadPoint] = private.Decision_RunToRoadPoint:new() _decisionDic[LuaConst.DecisionType.LeaveBattle] = private.Decision_LeaveBattle:new() _decisionDic[LuaConst.DecisionType.RunFleeTarget] = private.Decision_RunFleeTarget:new() _decisionDic[LuaConst.DecisionType.RunToBornPoint] = private.Decision_RunToBornPoint:new() _decisionDic[LuaConst.DecisionType.RunToPoint] = private.Decision_RunToPoint:new() _decisionDic[LuaConst.DecisionType.AddBuff] = private.Decision_AddBuff:new() _decisionDic[LuaConst.DecisionType.DestroySelf] = private.Decision_DestroySelf:new() _decisionDic[LuaConst.DecisionType.WanderToTarget] = private.Decision_WanderToTarget:new() _decisionDic[LuaConst.DecisionType.KeepDistance] = private.Decision_KeepDistance:new() _decisionDic[LuaConst.DecisionType.FleeGroupLeader] = private.Decision_FleeGroupLeader:new() _decisionDic[LuaConst.DecisionType.WanderToGroupLeader] = private.Decision_WanderToGroupLeader:new() _decisionDic[LuaConst.DecisionType.WanderFleeFriend] = private.Decision_WanderFleeFriend:new() _decisionDic[LuaConst.DecisionType.Broadcast] = private.Decision_Broadcast:new() _decisionDic[LuaConst.DecisionType.ChangeAvoidPriority] = private.Decision_ChangeAvoidPriority:new() _decisionDic[LuaConst.DecisionType.ResetAvoidPriority] = private.Decision_ResetAvoidPriority:new() _decisionDic[LuaConst.DecisionType.PatrolOnPath] = private.Decision_PatrolOnPath:new() _decisionDic[LuaConst.DecisionType.RecoverOrder] = private.Decision_RecoverOrder:new() _decisionDic[LuaConst.DecisionType.AutoFightPath] = private.Decision_AutoFightPath:new() _decisionDic[LuaConst.DecisionType.SendLevelMessage] = private.Decision_SendLevelMessage:new() _decisionDic[LuaConst.DecisionType.Dialog] = private.Decision_Dialog:new() _decisionDic[LuaConst.DecisionType.TimeLine] = private.Decision_Timeline:new() _decisionDic[LuaConst.DecisionType.ChangeFollowTarget] = private.Decision_ChangeFollowTarget:new() _decisionDic[LuaConst.DecisionType.RunToFollowTarget] = private.Decision_RunToFollowTarget:new() _decisionDic[LuaConst.DecisionType.UseRandomSkill] = private.Decision_UseRandomSkill:new() _decisionDic[LuaConst.DecisionType.SetAiRecord] = private.Decision_SetAiRecord:new() _decisionDic[LuaConst.DecisionType.Timer] = private.Decision_Timer:new() _decisionDic[LuaConst.DecisionType.ChangeAi] = private.Decision_ChangeAi:new() _decisionDic[LuaConst.DecisionType.Convey] = private.Decision_Convey:new() _decisionDic[LuaConst.DecisionType.SendAiMessage] = private.Decision_SendAiMessage:new() _decisionDic[LuaConst.DecisionType.ChaseUseSkill] = private.Decision_ChaseUseSkill:new() _decisionDic[LuaConst.DecisionType.MinionAi8] = private.Decision_MinionAi8:new() _decisionDic[LuaConst.DecisionType.AutoFight3v3] = private.Decision_TeamPVPAutoFight:new() _decisionDic[LuaConst.DecisionType.FourForceFight] = private.Decision_FourForceFight:new() _decisionDic[LuaConst.DecisionType.PveFight] = private.Decision_PveFight:new() _decisionDic[LuaConst.DecisionType.WorldBossFight] = private.Decision_WorldBossFight:new() _decisionDic[LuaConst.DecisionType.WorldBossRobotFight] = private.Decision_WorldBossRobotFight:new() _decisionDic[LuaConst.DecisionType.SoloFight] = private.Decision_SoloFight:new() _decisionDic[LuaConst.DecisionType.TeamFollow] = private.Decision_TeamFollow:new() _decisionDic[LuaConst.DecisionType.AutoFightTest] = private.Decision_AutoFightTest:new() _decisionDic[LuaConst.DecisionType.CommonPetTargetSet] = private.Decision_CommonPetTargetSet:new() _decisionDic[LuaConst.DecisionType.DeleteBuff] = private.Decision_DeleteBuff:new() _decisionDic[LuaConst.DecisionType.RandomWanderInCircle] = private.Decision_RandomWanderInCircle:new() _decisionDic[LuaConst.DecisionType.EscapeMove] = private.Decision_EscapeMove:new() _decisionDic[LuaConst.DecisionType.ClearCommonCD] = private.Decision_ClearCommonCD:new() _decisionDic[LuaConst.DecisionType.DetourMove] = private.Decision_DetourMove:new() _decisionDic[LuaConst.DecisionType.SetRotation] = private.Decision_SetRotation:new() _decisionDic[LuaConst.DecisionType.PriorChangeTarget] = private.Decision_PriorChangeTarget:new() _decisionDic[LuaConst.DecisionType.ChangeTargetByResource] = private.Decision_ChangeTargetByResource:new() _decisionDic[LuaConst.DecisionType.HarassMove] = private.Decision_HarassMove:new() _decisionDic[LuaConst.DecisionType.ChangeTargetByFlagAmount] = private.Decision_ChangeTargetByFlagAmount:new() _decisionDic[LuaConst.DecisionType.RunToDynamicPos] = private.Decision_RunToDynamicPos:new() _decisionDic[LuaConst.DecisionType.SwitchAiRecord] = private.Decision_SwitchAiRecord:new() _decisionDic[LuaConst.DecisionType.UseNormalAttack] = private.Decision_UseNormalAttack:new() _decisionDic[LuaConst.DecisionType.AiForbidAiSkillType] = private.Decision_AiForbidAiSkillType:new() _decisionDic[LuaConst.DecisionType.MultiBossChangeTarget] = private.Decision_MultiBossChangeTarget:new() _decisionDic[LuaConst.DecisionType.StopAutoFight] = private.Decision_StopAutoFight:new() _decisionDic[LuaConst.DecisionType.SetRandomIntValueToAiRecord] = private.Decision_SetRandomIntValueToAiRecord:new() _decisionDic[LuaConst.DecisionType.PhalanxKeepDistanceLeader] = private.Decision_PhalanxKeepDistanceLeader:new() _decisionDic[LuaConst.DecisionType.PhalanxSquareMoveMember] = private.Decision_PhalanxSquareMoveMember:new() _decisionDic[LuaConst.DecisionType.TargetOnlyBossFight] = private.Decision_TargetOnlyBossFight:new() _decisionDic[LuaConst.DecisionType.TargetOnMasterLastHurtEnemy] = private.Decision_TargetOnMasterLastHurtEnemy:new() _decisionDic[LuaConst.DecisionType.RetinueFollow] = private.Decision_RetinueFollow:new() _decisionDic[LuaConst.DecisionType.SetLeader] = private.Decision_SetLeader:new() _decisionDic[LuaConst.DecisionType.PhalanxPatrolOnPathLeader] = private.Decision_PhalanxPatrolOnPathLeader:new() _decisionDic[LuaConst.DecisionType.UseBuffSkill] = private.Decision_UseBuffSkill:new() _decisionDic[LuaConst.DecisionType.RunToAndInteract] = private.Decision_RunToAndInteract:new() _decisionDic[LuaConst.DecisionType.FourCountry] = private.Decision_FourCountry:new() _decisionDic[LuaConst.DecisionType.RunToSkillJoyEndPos] = private.Decision_RunToSkillJoyEndPos:new() EventSystem.Regist(EventID.Level_InitLevel, DecisionManager.OnInitLevel) end --需求str的格式为1,2|3,4|5,6 这样的,每对int用|隔开 function DecisionManager.ParseToIntPairList(str) local err = nil local intPairList = {} if str then local splits = string.split(str,"|") if splits then for i,pairStr in ipairs(splits) do local pairSplits = string.split(pairStr,",") if pairSplits and #pairSplits == 2 then local pair = {} pair.key = tonumber(pairSplits[1]) pair.value = tonumber(pairSplits[2]) if pair.key and pair.value then table.insert(intPairList,pair) else err = "ParseToIntPairList 异常 1" break end else err = "ParseToIntPairList 异常 2" break end end end end if err then --有异常就清空,省的异常数据被运行了 intPairList = {} logging.error(LTAG.ERROR, err) end return intPairList end function DecisionManager.PreprocessDecisionDataElement(key,element) if element then _decisionDataDic[element.ID] = element if element.Type == LuaConst.DecisionType.UseRandomSkill then local splits = string.split(element.StringParam1, "#") --UseRandomSkill的数据比较多,用#号隔开两部分,前面是技能index和权重,后面是附加参数,用来指定减权模式 element.intPairList = DecisionManager.ParseToIntPairList(splits[1]) if #element.intPairList > 0 then element.intPairValueSum = 0 for i,v in ipairs(element.intPairList) do element.intPairValueSum = element.intPairValueSum + v.value end else logging.error(LTAG.LOG,"HYW : 类型为UseRandomSkill(41)的Decision配置的StringParam1异常,ID : ", element.ID, " element.StringParam1:", element.StringParam1) end if splits[2] then element.weightCutType = tonumber(splits[2]) end --elseif element.Type == LuaConst.DecisionType.xxx then --如果有其它类型需要预处理,在这里拓展 end else logging.error(LTAG.LOG,"HYW : element nil Error! element key : ", key) end end function DecisionManager.PreprocessDecisionData() local AiData = require("Battle/Logic/AI/Data/AiData") for k,aiData in pairs(AiData) do for i,decisionGroupData in ipairs(aiData.decisionGroupDataList) do for j,decisionData in ipairs(decisionGroupData.DecisionDatas) do DecisionManager.PreprocessDecisionDataElement(i,decisionData) end end end end function DecisionManager.GetDecisionData(ID) return _decisionDataDic[ID] end --[[ 根据 type 获取对应的Decision --]] function DecisionManager.GetDecision(type) return _decisionDic[type] end --[[ 设置新的Decision --]] function DecisionManager.SetNextDecision(decisionData, entity, exitLastDecision) -- old↓ 代码移动到了 AiBaseComponent里 -- local aiBaseComponent = entity.components.aiBase -- --退出上一个Decision -- if exitLastDecision and aiBaseComponent.CurDecisionNode then -- aiBaseComponent.CurDecisionNode:DecisionOut(entity,aiBaseComponent.CurDecisionData) -- end -- --设置新的Decision -- aiBaseComponent:SetCurDecision(decisionData.ID) -- --进入新的Decision -- aiBaseComponent:DecisionIn() --old↑ --new↓ entity.components.aiBase:SetNextDecision(decisionData, exitLastDecision) --new↑ --print("ID", entity._logicInitData.EntityID, "decisionType", tostring(aiBaseComponent.CurDecisionNode.Type)) end --[[ 将Entity的Decision设置为默认的DecisionGroup --]] function DecisionManager.RunEntryDecisionGroup(entity) --old↓ 代码移动到了 AiBaseComponent里 -- local aiBaseComponent = entity.components.aiBase -- aiBaseComponent.CurDecisionPriority = 0 -- aiBaseComponent.CurMinInterruptPriority = 0 -- --print("ID", entity._logicInitData.EntityID,"DecisionPriority", tostring(aiBaseComponent.CurDecisionPriority)) -- if aiBaseComponent.CurEntryData then -- DecisionManager.SetNextDecision(aiBaseComponent.CurEntryData, entity) -- end --old↑ --new↓ if entity.components.aiBase then entity.components.aiBase:RunEntryDecisionGroup() end --new↑ end function DecisionManager.OnInitLevel() DecisionManager.globalRecord = {} --AI全局白板, 每次关卡初始化都擦除 if _decisionDic[LuaConst.DecisionType.ChangeTarget] then _decisionDic[LuaConst.DecisionType.ChangeTarget].searchParamDic = {} -- 缓存每次关卡初始化的时候清理 end end return DecisionManager