353 lines
14 KiB
Lua
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) |