local XUiPanelRoleModel = require("XUi/XUiCharacter/XUiPanelRoleModel")
local ACTIVE_COLOR = "0E70BD"
local UNACTIVE_COLOR = "00000099"
-- 异构阵线2.0心智界面
local XUiMaverick2Talent = XLuaUiManager.Register(XLuaUi, "UiMaverick2Talent")
function XUiMaverick2Talent:OnAwake()
self.RobotId = nil -- 机器人id
self.StageId = nil -- 关卡id
self.ChangeCharCb = nil -- 切换角色的回调
self.TreeCfgs = nil -- 天赋树列表
self.TalentLineGoList = { self.GridSkillLine } -- 天赋行预制体列表
self.UnLockLineIndexDic = {} -- 记录解锁的行下标
self.IsEnoughLvUp = false -- 是否足够升级
self.SelectGroupCfg = nil -- 选中的天赋
self.LvUpTalentId = nil -- 记录刚升级完的天赋
self:SetButtonCallBack()
self:InitTimes()
self:InitRoleModel()
self:CloseTalentDetail()
self.PanelSpecialTool.gameObject:SetActiveEx(false)
local itemIcon = XItemConfigs.GetItemIconById(XDataCenter.ItemManager.ItemId.Maverick2Unit)
self.RImgIconUnit:SetRawImage(itemIcon)
end
function XUiMaverick2Talent:OnStart(robotId, stageId, changeCharCb)
-- 无传具体机器人id,则用上次选中的机器人id
if not robotId then
robotId = XDataCenter.Maverick2Manager.GetLastSelRobotId()
end
self.RobotId = robotId
self.StageId = stageId
self.ChangeCharCb = changeCharCb
self:UpdateCamera(XMaverick2Configs.CharacterCamera.Lv)
end
function XUiMaverick2Talent:OnEnable()
self.Super.OnEnable(self)
self:Refresh()
end
function XUiMaverick2Talent:OnDisable()
end
function XUiMaverick2Talent:SetButtonCallBack()
XUiHelper.RegisterClickEvent(self, self.BtnBack, self.OnClickBtnBack)
XUiHelper.RegisterClickEvent(self, self.BtnMainUi, function() XLuaUiManager.RunMain() end)
XUiHelper.RegisterClickEvent(self, self.BtnExchange, self.OnClickBtnExchange)
XUiHelper.RegisterClickEvent(self, self.BtnReset, self.OnClickBtnReset)
XUiHelper.RegisterClickEvent(self, self.BtnSummary, self.OnClickBtnSummary)
XUiHelper.RegisterClickEvent(self, self.BtnCloseSkillPopup, self.CloseTalentDetail)
XUiHelper.RegisterClickEvent(self, self.BtnResetSkill, self.OnClickTalentReset)
XUiHelper.RegisterClickEvent(self, self.BtnLvUpSkill, self.OnClickTalentLevelUp)
XUiHelper.RegisterClickEvent(self, self.RImgIconUnit, self.OnClickIconUnit)
end
function XUiMaverick2Talent:OnClickBtnBack()
if XLuaUiManager.IsUiShow("UiMaverick2CharacterExchange") then
self:CloseChildUi("UiMaverick2CharacterExchange")
self:UpdateCamera(XMaverick2Configs.CharacterCamera.Lv)
self:ShowPanelTalent(true)
self:Refresh()
return
end
self:Close()
end
function XUiMaverick2Talent:OnClickBtnExchange()
self:OpenOneChildUi("UiMaverick2CharacterExchange", self, self.StageId, function(robotId)
self.RobotId = robotId
if self.ChangeCharCb then
self.ChangeCharCb(robotId)
end
end)
-- 切换镜头
self:UpdateCamera(XMaverick2Configs.CharacterCamera.EXCHANGE)
self:ShowPanelTalent(false)
end
function XUiMaverick2Talent:OnClickBtnReset()
XDataCenter.Maverick2Manager.RequestResetRobotAllTalent(self.RobotId, function()
self:UpdateTalentLineList()
end)
end
function XUiMaverick2Talent:OnClickBtnSummary()
XLuaUiManager.Open("UiMaverick2Details", self.RobotId)
end
function XUiMaverick2Talent:Refresh()
self.TreeCfgs = XMaverick2Configs.GetRobotTalentCfg(self.RobotId)
self:InitTalentLineList()
self:UpdateRoleModel(self.RobotId)
self:UpdateTalentLineList()
-- 心智等级
local mentalLv = XDataCenter.Maverick2Manager.GetMentalLv()
self.TxtTalentLv.text = tostring(mentalLv)
-- 更新红点数据
XDataCenter.Maverick2Manager.RefreshTalentRedUnlockGroupIds(self.RobotId)
end
function XUiMaverick2Talent:InitTimes()
self:SetAutoCloseInfo(XDataCenter.Maverick2Manager.GetActivityEndTime(), function(isClose)
if isClose then
XLuaUiManager.RunMain()
XUiManager.TipMsg(XUiHelper.GetText("ActivityAlreadyOver"))
end
end)
end
---------------------------------------- 3D模型 begin ----------------------------------------
-- 初始化3D模型
function XUiMaverick2Talent:InitRoleModel()
local root = self.UiModelGo.transform
self.PanelRoleModel = root:FindTransform("PanelRoleModel")
self.UiPanelRoleModel = XUiPanelRoleModel.New(self.PanelRoleModel, self.Name, nil, true, nil, true)
self.CameraFar = {
root:FindTransform("UiCamFarMaverick2Lv"),
root:FindTransform("UiCamFarMaverick2Prepare"),
root:FindTransform("UiCamFarMaverick2Exchange"),
}
self.CameraNear = {
root:FindTransform("UiCamNearMaverick2Lv"),
root:FindTransform("UiCamNearMaverick2Prepare"),
root:FindTransform("UiCamNearMaverick2Exchange"),
}
end
-- 刷新3D模型
function XUiMaverick2Talent:UpdateRoleModel(robotId)
local entity = XRobotManager.GetRobotById(robotId)
if entity == nil then
return
end
local finishedCallback = function(model)
self.PanelDrag.Target = model.transform
end
local characterViewModel = entity:GetCharacterViewModel()
local sourceEntityId = characterViewModel:GetSourceEntityId()
if XRobotManager.CheckIsRobotId(sourceEntityId) then
local robot2CharEntityId = XRobotManager.GetCharacterId(sourceEntityId)
local isOwen = XDataCenter.CharacterManager.IsOwnCharacter(robot2CharEntityId)
if XRobotManager.CheckUseFashion(sourceEntityId) and isOwen then
local character = XDataCenter.CharacterManager.GetCharacter(robot2CharEntityId)
local robot2CharViewModel = character:GetCharacterViewModel()
self.UiPanelRoleModel:UpdateCharacterModel(robot2CharEntityId
, self.PanelRoleModelGo
, self.Name
, finishedCallback
, nil
, robot2CharViewModel:GetFashionId())
else
local robotConfig = XRobotManager.GetRobotTemplate(sourceEntityId)
self.UiPanelRoleModel:UpdateRobotModel(sourceEntityId
, robotConfig.CharacterId
, nil
, robotConfig.FashionId
, robotConfig.WeaponId
, finishedCallback
, nil
, self.PanelRoleModelGo
, self.Name)
end
else
self.UiPanelRoleModel:UpdateCharacterModel(
sourceEntityId,
self.PanelRoleModelGo,
self.Name,
finishedCallback,
nil,
characterViewModel:GetFashionId()
)
end
end
function XUiMaverick2Talent:UpdateCamera(index)
if self.CurCameraIndex == index then
return
end
self.CurCameraIndex = index
for i = 1, XMaverick2Configs.CAMERA_CNT do
local isShow = self.CurCameraIndex == i
if self.CameraFar[i] then
self.CameraFar[i].gameObject:SetActiveEx(isShow)
end
if self.CameraNear[i] then
self.CameraNear[i].gameObject:SetActiveEx(isShow)
end
end
end
---------------------------------------- 3D模型 end ----------------------------------------
---------------------------------------- 天赋列表 begin ----------------------------------------
function XUiMaverick2Talent:InitTalentLineList()
-- 隐藏所有预置
for _, go in ipairs(self.TalentLineGoList) do
go.gameObject:SetActiveEx(false)
end
-- 创建/显示预置
for i, _ in ipairs(self.TreeCfgs) do
local go = self.TalentLineGoList[i]
if not go then
go = CS.UnityEngine.Object.Instantiate(self.GridSkillLine.gameObject, self.PanelContent)
self.TalentLineGoList[i] = go
end
go.gameObject:SetActiveEx(true)
end
end
-- 刷新天赋行列表
function XUiMaverick2Talent:UpdateTalentLineList()
self.UnLockLineIndexDic = {}
for i, treeCfg in ipairs(self.TreeCfgs) do
self:UpdateTalentLine(i)
end
self:UpdateRemainUnitCnt()
self:UpdateUnlockProgress()
end
-- 刷新天赋组
function XUiMaverick2Talent:UpdateTalentLine(index)
local treeCfg = self.TreeCfgs[index]
local lineGo = self.TalentLineGoList[index]
local uiObj = lineGo:GetComponent("UiObject")
-- 天赋组解锁提示
local assignUnit = XDataCenter.Maverick2Manager.GetAssignActiveUnitCnt(self.RobotId)
local mentalLv = XDataCenter.Maverick2Manager.GetMentalLv()
local isLock = false
local desc = ""
if assignUnit < treeCfg.NeedUnit then
isLock = true
desc = XUiHelper.GetText("Maverick2UnitCountUnlock", treeCfg.NeedUnit)
end
if mentalLv < treeCfg.NeedMentalLv then
isLock = true
desc = XUiHelper.GetText("Maverick2MentalLvUnlock", treeCfg.NeedMentalLv)
end
uiObj:GetObject("PanelUnlock").gameObject:SetActiveEx(isLock)
uiObj:GetObject("TextUnlockTips").text = desc
uiObj:GetObject("ImgNormal").gameObject:SetActiveEx(not isLock)
uiObj:GetObject("ImgLock").gameObject:SetActiveEx(isLock)
-- 记录解锁情况
self.UnLockLineIndexDic[index] = not isLock
-- 获取天赋和天赋预制体列表
local talentGoList = {}
local maxPos = 3
for i = 1, maxPos do
local isUse = treeCfg["UseUiPos" .. i] == 1
local talentGo = uiObj:GetObject("Skill"..i)
talentGo.gameObject:SetActiveEx(isUse)
if isUse then
table.insert(talentGoList, talentGo)
end
end
-- 刷新单个天赋
local groupCfgs = XMaverick2Configs.GetTalentGroupConfigs(treeCfg.TalentGroupId)
for i, groupCfg in ipairs(groupCfgs) do
local talentGo = talentGoList[i]
if talentGo then
self:UpdateTalent(talentGo, groupCfg)
end
end
end
-- 刷新单个天赋
function XUiMaverick2Talent:UpdateTalent(talentGo, groupCfg)
local lvConfigs = XMaverick2Configs.GetTalentLvConfigs(groupCfg.TalentId)
local lv = XDataCenter.Maverick2Manager.GetTalentLv(self.RobotId, groupCfg.TalentGroupId, groupCfg.TalentId)
local isMax = lv == #lvConfigs
local icon = lv == 0 and lvConfigs[1].Icon or lvConfigs[lv].Icon -- 无0级配置表,使用一级的图标配置
local needUnit = 0
local isTalentLock = false
local desc = nil
local isEnoughLvUp = false
if not isMax then
local nextLvCfg = lvConfigs[lv+1]
needUnit = nextLvCfg.NeedUnit
local unitCnt = XDataCenter.Maverick2Manager.GetRemainUnitCnt(self.RobotId)
isEnoughLvUp = unitCnt >= needUnit
if nextLvCfg.Condition ~= 0 then
isTalentLock = XConditionManager.CheckCondition(nextLvCfg.Condition)
desc = nextLvCfg.UnlockTips
end
end
-- 刷新icon、锁
local uiBtn = talentGo:GetComponent("XUiButton")
uiBtn:SetDisable(isTalentLock)
local uiObj = talentGo:GetComponent("UiObject")
uiObj:GetObject("RImgIconNormal"):SetRawImage(icon)
uiObj:GetObject("RImgIconPress"):SetRawImage(icon)
uiObj:GetObject("RImgIconDisable"):SetRawImage(icon)
-- 可升级特效
local treeCfg = XMaverick2Configs.GetTalentTreeConfig(self.RobotId, groupCfg.TalentGroupId)
local assignUnit = XDataCenter.Maverick2Manager.GetAssignActiveUnitCnt(self.RobotId)
local mentalLv = XDataCenter.Maverick2Manager.GetMentalLv()
local isGroupLock = mentalLv < treeCfg.NeedMentalLv or assignUnit < treeCfg.NeedUnit
local showEffect = not isTalentLock and not isGroupLock and not isMax and isEnoughLvUp
uiObj:GetObject("Effect").gameObject:SetActiveEx(showEffect)
-- 升级成功特效
local isLvUp = self.LvUpTalentId == groupCfg.TalentId
local lvUpEffect = uiObj:GetObject("Efect2")
if isLvUp then
lvUpEffect.gameObject:SetActive(false)
lvUpEffect.gameObject:SetActive(true)
else
lvUpEffect.gameObject:SetActiveEx(false)
end
-- 等级
local showLvStr = ""
if isMax then
showLvStr = "MAX"
end
if lv > 0 then
showLvStr = XUiHelper.GetText("Maverick2TalentLv", lv)
end
uiObj:GetObject("TxtSkillLv").text = showLvStr
-- 升级消耗
uiObj:GetObject("PanelCost").gameObject:SetActiveEx(not isMax)
if not isMax then
local itemIcon = XItemConfigs.GetItemIconById(XDataCenter.ItemManager.ItemId.Maverick2Unit)
uiObj:GetObject("RImgCostIcon"):SetRawImage(itemIcon)
uiObj:GetObject("TxtCostCnt").text = isEnoughLvUp and tostring(needUnit) or string.format("%s", needUnit)
end
-- 点击事件
XUiHelper.RegisterClickEvent(self, talentGo, function()
self:OpenTalentDetail(groupCfg)
end)
end
-- 更新剩余点数
function XUiMaverick2Talent:UpdateRemainUnitCnt()
local unitCnt = XDataCenter.Maverick2Manager.GetRemainUnitCnt(self.RobotId)
self.TxtTalentUnit.text = XUiHelper.GetText("Maverick2RemainUnitCount", unitCnt)
end
-- 更新解锁进度
function XUiMaverick2Talent:UpdateUnlockProgress()
local unlockCnt = 0
for index, isUnlock in pairs(self.UnLockLineIndexDic) do
if isUnlock then
unlockCnt = unlockCnt + 1
end
end
local allCnt = #self.TreeCfgs
local lineHeight = self.GridSkillLine.rect.height
local spacing = self.PanelContent:GetComponent("VerticalLayoutGroup").spacing
local width = self.ProgressBg.rect.width
local height = (allCnt - 1) * (lineHeight + spacing) + 0.5 * lineHeight
local unlockHeight = (unlockCnt - 1) * (lineHeight + spacing) + 0.5 * lineHeight
self.ProgressBg.sizeDelta = CS.UnityEngine.Vector2(width, height)
self.Progress.fillAmount = unlockHeight / height
end
---------------------------------------- 天赋列表 end ----------------------------------------
-- 打开天赋详情
function XUiMaverick2Talent:OpenTalentDetail(groupCfg)
self.BtnCloseSkillPopup.gameObject:SetActiveEx(true)
self.PanelSkillPopup.gameObject:SetActiveEx(true)
self.SelectGroupCfg = groupCfg
self:UpdateTalentDetail()
end
-- 刷新天赋详情
function XUiMaverick2Talent:UpdateTalentDetail()
local groupCfg = self.SelectGroupCfg
local lvConfigs = XMaverick2Configs.GetTalentLvConfigs(groupCfg.TalentId)
local lv = XDataCenter.Maverick2Manager.GetTalentLv(self.RobotId, groupCfg.TalentGroupId, groupCfg.TalentId)
local isMax = lv == #lvConfigs
local icon = lv == 0 and lvConfigs[1].Icon or lvConfigs[lv].Icon -- 无0级配置表,使用一级的图标配置
self.IsEnoughLvUp = false
-- 技能图标和名称
self.RImgSkillIcon:SetRawImage(icon)
self.TxtSkillName.text = groupCfg.Name
-- 技能等级
local isActive = lv > 0
self.TxtSkillUnActive.gameObject:SetActiveEx(not isActive)
self.TxtSkillLevel.gameObject:SetActiveEx(isActive)
if isActive then
self.TxtSkillLevel.text = tostring(lv)
end
-- 技能描述
local descColor1 = lv == 1 and ACTIVE_COLOR or UNACTIVE_COLOR
self.TxtSkillDes1.text = lvConfigs[1].Desc
self.TxtSkillDes1.color = XUiHelper.Hexcolor2Color(descColor1)
self.TxtPosA1.color = XUiHelper.Hexcolor2Color(descColor1)
local showLv2 = lvConfigs[2] ~= nil
self.TxtSkillDes2.gameObject:SetActiveEx(showLv2)
if showLv2 then
local descColor2 = lv == 2 and ACTIVE_COLOR or UNACTIVE_COLOR
self.TxtSkillDes2.text = lvConfigs[2].Desc
self.TxtSkillDes2.color = XUiHelper.Hexcolor2Color(descColor2)
self.TxtPosA2.color = XUiHelper.Hexcolor2Color(descColor2)
end
local showLv3 = lvConfigs[3] ~= nil
self.TxtSkillDes3.gameObject:SetActiveEx(showLv3)
if showLv3 then
local descColor3 = lv == 3 and ACTIVE_COLOR or UNACTIVE_COLOR
self.TxtSkillDes3.text = lvConfigs[3].Desc
self.TxtSkillDes3.color = XUiHelper.Hexcolor2Color(descColor3)
self.TxtPosA3.color = XUiHelper.Hexcolor2Color(descColor3)
end
-- 是否可以升级下一级
local needUnit = 0
local isLock = false
local desc = nil
if not isMax then
local nextLvCfg = lvConfigs[lv+1]
needUnit = nextLvCfg.NeedUnit
local unitCnt = XDataCenter.Maverick2Manager.GetRemainUnitCnt(self.RobotId)
self.IsEnoughLvUp = unitCnt >= needUnit
if nextLvCfg.Condition ~= 0 then
isLock = XConditionManager.CheckCondition(nextLvCfg.Condition)
if isLock then
desc = nextLvCfg.UnlockTips
end
end
end
-- 天赋组解锁提示
local treeCfg = XMaverick2Configs.GetTalentTreeConfig(self.RobotId, groupCfg.TalentGroupId)
local assignUnit = XDataCenter.Maverick2Manager.GetAssignActiveUnitCnt(self.RobotId)
local mentalLv = XDataCenter.Maverick2Manager.GetMentalLv()
if mentalLv < treeCfg.NeedMentalLv or assignUnit < treeCfg.NeedUnit then
isLock = true
if lv > 0 then
desc = XUiHelper.GetText("Maverick2TalentUnEffect")
else
desc = XUiHelper.GetText("Maverick2TalentLock")
end
end
-- 解锁提示
self.TxtSkillUnlockTips.gameObject:SetActiveEx(isLock)
if isLock then
self.TxtSkillUnlockTips.text = desc
end
-- 重置按钮
self.BtnResetSkill.gameObject:SetActiveEx(not isLock and isActive)
-- 升级按钮
local showLvUp = not isLock and not isMax
self.BtnLvUpSkill.gameObject:SetActiveEx(showLvUp)
if showLvUp then
local itemIcon = XItemConfigs.GetItemIconById(XDataCenter.ItemManager.ItemId.Maverick2Unit)
self.RImgCostIcon:SetRawImage(itemIcon)
self.TxtCostCnt.text = self.IsEnoughLvUp and tostring(needUnit) or string.format("%s", needUnit)
local btnName = lv > 0 and XUiHelper.GetText("Upgrade") or XUiHelper.GetText("Active")
self.BtnLvUpSkill:SetName(btnName)
end
end
-- 关闭天赋详情
function XUiMaverick2Talent:CloseTalentDetail()
self.BtnCloseSkillPopup.gameObject:SetActiveEx(false)
self.PanelSkillPopup.gameObject:SetActiveEx(false)
end
-- 点击升级单个天赋
function XUiMaverick2Talent:OnClickTalentLevelUp()
if not self.IsEnoughLvUp then
XUiManager.TipText("Maverick2TalentLvUpNoEnough")
return
end
XDataCenter.Maverick2Manager.RequestUpgradeTalent(self.RobotId, self.SelectGroupCfg.TalentGroupId, self.SelectGroupCfg.TalentId, function()
self.LvUpTalentId = self.SelectGroupCfg.TalentId
self:UpdateTalentLineList()
self:UpdateTalentDetail()
end)
end
-- 点击重置单个天赋
function XUiMaverick2Talent:OnClickTalentReset()
XDataCenter.Maverick2Manager.RequestResetSingleTalent(self.RobotId, self.SelectGroupCfg.TalentGroupId, self.SelectGroupCfg.TalentId, function()
self:UpdateTalentLineList()
self:UpdateTalentDetail()
end)
end
-- 点击心智单元图标
function XUiMaverick2Talent:OnClickIconUnit()
XLuaUiManager.Open("UiTip", XDataCenter.ItemManager.ItemId.Maverick2Unit)
end
-- 显示天赋界面
function XUiMaverick2Talent:ShowPanelTalent(isShow)
self.PanelDrag.gameObject:SetActiveEx(isShow)
self.PanelAllTalent.gameObject:SetActiveEx(isShow)
self.PanelSkillList.gameObject:SetActiveEx(isShow)
self.PanelButton.gameObject:SetActiveEx(isShow)
self.BtnExchange.gameObject:SetActiveEx(isShow)
end