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

353 lines
14 KiB
Lua

local wikiDetailBaseCtrl = require_ex('UI/Panels/WikiDetailBase/WikiDetailBaseCtrl')
local PANEL_ID = PanelId.WikiBuilding
WikiBuildingCtrl = HL.Class('WikiBuildingCtrl', wikiDetailBaseCtrl.WikiDetailBaseCtrl)
local DEFAULT_TITLE_KEY = "ui_wiki_building_extra"
local DETAIL_TITLE_TEXT_KEY =
{
["wiki_group_building_source"] = "ui_wiki_building_mine",
["wiki_group_building_basic"] = "ui_wiki_building_usable_formula",
["wiki_group_building_assemble"] = "ui_wiki_building_usable_formula",
["wiki_group_building_battle"] = "ui_wiki_building_battle",
["wiki_group_building_soil"] = "ui_wiki_building_soil",
}
local HIDE_CRAFT_TREE_GROUP_TABLE =
{
wiki_group_building_logistic = true,
}
WikiBuildingCtrl.OnShow = HL.Override() << function(self)
WikiBuildingCtrl.Super.OnShow(self)
self:_RefreshModel()
self:_PlayBgDecoAnim()
end
WikiBuildingCtrl.OnClose = HL.Override() << function(self)
WikiBuildingCtrl.Super.OnClose(self)
if self.m_phase then
self.m_phase:ActiveModelRotateRoot(false)
end
end
WikiBuildingCtrl._OnPlayAnimationOut = HL.Override() << function(self)
WikiBuildingCtrl.Super._OnPlayAnimationOut(self)
self.m_phase:PlayBgAnim("wiki_plane_tobuilding_out")
end
WikiBuildingCtrl.GetPanelId = HL.Override().Return(HL.Number) << function(self)
return PANEL_ID
end
WikiBuildingCtrl._OnPhaseItemBind = HL.Override() << function(self)
WikiBuildingCtrl.Super._OnPhaseItemBind(self)
self:_RefreshModel(true)
self:_PlayBgDecoAnim()
end
WikiBuildingCtrl._RefreshCenter = HL.Override() << function(self)
WikiBuildingCtrl.Super._RefreshCenter(self)
self:_RefreshModel()
end
WikiBuildingCtrl.m_isBtnInited = HL.Field(HL.Boolean) << false
WikiBuildingCtrl._RefreshRight = HL.Override() << function(self)
local view = self.view.right
local itemId = self.m_wikiEntryShowData.wikiEntryData.refItemId
if not self.m_isBtnInited then
self.m_isBtnInited = true
view.viewBtn.onClick:AddListener(function()
self:_StartCoroutine(function()
coroutine.step()
self.view.right.naviGroup:ManuallyStopFocus()
self.view.right.controllerFocusHintNode.gameObject:SetActive(true)
end)
self.m_phase:CreatePhasePanelItem(PanelId.WikiCraftingTree, {
wikiEntryShowData = self.m_wikiEntryShowData,
forceShowBackBtn = true,
})
end)
end
view.viewBtn.gameObject:SetActive(HIDE_CRAFT_TREE_GROUP_TABLE[self.m_wikiEntryShowData.wikiGroupData.groupId] ~= true)
self:_RefreshDetail(itemId)
local isFocusEnabled = self.m_obtainCellCache:GetCount() > 0 or
(view.itemObtainWaysForWiki.m_obtainCells:GetCount() > 0 and view.itemObtainWaysForWiki.view.gameObject.activeSelf)
view.naviGroup.enabled = isFocusEnabled
self.view.right.controllerFocusHintNode.gameObject:SetActive(isFocusEnabled)
end
WikiBuildingCtrl.m_craftCellCache = HL.Field(HL.Forward("UIListCache"))
WikiBuildingCtrl.m_obtainCellCache = HL.Field(HL.Forward("UIListCache"))
WikiBuildingCtrl._RefreshDetail = HL.Method(HL.String) << function(self, itemId)
self.view.right.itemObtainWaysForWiki:InitItemObtainWays(itemId, nil, self.m_itemTipsPosInfo, function(cell, craftCellView)
self:_OnClickRightItemCell(cell, craftCellView)
end)
local lastCraftFirstSelectable, lastCraftNaviGroup = self:_InitItemObtainWaysController(self.view.right.itemObtainWaysForWiki)
local view = self.view.right.itemDetail
local modeTypeTable = {}
for modeType, modeTypeData in pairs(Tables.factoryMachineCraftModeTable) do
modeTypeTable[modeTypeData.sortId] = modeType
end
local modeInfos = {}
local buildingData = FactoryUtils.getItemBuildingData(itemId)
if buildingData then
local _, machineCrafterData = Tables.factoryMachineCrafterTable:TryGetValue(buildingData.id)
if machineCrafterData and #machineCrafterData.modeMap > 0 then
for _, modeData in pairs(machineCrafterData.modeMap) do
local craftInfos = FactoryUtils.getBuildingCrafts(buildingData.id, nil, nil, modeData.modeName)
local _, modeTypeData = Tables.factoryMachineCraftModeTable:TryGetValue(modeData.modeName)
if modeTypeData and craftInfos and next(craftInfos) then
table.insert(modeInfos, { modeType = modeData.modeName, craftInfos = craftInfos, sortId = modeTypeData.sortId })
end
end
table.sort(modeInfos, Utils.genSortFunction({ "sortId" }, true))
else
local craftInfos = FactoryUtils.getBuildingCrafts(buildingData.id)
if craftInfos and next(craftInfos) then
table.insert(modeInfos, { modeType = FacConst.FAC_FORMULA_MODE_MAP.NORMAL, craftInfos = craftInfos })
end
end
end
local modeInfoCount = #modeInfos
if not self.m_obtainCellCache then
self.m_obtainCellCache = UIUtils.genCellCache(view.obtainCell)
end
self.m_obtainCellCache:Refresh(modeInfoCount, function(obtainCell, index)
local modeInfo = modeInfos[index]
obtainCell.titleNode.gameObject:SetActive(modeInfoCount > 1)
if modeInfoCount > 1 then
local _, modeData = Tables.factoryMachineCraftModeTable:TryGetValue(modeInfo.modeType)
if modeData then
obtainCell.nameTxt.text = modeData.machineModeTypeName
local hasIcon = not string.isEmpty(modeData.iconId)
obtainCell.titleImg.gameObject:SetActive(hasIcon)
if hasIcon then
obtainCell.titleImg:LoadSprite(UIConst.UI_SPRITE_FAC_BUILDING_PANEL_ICON, modeData.iconId)
end
end
end
obtainCell.titleNodeToggle.onIsNaviTargetChanged = function(isTarget)
if isTarget then
self.view.right.scrollRect:ScrollToNaviTarget(obtainCell.titleNodeToggle)
Notify(MessageConst.HIDE_ITEM_TIPS)
end
end
obtainCell.titleNodeToggle.useExplicitNaviSelect = true
if lastCraftFirstSelectable and obtainCell.titleNodeToggle.isActiveAndEnabled then
obtainCell.titleNodeToggle.banExplicitOnUp = false
obtainCell.titleNodeToggle:SetExplicitSelectOnUp(lastCraftFirstSelectable)
lastCraftFirstSelectable.useExplicitNaviSelect = true
lastCraftFirstSelectable.banExplicitOnLeft = true
lastCraftFirstSelectable.banExplicitOnRight = true
lastCraftFirstSelectable.banExplicitOnUp = true
lastCraftFirstSelectable.banExplicitOnDown = false
lastCraftFirstSelectable:SetExplicitSelectOnDown(obtainCell.titleNodeToggle)
else
obtainCell.titleNodeToggle.banExplicitOnUp = true
end
if obtainCell.titleNodeToggle.isActiveAndEnabled and lastCraftNaviGroup then
obtainCell.titleNaviGroup.naviPartnerOnUp:Clear()
obtainCell.titleNaviGroup.naviPartnerOnDown:Clear()
lastCraftNaviGroup.naviPartnerOnDown:Add(obtainCell.titleNaviGroup)
obtainCell.titleNaviGroup.naviPartnerOnUp:Add(lastCraftNaviGroup)
lastCraftNaviGroup = obtainCell.titleNaviGroup
end
obtainCell.titleNodeToggle.onValueChanged:RemoveAllListeners()
obtainCell.titleNodeToggle.onValueChanged:AddListener(function(isOn)
if DeviceInfo.usingController then
for i = 1, obtainCell.m_craftCellCache:GetCount() do
local craftCell = obtainCell.m_craftCellCache:GetItem(i)
InputManagerInst:ToggleBinding(craftCell.view.pinBtn.view.pinToggle.toggleBindingId, false)
end
end
end)
if not obtainCell.m_craftCellCache then
obtainCell.m_craftCellCache = UIUtils.genCellCache(obtainCell.craftCell)
end
local firstItemSelectable
obtainCell.m_craftCellCache:Refresh(#modeInfo.craftInfos, function(craftCell, index)
local craftInfo = modeInfo.craftInfos[index]
craftInfo.buildingId = nil
craftCell.view.outcomeItem = craftCell.view.outcomeItemBlack
craftCell.view.incomeItem = craftCell.view.incomeItemBlack
craftCell:InitCraftCell(craftInfo, self.m_itemTipsPosInfo, function(cell)
self:_OnClickRightItemCell(cell, craftCell.view)
end)
if DeviceInfo.usingController then
InputManagerInst:ToggleBinding(craftCell.view.pinBtn.view.pinToggle.toggleBindingId, false)
craftCell.view.selectableNaviGroup.naviPartnerOnUp:Clear()
craftCell.view.selectableNaviGroup.naviPartnerOnDown:Clear()
if lastCraftNaviGroup then
if index == 1 then
if not obtainCell.titleNodeToggle.isActiveAndEnabled then
lastCraftNaviGroup.naviPartnerOnDown:Add(craftCell.view.selectableNaviGroup)
craftCell.view.selectableNaviGroup.naviPartnerOnUp:Add(lastCraftNaviGroup)
end
else
lastCraftNaviGroup.naviPartnerOnDown:Add(craftCell.view.selectableNaviGroup)
craftCell.view.selectableNaviGroup.naviPartnerOnUp:Add(lastCraftNaviGroup)
end
end
lastCraftNaviGroup = craftCell.view.selectableNaviGroup
end
craftCell.view.pinKeyHint.gameObject:SetActive(false)
for i = 1, craftCell.incomeCache:GetCount() do
local selectable = craftCell.incomeCache:GetItem(i).view.button
selectable.useExplicitNaviSelect = false
selectable.onIsNaviTargetChanged = function(isTarget)
self:_OnRightItemIsNaviTargetChanged(isTarget, selectable, craftCell.view)
end
if firstItemSelectable == nil then
firstItemSelectable = selectable
end
if i == 1 then
lastCraftFirstSelectable = selectable
end
end
for i = 1, craftCell.outcomeItemsCache:GetCount() do
local selectable = craftCell.outcomeItemsCache:GetItem(i).view.button
selectable.useExplicitNaviSelect = false
selectable.onIsNaviTargetChanged = function(isTarget)
self:_OnRightItemIsNaviTargetChanged(isTarget, selectable, craftCell.view)
end
end
end)
if firstItemSelectable and obtainCell.titleNodeToggle.isActiveAndEnabled then
obtainCell.titleNodeToggle.banExplicitOnDown = false
obtainCell.titleNodeToggle:SetExplicitSelectOnDown(firstItemSelectable)
firstItemSelectable.useExplicitNaviSelect = true
firstItemSelectable.banExplicitOnLeft = true
firstItemSelectable.banExplicitOnRight = true
firstItemSelectable.banExplicitOnDown = true
firstItemSelectable.banExplicitOnUp = false
firstItemSelectable:SetExplicitSelectOnUp(obtainCell.titleNodeToggle)
else
obtainCell.titleNodeToggle.banExplicitOnDown = true
end
end)
local titleTextKey = DETAIL_TITLE_TEXT_KEY[self.m_wikiEntryShowData.wikiGroupData.groupId]
if not titleTextKey then
titleTextKey = DEFAULT_TITLE_KEY
end
view.obtainTitle.text = Language[titleTextKey]
local desc = self.m_wikiEntryShowData.wikiEntryData.desc
view.emptyText.gameObject:SetActive(modeInfoCount == 0 and string.isEmpty(desc))
view.descTxt.gameObject:SetActive(not string.isEmpty(desc))
view.descTxt:SetAndResolveTextStyle(desc)
end
WikiBuildingCtrl._RefreshModel = HL.Method(HL.Opt(HL.Boolean)) << function(self, playInAnim)
if self.m_phase then
local isShowImg = lume.find(WikiConst.BUILDING_SHOW_IMG_GROUP_ID_LIST, self.m_wikiEntryShowData.wikiGroupData.groupId) ~= nil
self.view.wikiItemImg.gameObject:SetActive(isShowImg)
if isShowImg then
self.m_phase:DestroyModel()
self.m_phase:ActiveCategorySceneItem(self.m_wikiEntryShowData.wikiCategoryType)
local cameraDistance = DataManager.wikiModelConfig.buildingDefaultCameraDistance
self.m_phase:_SetCameraParams(self.m_phase.m_currentCamera.vcam_entry, cameraDistance)
local sceneScale = 1
self.m_phase:SetSceneScale(1)
local factor = DataManager.wikiModelConfig.buildingSceneScaleOffsetFactor
local sceneOffset = -factor * sceneScale + factor + DataManager.wikiModelConfig.buildingSceneOffsetY * sceneScale
self.m_phase:SetSceneOffset(sceneOffset)
self.m_phase.m_sceneRoot.view.ground:SetParent(self.m_phase.m_currentCamera.vcam_entry.transform, true)
self.m_phase.m_sceneRoot.view.ground.localPosition = self.m_phase.m_sceneRoot.view.config.BUILDING_GROUND_OFFSET
self.m_phase.m_sceneRoot.view.ground.localScale = self.m_phase.m_sceneRoot.view.config.BUILDING_GROUND_SCALE
local _, itemData = Tables.itemTable:TryGetValue(self.m_wikiEntryShowData.wikiEntryData.refItemId)
if itemData then
self.view.wikiItemImg:LoadSprite(UIConst.UI_SPRITE_ITEM_BIG, itemData.iconId)
end
else
self.m_phase:ShowModel(self.m_wikiEntryShowData, { playInAnim = playInAnim })
end
self.m_phase:ActiveEntryVirtualCamera(true)
end
end
WikiBuildingCtrl._PlayBgDecoAnim = HL.Method() << function(self)
if self.m_phase then
self.m_phase:PlayBgAnim("wiki_plane_tobuilding_in")
self.m_phase:PlayDecoAnim("wiki_uideco_grouptobuildingpanel")
end
end
HL.Commit(WikiBuildingCtrl)