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

330 lines
9.6 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.WikiWeaponPreview
WikiWeaponPreviewCtrl = HL.Class('WikiWeaponPreviewCtrl', uiCtrl.UICtrl)
local WeaponState = {
Init = 1,
Max = 2,
Gem = 3,
}
WikiWeaponPreviewCtrl.s_messages = HL.StaticField(HL.Table) << {
}
WikiWeaponPreviewCtrl.m_wikiEntryShowData = HL.Field(HL.Table)
WikiWeaponPreviewCtrl.m_wikiGroupShowDataList = HL.Field(HL.Table)
WikiWeaponPreviewCtrl.m_curWeaponState = HL.Field(HL.Number) << 0
WikiWeaponPreviewCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self:_ProcessArg(arg)
self:_InitAction()
self:_InitController()
self:_RefreshLeft()
self:_RefreshCenter()
end
WikiWeaponPreviewCtrl.OnShow = HL.Override() << function(self)
self:_RefreshModel()
self:_PlayDecoAnim()
end
WikiWeaponPreviewCtrl.OnHide = HL.Override() << function(self)
if self.m_phase then
self.m_phase:ActiveModelRotateRoot(false)
end
end
WikiWeaponPreviewCtrl.OnClose = HL.Override() << function (self)
if self.m_phase then
self.m_phase:DestroyModel()
end
end
WikiWeaponPreviewCtrl._OnPhaseItemBind = HL.Override() << function(self)
self:_RefreshModel(true)
self.m_phase:PlayBgAnim("wiki_plane_toweapon_in")
self:_PlayDecoAnim()
end
WikiWeaponPreviewCtrl._OnPlayAnimationOut = HL.Override() << function(self)
WikiWeaponPreviewCtrl.Super._OnPlayAnimationOut(self)
self.m_phase:PlayBgAnim("wiki_plane_toweapon_out")
end
WikiWeaponPreviewCtrl._ProcessArg = HL.Method(HL.Table) << function(self, arg)
local detailArgs = {
categoryType = WikiConst.EWikiCategoryType.Weapon,
wikiEntryShowData = WikiUtils.getWikiEntryShowData(arg.weaponId, WikiConst.EWikiCategoryType.Weapon),
wikiGroupShowDataList = {},
}
if #arg.weaponGroups == 0 then
self.view.expandListBtn.gameObject:SetActive(false)
end
for _, weaponGroupData in pairs(arg.weaponGroups) do
local wikiGroupShowData = {
wikiCategoryType = WikiConst.EWikiCategoryType.Weapon,
customTitle = weaponGroupData.title,
wikiEntryShowDataList = {},
}
for _, weaponId in ipairs(weaponGroupData.weaponIds) do
local wikiEntryShowData = WikiUtils.getWikiEntryShowData(weaponId, WikiConst.EWikiCategoryType.Weapon)
if wikiEntryShowData then
local _, itemData = Tables.itemTable:TryGetValue(weaponId)
if itemData then
wikiEntryShowData.itemData = itemData
wikiEntryShowData.rarity = itemData.rarity
end
table.insert(wikiGroupShowData.wikiEntryShowDataList, wikiEntryShowData)
table.sort(wikiGroupShowData.wikiEntryShowDataList, Utils.genSortFunction({ "rarity" }, false))
end
end
table.insert(detailArgs.wikiGroupShowDataList, wikiGroupShowData)
end
self.m_wikiEntryShowData = detailArgs.wikiEntryShowData
self.m_wikiGroupShowDataList = detailArgs.wikiGroupShowDataList
end
WikiWeaponPreviewCtrl._InitAction = HL.Method() << function(self)
self.view.topNode.btnClose.onClick:AddListener(function()
PhaseManager:PopPhase(PhaseId.Wiki)
end)
self.view.topNode.stateToggle:InitCommonToggleGroup({
toggleDataList = {
{ name = Language.ui_CharInfo_init },
{ name = Language.ui_CharInfo_max_level },
{ name = Language.ui_WikiWeapon_gem_equiped },
},
onToggleIsOn = function(index)
self:_RefreshWeaponState(index, true)
end,
defaultIndex = 3,
defaultNotCall = true,
})
self:_RefreshWeaponState(WeaponState.Gem, false)
end
WikiWeaponPreviewCtrl._RefreshWeaponState = HL.Method(HL.Number, HL.Opt(HL.Boolean)) << function(self, weaponState, playAnim)
if self.m_curWeaponState == weaponState then
return
end
self.m_curWeaponState = weaponState
if playAnim then
self.view.right.recipeNodeAnimWrapper:PlayOutAnimation(function()
self:_RefreshModel()
self:_RefreshRight()
self.view.right.recipeNodeAnimWrapper:PlayInAnimation()
end)
else
self:_RefreshModel()
self:_RefreshRight()
end
end
WikiWeaponPreviewCtrl._RefreshModel = HL.Method(HL.Opt(HL.Boolean)) << function(self, playInAnim)
if self.m_phase then
self.m_phase:ShowModel(self.m_wikiEntryShowData, {
isWeaponRefinedMax = self.m_curWeaponState ~= WeaponState.Init,
isWeaponGemMax = self.m_curWeaponState == WeaponState.Gem,
playInAnim = playInAnim,
})
self.m_phase:ActiveEntryVirtualCamera(true)
end
end
WikiWeaponPreviewCtrl._RefreshLeft = HL.Method() << function(self)
local wikiGroupItemListArgs = {
isPreviewMode = true,
isInitHidden = true,
wikiGroupShowDataList = self.m_wikiGroupShowDataList,
onItemClicked = function(wikiEntryShowData)
self.m_wikiEntryShowData = wikiEntryShowData
self:_RefreshCenter()
self:_RefreshRight(true)
end,
onGetSelectedEntryShowData = function()
return self.m_wikiEntryShowData
end,
btnExpandList = self.view.expandListBtn,
btnClose = self.view.btnEmpty,
wikiItemInfo = self.view.wikiItemInfo,
}
self.view.left:InitWikiGroupItemList(wikiGroupItemListArgs)
end
WikiWeaponPreviewCtrl._RefreshCenter = HL.Method() << function(self)
local args = {
wikiEntryShowData = self.m_wikiEntryShowData,
onDetailBtnClick = function()
self:PlayAnimationOutWithCallback(function()
self.m_phase:CreatePhasePanelItem(PanelId.WikiModelShow, self.m_wikiEntryShowData)
end)
end
}
self.view.wikiItemInfo:InitWikiItemInfo(args)
self.view.wikiItemInfo.view.animationWrapper:PlayInAnimation()
self:_RefreshModel()
end
WikiWeaponPreviewCtrl._RefreshRight = HL.Method(HL.Opt(HL.Boolean)) << function(self, playAnim)
if playAnim then
self.view.right.recipeNodeAnimWrapper:PlayOutAnimation(function()
self:_RefreshWeaponShowInfo(self:_GetWeaponShowData(self.m_curWeaponState))
self.view.right.recipeNodeAnimWrapper:PlayInAnimation()
end)
else
self:_RefreshWeaponShowInfo(self:_GetWeaponShowData(self.m_curWeaponState))
end
end
WikiWeaponPreviewCtrl._GetWeaponShowData = HL.Method(HL.Number).Return(HL.Table) << function(self, weaponState)
local templateId = self.m_wikiEntryShowData.wikiEntryData.refItemId
local maxLevel, initMaxLevel, breakThroughCount, maxBreakthroughLevel, maxRefineLevel = 0, 0, 0, 0, 0
local _, weaponBasicData = Tables.weaponBasicTable:TryGetValue(templateId)
if weaponBasicData then
maxLevel = weaponBasicData.maxLv
local _, weaponBreakThroughDetailList = Tables.weaponBreakThroughTemplateTable:TryGetValue(weaponBasicData.breakthroughTemplateId)
if weaponBreakThroughDetailList then
breakThroughCount = #weaponBreakThroughDetailList.list
if breakThroughCount > 1 then
initMaxLevel = weaponBreakThroughDetailList.list[1].breakthroughLv
maxBreakthroughLevel = breakThroughCount - 1
end
end
local _, weaponTalentDetailList = Tables.weaponTalentTemplateTable:TryGetValue(weaponBasicData.talentTemplateId)
if weaponTalentDetailList then
maxRefineLevel = #weaponTalentDetailList.list
end
end
local isMaxLevel = weaponState ~= WeaponState.Init
local weaponShowData = {
templateId = templateId,
level = isMaxLevel and maxLevel or 1,
maxLevel = isMaxLevel and maxLevel or initMaxLevel,
breakthroughLevel = isMaxLevel and maxBreakthroughLevel or 0,
maxBreakthroughLevel = maxBreakthroughLevel,
refineLevel = isMaxLevel and maxRefineLevel or 0,
}
return weaponShowData
end
WikiWeaponPreviewCtrl._RefreshWeaponShowInfo = HL.Method(HL.Table) << function(self, weaponShowData)
local view = self.view.right
local isMax = weaponShowData.level == weaponShowData.maxLevel
local isGemMax = self.m_curWeaponState == WeaponState.Gem
view.levelText.text = tostring(weaponShowData.level)
view.maxText.text = string.format("/%d", weaponShowData.maxLevel)
view.levelBreakNode:InitLevelBreakNodeSimple(weaponShowData.breakthroughLevel, weaponShowData.maxBreakthroughLevel, false)
view.weaponAttributeNode:InitWeaponAttributeNodeByTemplateId(weaponShowData.templateId, isMax)
view.weaponSkillNode:InitWeaponSkillNodeByTemplateId(weaponShowData.templateId, weaponShowData.breakthroughLevel,
weaponShowData.refineLevel, isGemMax)
view.potentialStar:InitWeaponPotentialStar(weaponShowData.refineLevel)
view.potentialStar.view.breakthroughBg.gameObject:SetActive(not isMax)
local gemInst
if self.m_curWeaponState == WeaponState.Gem then
gemInst = CS.Beyond.Gameplay.InventorySystem.CreateWeaponPerfectGemInst(weaponShowData.templateId)
end
view.weaponGemSlimNode:InitWeaponGemSlimeNodeByInst(gemInst)
end
WikiWeaponPreviewCtrl._InitController = HL.Virtual() << function(self)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId})
UIUtils.bindHyperlinkPopup(self, "wiki_detail_right", self.view.inputGroup.groupId)
end
WikiWeaponPreviewCtrl._PlayDecoAnim = HL.Method() << function(self)
if self.m_phase then
self.m_phase:PlayDecoAnim("wiki_uideco_grouptoweaponpanel")
end
end
HL.Commit(WikiWeaponPreviewCtrl)