PGRData/Script/matrix/xentity/xrobot/XRobot.lua
2024-09-01 22:49:41 +02:00

508 lines
17 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 type = type
local tonumber = tonumber
local mathFloor = math.floor
local stringSplit = string.Split
local tableInsert = table.insert
local XCharacterViewModel = require("XEntity/XCharacter/XCharacterViewModel")
local XWeaponViewModel = require("XEntity/XEquip/XWeaponViewModel")
local XAwarenessViewModel = require("XEntity/XEquip/XAwarenessViewModel")
local XPartner = require("XEntity/XPartner/XPartner")
local XPartnerMainSkillGroup = require("XEntity/XPartner/XPartnerMainSkillGroup")
---@class XRobot
local XRobot = XClass(nil, "XRobot")
local Default = {
Id = 0,
Ability = 0,
CharacterId = 0,
Character = {},
Equips = {},
Partner = {},
Attribs = {},
NpcData = {}
}
function XRobot:Ctor(id)
for key, value in pairs(Default) do
if type(value) == "table" then
self[key] = {}
else
self[key] = value
end
end
self.Id = id
-- XCharacterViewModel
self.CharacterViewModel = nil
-- XWeaponViewModel
self.WeaponViewModel = nil
-- XAwarenessViewModel dic
self.AwarenessViewModelDic = nil
self:Init()
end
function XRobot:Init()
self:InitBase()
self:InitCharacter()
self:InitEquips()
self:InitPartner()
self:UpdateAttribs()
self:UpdateAbility()
end
function XRobot:InitBase()
local robotId = self.Id
local robotCfg = XRobotManager.GetRobotTemplate(robotId)
self.CharacterId = robotCfg.CharacterId
end
function XRobot:InitCharacter()
local robotId = self.Id
local robotCfg = XRobotManager.GetRobotTemplate(robotId)
self.Character = {
Id = robotCfg.CharacterId,
Quality = robotCfg.CharacterQuality,
Level = robotCfg.CharacterLevel,
Grade = robotCfg.CharacterGrade,
Star = robotCfg.CharacterStar,
SkillList = self:GenarateRobotSkillList(),
EnhanceSkillList = self:GenarateRobotEnhanceSkillList(),
}
end
function XRobot:InitEquips()
local equips = {}
local robotId = self.Id
local robotCfg = XRobotManager.GetRobotTemplate(robotId)
--武器
if XTool.IsNumberValid(robotCfg.WeaponId) then
local weapon = {
TemplateId = robotCfg.WeaponId,
Level = robotCfg.WeaponLevel,
Breakthrough = robotCfg.WeaponBeakThrough,
ResonanceInfo = self:GenarateRobotEquipResonanceInfo()
}
tableInsert(equips, weapon)
end
--意识
for _, pos in pairs(XEquipConfig.EquipSite.Awareness) do
local equipId = robotCfg.WaferId[pos]
if XTool.IsNumberValid(equipId) then
local newAware = {
TemplateId = equipId,
Level = robotCfg.WaferLevel[pos],
Breakthrough = robotCfg.WaferBreakThrough[pos],
ResonanceInfo = self:GenarateRobotEquipResonanceInfo(pos),
AwakeSlotList = self:GenarateRobotAwakeSlotList(pos),
__SlotPos = pos
}
tableInsert(equips, newAware)
end
end
self.Equips = equips
end
local CreatePartnerSkillData = function(robotPartnerCfg, charId) --未配技能置项均为默认值
local skillList = {}
local unlockSkillGroup = {}
local mainSkillGroup = robotPartnerCfg.MainSkillGroup
local mainskill = XPartnerMainSkillGroup.New(robotPartnerCfg.MainSkillGroup)
local charElement = XCharacterConfigs.GetCharacterElement(charId)
local mainskillId = mainskill:GetSkillIdByElement(charElement)
local tmpData = {
Type = XPartnerConfigs.SkillType.MainSkill,
Level = robotPartnerCfg.MainSkillLevel,
IsWear = true,
Id = mainskillId
}
table.insert(skillList, tmpData)
table.insert(unlockSkillGroup, mainskillId)
for index, skillId in pairs(robotPartnerCfg.PassiveSkillId) do
local tmpData = {
Type = XPartnerConfigs.SkillType.PassiveSkill,
Level = robotPartnerCfg.PassiveSkillLevel[index] or 1,
IsWear = true,
Id = skillId
}
table.insert(skillList, tmpData)
end
return skillList, unlockSkillGroup
end
function XRobot:InitPartner()
local robotId = self.Id
local robotCfg = XRobotManager.GetRobotTemplate(robotId)
if robotCfg.RobotPartnerId and robotCfg.RobotPartnerId > 0 then
local robotPartnerCfg = XRobotManager.GetRobotPartnerTemplate(robotCfg.RobotPartnerId)
self.Partner = XPartner.New(robotCfg.RobotPartnerId, robotPartnerCfg.PartnerId, true)
local skillList, unlockSkillGroup = CreatePartnerSkillData(robotPartnerCfg, robotCfg.CharacterId)
local tmpData = {
CharacterId = robotCfg.CharacterId,
Level = robotPartnerCfg.Level,
BreakThrough = robotPartnerCfg.BreakThrough,
Quality = robotPartnerCfg.Quality,
StarSchedule = robotPartnerCfg.StarSchedule,
SkillList = skillList,
UnlockSkillGroup = unlockSkillGroup
}
self.Partner:UpdateData(tmpData)
end
end
function XRobot:UpdateAttribs()
local npcData = self:GetNpcData()
self.Attribs = XAttribManager.GetNpcAttribs(npcData)
end
function XRobot:UpdateAbility()
local robotId = self.Id
local characterId = self.CharacterId
local npcData = self:GetNpcData()
--属性战力
local baseAbility = XAttribManager.GetAttribAbility(self.Attribs) or 0
--构建机器人技能数据
local skillData = XFightCharacterManager.GetCharSkillLevelMap(npcData)
local skillAbility = XDataCenter.CharacterManager.GetSkillAbility(skillData)
--装备共鸣战力
local resonanceSkillLevel = XFightCharacterManager.GetResonanceSkillLevelMap(npcData)
local resonanceSkillAbility = XDataCenter.CharacterManager.GetResonanceSkillAbility(resonanceSkillLevel, skillData)
--装备技能战力
local equipAbility = XDataCenter.EquipManager.GetEquipSkillAbilityOther(self.Character, self.Equips)
--伙伴战力
local partnerAbility =
not XTool.IsTableEmpty(self.Partner) and XDataCenter.PartnerManager.GetCarryPartnerAbility(self.Partner) or 0
self.Ability = mathFloor(baseAbility + skillAbility + resonanceSkillAbility + equipAbility + partnerAbility)
end
function XRobot:GetConfig()
return XRobotManager.GetRobotTemplate(self.Id)
end
------------属性生成 begin----------------
--武器/意识共鸣列表
function XRobot:GenarateRobotEquipResonanceInfo(pos)
local resonanceList = {}
local robotId = self.Id
local config = XRobotManager.GetRobotTemplate(robotId)
local configResonance, configResonanceType
if pos then
configResonanceType = config.WaferResonanceType[pos]
configResonance = config.WaferResonance[pos]
else
configResonanceType = config.WeaponResonanceType
configResonance = config.WeaponResonance
end
local templateIdList = stringSplit(configResonance)
local resonanceTypeList = stringSplit(configResonanceType)
for slot, templateId in pairs(templateIdList) do
templateId = tonumber(templateId)
local resonanceType = tonumber(resonanceTypeList[slot])
if not XTool.IsNumberValid(templateId) or not XTool.IsNumberValid(resonanceType) then
local path = XRobotManager.GetConfigPath()
XLog.Error(
"XRobot:GenarateRobotEquipResonanceInfo error: 机器人共鸣类型WaferResonanceType与共鸣技能IdWaferResonance不匹配, robotId: " ..
robotId .. ", path: " .. path
)
break
end
local resonanceInfo = {
Slot = slot,
Type = resonanceType,
CharacterId = config.CharacterId,
TemplateId = templateId
}
tableInsert(resonanceList, resonanceInfo)
end
return resonanceList
end
--意识觉醒列表
function XRobot:GenarateRobotAwakeSlotList(pos)
local awakenSlotList = {}
local robotId = self.Id
local config = XRobotManager.GetRobotTemplate(robotId)
local waferAwekenCount = config.WaferAwakeCount[pos]
for slot = 1, waferAwekenCount do
tableInsert(awakenSlotList, slot)
end
return awakenSlotList
end
--技能列表
--@param needMaxMin:是否要读取适用技能等级上下限
function XRobot:GenarateRobotSkillList()
local skillList = {}
local robotId = self.Id
local config = XRobotManager.GetRobotTemplate(robotId)
local removeDic = XRobotManager.GetRobotSkillRemoveDic(robotId)
local characterId = XRobotManager.GetCharacterId(robotId)
local robotSkillLevel = config.SkillLevel
local skillDic = XCharacterConfigs.GetChracterSkillPosToGroupIdDic(characterId)
for _, skillGroup in pairs(skillDic) do
for _, skillGroupId in pairs(skillGroup) do
local skillIds = XCharacterConfigs.GetGroupSkillIdsByGroupId(skillGroupId)
local skillId = skillIds[1]
if XTool.IsNumberValid(skillId) and not removeDic[skillId] then
local skillInfo = {
Id = skillId,
Level = XCharacterConfigs.ClampSubSkillLeveByLevel(skillId, robotSkillLevel)
}
tableInsert(skillList, skillInfo)
end
end
end
return skillList
end
--增强技能列表
function XRobot:GenarateRobotEnhanceSkillList()
local enhanceSkillList = {}
local robotId = self.Id
local config = XRobotManager.GetRobotTemplate(robotId)
local removeDic = XRobotManager.GetRobotSkillRemoveDic(robotId)
local characterId = XRobotManager.GetCharacterId(robotId)
local robotEnhanceSkillLevel = config.EnhanceSkillLevel
local groupIdList = XCharacterConfigs.GetEnhanceSkillConfig(characterId).SkillGroupId
for _, skillGroupId in pairs(groupIdList or {}) do
local groupConfig = XCharacterConfigs.GetEnhanceSkillGroupConfig(skillGroupId)
local skillId = groupConfig.SkillId[1]
if XTool.IsNumberValid(skillId) and not removeDic[skillId] then
local maxLevel = XCharacterConfigs.GetEnhanceSkillMaxLevelBySkillId(skillId)
local skillInfo = {
Id = skillId,
Level = math.min(maxLevel,robotEnhanceSkillLevel)
}
tableInsert(enhanceSkillList, skillInfo)
end
end
return enhanceSkillList
end
------------属性生成 end----------------
------------外部Setter接口需调用后XRobotManager.GetRobotTemp再使用 begin----------------
function XRobot:SetEquips(equips)
self.Equips = equips
self:UpdateAttribs()
self:UpdateAbility()
end
function XRobot:SetPartner(partner)
self.Partner = partner
self:UpdateAbility()
end
------------外部Setter接口需调用后XRobotManager.GetRobotTemp再使用 end----------------
------------外部Getter接口 begin----------------
function XRobot:GetNpcData()
local npcData = {
Character = self.Character,
Equips = self.Equips
}
return npcData
end
function XRobot:GetAtrributes()
return self.Attribs
end
function XRobot:GetAbility()
return self.Ability or 0
end
--生成装备共鸣增加额外属性列表Debug调试用
function XRobot:ConstructResonanceAbilityList()
local list = {}
for _, equip in pairs(self.Equips) do
local infoList = equip.ResonanceInfo
if not XTool.IsTableEmpty(infoList) then
for _, info in pairs(infoList) do
if tonumber(info.Type) == tonumber(XEquipConfig.EquipResonanceType.Attrib) then
local _, attrs = XAttribManager.GetAttribGroupTemplate(info.TemplateId)
tableInsert(
list,
{
EquipId = equip.Id,
Site = XDataCenter.EquipManager.GetEquipSiteByEquipData(equip),
Slot = info.Slot,
Attr = attrs
}
)
end
end
end
end
return list
end
--生成装备觉醒超频增加额外属性列表Debug调试用
function XRobot:ConstructAwakenAbilityList()
local list = {}
for _, equip in pairs(self.Equips) do
local infoList = equip.AwakeSlotList
if not XTool.IsTableEmpty(infoList) then
local template = XEquipConfig.GetEquipAwakeCfg(equip.TemplateId)
for _, slot in pairs(infoList) do
local attribId = template.AttribId[slot]
local _, attrs = XAttribManager.GetAttribByAttribId(attribId)
tableInsert(
list,
{
EquipId = equip.Id,
Site = XDataCenter.EquipManager.GetEquipSiteByEquipData(equip),
Slot = slot,
Attr = attrs
}
)
end
end
end
return list
end
function XRobot:GetSkillLevelDic(forDisplay)
if forDisplay and (not self.Character.DisplaySkillList) then
self.Character.DisplaySkillList = self:GenarateRobotSkillList()
end
local skillLevelDic = {}
for _, skillData in pairs(forDisplay and self.Character.DisplaySkillList or self.Character.SkillList) do
skillLevelDic[skillData.Id] = skillData.Level
end
return skillLevelDic
end
---机器人单独技能等级
---于v2.4添加,由于升阶拆分更改了核心被动技能等级robot表又只有一个字段控制所有技能
---导致个别玩法机器人SS品质配1级技能却没有升阶拆分的技能,因此添加了字段单独配置某个技能的等级供其他玩法使用
---目前用到:肉鸽1期
function XRobot:GetAfterSpSkillLevel(skillId)
local robotId = self.Id
local config = XRobotManager.GetRobotTemplate(robotId)
local skillList = config.SpSkillIds
local skillLevelList = config.SpSkillLevels
if XTool.IsTableEmpty(skillList) or XTool.IsTableEmpty(skillLevelList) then
return false
end
local index = table.indexof(skillList, skillId)
if index then
return XCharacterConfigs.ClampSubSkillLeveByLevel(skillId, skillLevelList[index])
end
return false
end
function XRobot:GetPartner()
if self.Partner ~= nil and next(self.Partner) == nil then
return nil
end
return self.Partner
end
-- 优先获取展示的机器人战力
function XRobot:GetAbilityWithCheckShowAbility()
local ability = XRobotManager.GetRobotShowAbility(self.Id)
if XTool.IsNumberValid(ability) then
return ability
end
return self:GetAbility()
end
function XRobot:GetId()
return self.Id
end
function XRobot:GetCharacterId()
return XRobotManager.GetCharacterId(self.Id)
end
------------外部Getter接口 end----------------
------------ 视图数据 begin----------------
function XRobot:GetCharacterViewModel()
if self.CharacterViewModel == nil then
local robotConfig = XRobotManager.GetRobotTemplate(self.Id)
self.CharacterViewModel = XCharacterViewModel.New(robotConfig.CharacterId)
self.CharacterViewModel:UpdateWithData(self.Character)
self.CharacterViewModel:UpdateAbility(self:GetAbilityWithCheckShowAbility())
self.CharacterViewModel:UpdateFashionId(robotConfig.FashionId)
self.CharacterViewModel:UpdateLiberateLv(robotConfig.LiberateLv)
self.CharacterViewModel:UpdateSourceEntityId(self.Id)
end
return self.CharacterViewModel
end
function XRobot:GetWeaponViewModel()
if self.WeaponViewModel == nil then
local templateId = nil
for _, euqipData in pairs(self.Equips) do
templateId = euqipData.TemplateId
if XDataCenter.EquipManager.IsClassifyEqualByTemplateId(templateId, XEquipConfig.Classify.Weapon) then
self.WeaponViewModel = XWeaponViewModel.New(templateId)
self.WeaponViewModel:UpdateWithData(euqipData)
break
end
end
end
return self.WeaponViewModel
end
function XRobot:GetAwarenessViewModelDic()
if self.AwarenessViewModelDic == nil then
self.AwarenessViewModelDic = {}
local templateId = nil
for _, euqipData in pairs(self.Equips) do
templateId = euqipData.TemplateId
if XDataCenter.EquipManager.IsClassifyEqualByTemplateId(templateId, XEquipConfig.Classify.Awareness) then
self.AwarenessViewModelDic[euqipData.__SlotPos] = XAwarenessViewModel.New(templateId)
self.AwarenessViewModelDic[euqipData.__SlotPos]:UpdateWithData(euqipData)
end
end
end
return self.AwarenessViewModelDic
end
function XRobot:GetEquipViewModels()
local result = {self:GetWeaponViewModel()}
for _, v in pairs(self:GetAwarenessViewModelDic()) do
table.insert(result, v)
end
return result
end
------------ 视图数据 end----------------
return XRobot