Files
Endfield-Data/LuaScripts/UI/Panels/CharFormationSkillTips/CharFormationSkillTipsCtrl.lua
2025-12-02 20:37:18 +07:00

236 lines
8.3 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.CharFormationSkillTips
CharFormationSkillTipsCtrl = HL.Class('CharFormationSkillTipsCtrl', uiCtrl.UICtrl)
CharFormationSkillTipsCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.CHAR_INFO_CLOSE_SKILL_TIP] = '_CloseSkillTips',
}
CharFormationSkillTipsCtrl.m_curSkillId = HL.Field(HL.String) << ""
CharFormationSkillTipsCtrl.m_cachedArgs = HL.Field(HL.Table)
CharFormationSkillTipsCtrl.m_extraInfoCellCache = HL.Field(HL.Forward("UIListCache"))
CharFormationSkillTipsCtrl.ShowCharSkillTip = HL.StaticMethod(HL.Table) << function(args)
local isShowing = UIManager:IsShow(PANEL_ID)
local self = UIManager:AutoOpen(PANEL_ID)
if isShowing then
if not self:IsPlayingAnimationOut() then
self:PlayAnimationOutWithCallback(function()
self:PlayAnimationIn()
self:_ShowTips(args)
end)
else
self.m_cachedArgs = args
end
else
self:_ShowTips(args)
end
end
CharFormationSkillTipsCtrl._ShowTips = HL.Method(HL.Table) << function(self, args)
Notify(MessageConst.CHAR_INFO_CLOSE_ATTR_TIP)
self:_InitActionEvent()
self.view.skillInfoNode.gameObject:SetActive(not args.isPassiveSkill)
self.view.passiveSkillInfoNode.gameObject:SetActive(args.isPassiveSkill)
if args.isPassiveSkill then
self:_RefreshPassiveSkillTip(args)
else
self:_RefreshSkillGroupTip(args)
end
self.view.skillTipsNode.gameObject:SetActive(true)
self.view.autoCloseArea:ChangeEnableCloseActionOnController(args.enableCloseActionOnController == true)
UIUtils.updateTipsPosition(self.view.content, args.transform, self.view.rectTransform, self.uiCamera,
args.tipPosType, DeviceInfo.usingController and { bottom = 60 } or nil)
Notify(MessageConst.ON_CHAR_INFO_SHOW_SKILL_TIP)
end
CharFormationSkillTipsCtrl._RefreshSkillGroupTip = HL.Method(HL.Table) << function(self, args)
local charInstId = args.charInstId
local skillGroupType = args.skillGroupType
local charInst = CharInfoUtils.getPlayerCharInfoByInstId(charInstId)
local skillGroupCfg = CharInfoUtils.getCharSkillGroupCfgByType(charInst.templateId, skillGroupType)
local skillInfo = CharInfoUtils.getCharSkillLevelInfoByType(charInst, skillGroupType)
local desc = Utils.SkillUtil.GetSkillGroupDescription(charInst.templateId, skillGroupCfg.skillGroupId, skillInfo.level)
self.view.skillName.text = skillGroupCfg.name
self.view.desc:SetAndResolveTextStyle(desc)
self.view.skillTypeName.text = UIConst.CHAR_INFO_SKILL_GROUP_TYPE_TO_TYPE_NAME[skillGroupType]
local canUpgrade = skillInfo.level < UIConst.CHAR_MAX_SKILL_LV and not args.hideBtnUpgrade
self.view.btnUpgrade.gameObject:SetActive(canUpgrade)
self.view.btnUpgrade.onClick:RemoveAllListeners()
self.view.btnUpgrade.onClick:AddListener(function()
self:_CloseSkillTips()
local isOpen, openedPhase = PhaseManager:IsOpen(PhaseId.CharInfo)
if isOpen then
Notify(MessageConst.CHAR_INFO_PAGE_CHANGE, {
pageType = UIConst.CHAR_INFO_PAGE_TYPE.TALENT,
isFast = true,
showGlitch = true,
extraArg = {
showSkillGroupType = skillGroupType,
}
})
else
CharInfoUtils.openCharInfoBestWay({
initCharInfo = {
instId = charInstId,
templateId = charInst.templateId,
isSingleChar = args.isSingleChar == true,
},
pageType = UIConst.CHAR_INFO_PAGE_TYPE.TALENT,
isFast = true,
showGlitch = true,
extraArg = {
showSkillGroupType = skillGroupType,
}
})
end
end)
local curSkillLv = skillInfo.level
local isElite = curSkillLv >= UIConst.CHAR_MAX_SKILL_NORMAL_LV
local showSkillLv = lume.clamp(curSkillLv, 1, UIConst.CHAR_MAX_SKILL_NORMAL_LV)
local eliteLv = isElite and curSkillLv - UIConst.CHAR_MAX_SKILL_NORMAL_LV or 0
self.view.rank.text = string.format(Language.LUA_CHAR_INFO_TALENT_SKILL_LEVEL_PREFIX, showSkillLv)
self.view.elitepolygon.gameObject:SetActive(isElite)
self.view.elitepolygon:InitElitePolygon(eliteLv)
local extraInfoList = {}
if skillGroupCfg.skillGroupType ~= GEnums.SkillGroupType.NormalAttack then
local skillId = skillGroupCfg.skillIdList[0]
extraInfoList = CharInfoUtils.getSkillExtraInfoList(skillId, skillInfo.level)
end
self.m_extraInfoCellCache:Refresh(#extraInfoList, function(cell, index)
local info = extraInfoList[index]
cell.title.text = info.name
cell.num.text = info.value
end)
end
CharFormationSkillTipsCtrl._RefreshPassiveSkillTip = HL.Method(HL.Table) << function(self, args)
local isLock = args.isLock
local charInstId = args.charInstId
local nodeIndex = args.skillId
local nodeLevel = args.skillLevel
local charInst = CharInfoUtils.getPlayerCharInfoByInstId(charInstId)
local talentUpgradeCfg = CharInfoUtils.getPassiveSkillTalentNodeByIndex(charInst.templateId, nodeIndex, nodeLevel + 1)
local talentNodeCfg = CharInfoUtils.getPassiveSkillTalentNodeByIndex(charInst.templateId, nodeIndex, nodeLevel)
self.m_curSkillId = talentNodeCfg.nodeId
self.view.skillName.text = talentNodeCfg.passiveSkillNodeInfo.name
self.view.passiveSkillInfoNode.locked.gameObject:SetActive(isLock)
self.view.passiveSkillInfoNode.stageLevelCellGroup.view.gameObject:SetActive(not isLock)
self.view.passiveSkillInfoNode.rank.gameObject:SetActive(not isLock)
local foundNodeList = CharInfoUtils.getAllPassiveSkillTalentNodeByIndex(charInst.templateId, nodeIndex)
self.view.passiveSkillInfoNode.stageLevelCellGroup:InitStageLevelCellGroupByPassiveNodeList(charInst.instId, foundNodeList)
local nodeDesc = CS.Beyond.Gameplay.TalentUtil.GetTalentNodeDescription(charInst.templateId, talentNodeCfg.nodeId)
self.view.desc:SetAndResolveTextStyle(nodeDesc)
self.view.skillTypeName.text = Language.LUA_CHAR_INFO_TALENT_SKILL_NAME
self.view.elitepolygon.gameObject:SetActive(false)
local canUpgrade = talentUpgradeCfg ~= nil and not args.hideBtnUpgrade
self.view.btnUpgrade.gameObject:SetActive(canUpgrade)
self.view.btnUpgrade.onClick:RemoveAllListeners()
self.view.btnUpgrade.onClick:AddListener(function()
self:_CloseSkillTips()
if PhaseManager:IsOpen(PhaseId.CharInfo) then
Notify(MessageConst.CHAR_INFO_PAGE_CHANGE, {
pageType = UIConst.CHAR_INFO_PAGE_TYPE.TALENT,
isFast = true,
showGlitch = true,
extraArg = {
showPassiveSkillId = talentNodeCfg.nodeId,
}
})
else
CharInfoUtils.openCharInfoBestWay({
initCharInfo = {
instId = charInstId,
templateId = charInst.templateId,
isSingleChar = args.isSingleChar == true,
},
pageType = UIConst.CHAR_INFO_PAGE_TYPE.TALENT,
isFast = true,
showGlitch = true,
extraArg = {
showPassiveSkillId = talentNodeCfg.nodeId,
}
})
end
end)
self.m_extraInfoCellCache:Refresh(0)
end
CharFormationSkillTipsCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.m_extraInfoCellCache = UIUtils.genCellCache(self.view.extraInfo)
if DeviceInfo.usingController then
self.view.controllerHintBarCell:InitControllerHintBarCell({ groupIds = {self.view.inputGroup.groupId}, }, true)
end
UIUtils.bindHyperlinkPopup(self, "charFormationSkillTips", self.view.inputGroup.groupId)
end
CharFormationSkillTipsCtrl._InitActionEvent = HL.Method() << function(self)
self.view.autoCloseArea.onTriggerAutoClose:RemoveAllListeners()
self.view.autoCloseArea.onTriggerAutoClose:AddListener(function()
self:_CloseSkillTips()
end)
end
CharFormationSkillTipsCtrl._CloseSkillTips = HL.Method() << function(self)
if UIManager:IsShow(PANEL_ID) then
Notify(MessageConst.ON_CHAR_INFO_CLOSE_SKILL_TIP)
self:PlayAnimationOutAndClose()
end
end
HL.Commit(CharFormationSkillTipsCtrl)