330 lines
No EOL
9.9 KiB
Lua
330 lines
No EOL
9.9 KiB
Lua
local pairs = pairs
|
||
local table = table
|
||
local tableInsert = table.insert
|
||
|
||
XFightCharacterManager = XFightCharacterManager or {}
|
||
|
||
local function Awake()
|
||
end
|
||
|
||
local function GetQualityTemplate(templateId, quality)
|
||
local qualityTemplate = XCharacterConfigs.GetQualityTemplate(templateId, quality)
|
||
|
||
if not qualityTemplate then
|
||
return XCode.CharacterManagerGetQualityTemplateNotFound, nil
|
||
end
|
||
|
||
return XCode.Success, qualityTemplate
|
||
end
|
||
|
||
local function GetGradeTemplates(templateId, grade)
|
||
local gradeTemplate = XCharacterConfigs.GetGradeTemplates(templateId, grade)
|
||
if not gradeTemplate then
|
||
return XCode.CharacterManagerGetGradeTemplateNotFound, nil
|
||
end
|
||
|
||
return XCode.Success, gradeTemplate
|
||
end
|
||
|
||
local function GetCharSkillLevelEffectTemplate(skillId, level)
|
||
local levelConfig = XCharacterConfigs.GetSkillLevelEffectTemplate(skillId, level)
|
||
|
||
if not levelConfig then
|
||
return XCode.CharacterSkillLevelEffectTemplateNotFound, nil
|
||
end
|
||
|
||
return XCode.Success, levelConfig
|
||
end
|
||
|
||
local function GetCharEnhanceSkillLevelEffectTemplate(skillId, level)
|
||
local levelConfig = XCharacterConfigs.GetEnhanceSkillLevelEffectBySkillIdAndLevel(skillId, level)--补强技能配置
|
||
|
||
if not levelConfig then
|
||
return XCode.CharacterSkillLevelEffectTemplateNotFound, nil
|
||
end
|
||
|
||
return XCode.Success, levelConfig
|
||
end
|
||
|
||
-----------------------------------------Attribs Begin---------------------------------------
|
||
---添加角色星数属性id
|
||
---当前品质,从1星累加到当前星
|
||
---@param characterData userdata 角色数据
|
||
---@param attribIds table 属性id列表
|
||
---@return XCode 状态码
|
||
local function DoAddStarAttribId(characterData, attribIds)
|
||
if characterData.Star <= 0 then
|
||
return XCode.Success
|
||
end
|
||
|
||
local code, template = GetQualityTemplate(characterData.Id, characterData.Quality)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
|
||
local maxStar = #template.AttrId
|
||
|
||
for i = 1, characterData.Star do
|
||
if i > maxStar then
|
||
break
|
||
end
|
||
|
||
local attribId = template.AttrId[i]
|
||
if attribId > 0 then
|
||
tableInsert(attribIds, attribId)
|
||
end
|
||
end
|
||
|
||
return XCode.Success
|
||
end
|
||
|
||
---添加角色晋升属性id
|
||
---@param characterData userdata 角色数据
|
||
---@param attribIds table 属性id列表
|
||
---@return XCode 状态码
|
||
local function DoAddGradeAttribId(characterData, attribIds)
|
||
local code, template = GetGradeTemplates(characterData.Id, characterData.Grade)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
|
||
if template.AttrId > 0 then
|
||
tableInsert(attribIds, template.AttrId)
|
||
end
|
||
|
||
return XCode.Success
|
||
end
|
||
|
||
--- 属性计算
|
||
--- 1、星星提供属性
|
||
--- 2、晋升提供属性
|
||
local function AddNumericAttribId(npcData, attribIds)
|
||
if not npcData.Character then
|
||
return XCode.Success
|
||
end
|
||
|
||
local code = DoAddStarAttribId(npcData.Character, attribIds)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
|
||
code = DoAddGradeAttribId(npcData.Character, attribIds)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
|
||
return XCode.Success
|
||
end
|
||
-----------------------------------------Attribs End-----------------------------------------
|
||
local function GetResonanceSkillLevelMap(npcData)
|
||
local levelMap = {}
|
||
|
||
local equips = npcData.Equips
|
||
if not equips then
|
||
return levelMap
|
||
end
|
||
|
||
XTool.LoopCollection(equips, function(equipData)
|
||
if equipData.ResonanceInfo then
|
||
XTool.LoopCollection(equipData.ResonanceInfo, function(resonance)
|
||
if resonance.Type == CS.EquipResonanceType.CharacterSkill or resonance.Type == XEquipConfig.EquipResonanceType.CharacterSkill then
|
||
if resonance.CharacterId == npcData.Character.Id then
|
||
local skillId = resonance.TemplateId
|
||
local groupSkillIds = XCharacterConfigs.GetGroupSkillIds(skillId)
|
||
|
||
for _, groupSkillId in pairs(groupSkillIds) do
|
||
if levelMap[groupSkillId] then
|
||
levelMap[groupSkillId] = levelMap[groupSkillId] + 1
|
||
else
|
||
levelMap[groupSkillId] = 1
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end)
|
||
end
|
||
end)
|
||
|
||
return levelMap
|
||
end
|
||
|
||
---获取角色技能等级集合
|
||
---@param npcData userdata npc数据
|
||
---@return table 技能等级集合
|
||
local function GetCharSkillLevelMap(npcData)
|
||
local levelMap = {}
|
||
XTool.LoopCollection(npcData.Character.SkillList, function(skill)
|
||
local skillId = skill.Id
|
||
local skillLevel = skill.Level
|
||
levelMap[skillId] = skillLevel
|
||
end)
|
||
|
||
local resLevelMap = GetResonanceSkillLevelMap(npcData)
|
||
for skillId, level in pairs(resLevelMap) do
|
||
if levelMap[skillId] then
|
||
levelMap[skillId] = levelMap[skillId] + level
|
||
end
|
||
end
|
||
|
||
if npcData.CharacterSkillPlus then
|
||
XTool.LoopMap(npcData.CharacterSkillPlus, function(skillId, level)
|
||
if levelMap[skillId] then
|
||
levelMap[skillId] = levelMap[skillId] + level
|
||
end
|
||
end)
|
||
end
|
||
|
||
return levelMap
|
||
end
|
||
|
||
---获取角色补强技能等级集合
|
||
---@param npcData userdata npc数据
|
||
---@return table 技能等级集合
|
||
local function GetCharEnhanceSkillLevelMap(npcData)
|
||
local levelMap = {}
|
||
XTool.LoopCollection(npcData.Character.EnhanceSkillList, function(skill)
|
||
local skillId = skill.Id
|
||
local skillLevel = skill.Level
|
||
levelMap[skillId] = skillLevel
|
||
end)
|
||
return levelMap
|
||
end
|
||
|
||
local function SetSubSkillLevelMap(template, level, levelMap)
|
||
for _, subSkillId in pairs(template.SubSkillId) do
|
||
local curLevel = levelMap[subSkillId]
|
||
if not curLevel or curLevel < level then
|
||
levelMap[subSkillId] = level
|
||
end
|
||
end
|
||
end
|
||
|
||
local function SetSubMagicLevelMap(template, level, levelMap)
|
||
for _, subMagicId in pairs(template.SubMagicId) do
|
||
local curLevel = levelMap[subMagicId]
|
||
if not curLevel or curLevel < level then
|
||
levelMap[subMagicId] = level
|
||
end
|
||
end
|
||
end
|
||
|
||
local function SetBornMagicLevelMap(template, level, levelMap)
|
||
for _, magic in pairs(template.BornMagic) do
|
||
local curLevel = levelMap[magic]
|
||
if not curLevel or curLevel < level then
|
||
levelMap[magic] = level
|
||
end
|
||
end
|
||
end
|
||
|
||
--- 技能等级
|
||
--- 1、角色技能加成
|
||
--- 2、共鸣提供加成
|
||
local function GetSkillLevel(npcData, levelMap)
|
||
if not npcData.Character then
|
||
return XCode.Success
|
||
end
|
||
|
||
local charLevelMap = GetCharSkillLevelMap(npcData)
|
||
for skillId, level in pairs(charLevelMap) do
|
||
local code, template = GetCharSkillLevelEffectTemplate(skillId, level)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
SetSubSkillLevelMap(template, level, levelMap)
|
||
end
|
||
|
||
local enhanceSkillLevelMap = GetCharEnhanceSkillLevelMap(npcData)
|
||
for skillId, level in pairs(enhanceSkillLevelMap) do
|
||
local code, template = GetCharEnhanceSkillLevelEffectTemplate(skillId, level)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
SetSubSkillLevelMap(template, level, levelMap)
|
||
end
|
||
|
||
return XCode.Success
|
||
end
|
||
|
||
--- 魔法等级
|
||
--- 1、角色技能加成
|
||
local function GetMagicLevel(npcData, levelMap)
|
||
if not npcData.Character then
|
||
return XCode.Success
|
||
end
|
||
|
||
local charLevelMap = GetCharSkillLevelMap(npcData)
|
||
for skillId, level in pairs(charLevelMap) do
|
||
local code, template = GetCharSkillLevelEffectTemplate(skillId, level)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
SetSubMagicLevelMap(template, level, levelMap)
|
||
end
|
||
|
||
local enhanceSkillLevelMap = GetCharEnhanceSkillLevelMap(npcData)
|
||
for skillId, level in pairs(enhanceSkillLevelMap) do
|
||
local code, template = GetCharEnhanceSkillLevelEffectTemplate(skillId, level)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
SetSubMagicLevelMap(template, level, levelMap)
|
||
end
|
||
|
||
return XCode.Success
|
||
end
|
||
|
||
--- 出生魔法属性等级
|
||
--- 1、角色技能加成
|
||
--- 2、共鸣提供加成
|
||
local function GetBornMagicLevel(npcData, levelMap)
|
||
if not npcData.Character then
|
||
return XCode.Success
|
||
end
|
||
|
||
local charLevelMap = GetCharSkillLevelMap(npcData)
|
||
for skillId, level in pairs(charLevelMap) do
|
||
local code, template = GetCharSkillLevelEffectTemplate(skillId, level)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
SetBornMagicLevelMap(template, level, levelMap)
|
||
end
|
||
|
||
local enhanceSkillLevelMap = GetCharEnhanceSkillLevelMap(npcData)
|
||
for skillId, level in pairs(enhanceSkillLevelMap) do
|
||
local code, template = GetCharEnhanceSkillLevelEffectTemplate(skillId, level)
|
||
if code ~= XCode.Success then
|
||
return code
|
||
end
|
||
SetBornMagicLevelMap(template, level, levelMap)
|
||
end
|
||
|
||
return XCode.Success
|
||
end
|
||
|
||
function XFightCharacterManager.GetNpcId(characterData)
|
||
local code, qualityTemplate = GetQualityTemplate(characterData.Id, characterData.Quality)
|
||
if code ~= XCode.Success then
|
||
return code, 0
|
||
end
|
||
|
||
return XCode.Success, qualityTemplate.NpcId
|
||
end
|
||
|
||
local function RegisterInterfaces()
|
||
XAttribManager.RegisterNumericIdInterface(AddNumericAttribId)
|
||
|
||
XMagicSkillManager.RegisterResonanceSkillLevelInterface(GetResonanceSkillLevelMap)
|
||
XMagicSkillManager.RegisterSkillLevelInterface(GetSkillLevel)
|
||
XMagicSkillManager.RegisterMagicLevelInterface(GetMagicLevel)
|
||
XMagicSkillManager.RegisterBornMagicLevelInterface(GetBornMagicLevel)
|
||
end
|
||
|
||
function XFightCharacterManager.Init()
|
||
Awake()
|
||
RegisterInterfaces()
|
||
end
|
||
|
||
XFightCharacterManager.GetCharSkillLevelMap = GetCharSkillLevelMap
|
||
XFightCharacterManager.GetResonanceSkillLevelMap = GetResonanceSkillLevelMap |