PGRData/Resources/Scripts/XEntity/XRobot/XRobot.lua

452 lines
14 KiB
Lua
Raw Normal View History

2022-12-26 08:36:01 +00:00
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")
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(),
}
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
------------属性生成 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 = self.NpcData
if XTool.IsTableEmpty(npcData) then
npcData = {
Character = self.Character,
Equips = self.Equips,
}
self.NpcData = npcData
end
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
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
------------外部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