PGRData/Script/matrix/xmanager/XFightCharacterManager.lua

330 lines
No EOL
9.9 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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