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

320 lines
8.7 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.FacSoil
FacSoilCtrl = HL.Class('FacSoilCtrl', uiCtrl.UICtrl)
FacSoilCtrl.s_messages = HL.StaticField(HL.Table) << {
}
FacSoilCtrl.m_nodeId = HL.Field(HL.Any)
FacSoilCtrl.m_soil = HL.Field(HL.Userdata)
FacSoilCtrl.m_seedItemTypeCount = HL.Field(HL.Number) << 0
FacSoilCtrl.m_seedInfoList = HL.Field(HL.Table)
FacSoilCtrl.m_getCell = HL.Field(HL.Function)
FacSoilCtrl.m_selectedSeedItem = HL.Field(HL.Table)
FacSoilCtrl.m_selectedCell = HL.Field(HL.Userdata)
FacSoilCtrl.m_curFocusCell = HL.Field(HL.Userdata)
FacSoilCtrl.m_selectSeedView = HL.Field(HL.Boolean) << false
FacSoilCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
local nodeId = arg.uiInfo.nodeId
local uiInfo = arg.uiInfo
self.view.buildingCommon:InitBuildingCommon(uiInfo)
self.m_soil = GameInstance.player.facSoilSystem:GetSoilNodeInCurrentRegion(nodeId)
self.view.btnPlant.onClick:RemoveAllListeners()
self.view.btnPlant.onClick:AddListener(function()
self:_OnBtnPlant()
end)
self.view.btnCancel.onClick:RemoveAllListeners()
self.view.btnCancel.onClick:AddListener(function()
self:_OnBtnCancel()
end)
self.view.btnHarvest.onClick:RemoveAllListeners()
self.view.btnHarvest.onClick:AddListener(function()
self:_OnBtnHarvest()
end)
self.m_selectSeedView = false
self:_UpdateStateInfo()
self:_StartCoroutine(function()
while true do
coroutine.step()
self:_UpdateStateInfo()
end
end)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId})
InputManagerInst:SetVirtualMouseIconVisible(false)
end
FacSoilCtrl._UpdateStateInfo = HL.Method() << function(self)
local soil = self.m_soil
if soil.hasSeed then
self.view.panelSelect.gameObject:SetActiveIfNecessary(false)
self.view.panelInfo.gameObject:SetActiveIfNecessary(true)
self.view.panelEmpty.gameObject:SetActiveIfNecessary(false)
local seedItemId = soil.seedItemId
self.view.itemDisplay:InitItem({id = seedItemId, count = 1}, true)
if soil.canHarvest then
self.view.btnCancel.gameObject:SetActiveIfNecessary(false)
self.view.btnHarvest.gameObject:SetActiveIfNecessary(true)
self.view.textCanHarvest.gameObject:SetActiveIfNecessary(true)
self.view.textCountDown.gameObject:SetActiveIfNecessary(false)
self.view.sliderCountDown.size = 1.0
else
local remainTime = soil.harvestRemainTime
self.view.btnCancel.gameObject:SetActiveIfNecessary(true)
self.view.btnHarvest.gameObject:SetActiveIfNecessary(false)
self.view.textCanHarvest.gameObject:SetActiveIfNecessary(false)
self.view.textCountDown.gameObject:SetActiveIfNecessary(true)
self.view.textCountDown.text = UIUtils.getRemainingText(remainTime)
self.view.sliderCountDown.size = soil.progressRatio
end
else
if self.m_selectedSeedItem == nil then
self.view.btnPlant.gameObject:SetActiveIfNecessary(false)
else
self.view.btnPlant.gameObject:SetActiveIfNecessary(true)
end
end
self:_UpdateSelectView()
end
FacSoilCtrl._UpdateSelectView = HL.Method() << function(self)
if self.m_soil.hasSeed then
self.m_selectSeedView = false
return
end
if self.m_selectSeedView then
return
end
self.m_selectSeedView = true
self.m_seedInfoList = {}
self.m_seedItemTypeCount = 0
for k,v in pairs(Tables.factorySeedItemTable) do
local itemId = v.id
local itemCount = GameInstance.player.inventory:GetItemCountInBag(Utils.getCurrentScope(), itemId)
if itemCount > 0 then
local seedInfo = {
itemId = itemId,
itemCount = itemCount,
totalProgress = v.growTotalProgress
}
self.m_seedItemTypeCount = self.m_seedItemTypeCount + 1
self.m_seedInfoList[self.m_seedItemTypeCount] = seedInfo
end
end
if self.m_seedItemTypeCount > 0 then
self.view.panelSelect.gameObject:SetActiveIfNecessary(true)
self.view.panelInfo.gameObject:SetActiveIfNecessary(false)
self.view.panelEmpty.gameObject:SetActiveIfNecessary(false)
self.m_getCell = UIUtils.genCachedCellFunction(self.view.scrollListSeed)
self.view.scrollListSeed.onUpdateCell:AddListener(function(object, index)
self:_OnUpdateSeedItemCell(self.m_getCell(object), LuaIndex(index))
end)
self.view.scrollListSeed.onSelectedCell:AddListener(function(object, csIndex)
local cell = self.m_getCell(object)
if cell then
self:_OnFocusSeedItemCell(cell, LuaIndex(csIndex))
end
end)
self.view.scrollListSeed:UpdateCount(self.m_seedItemTypeCount)
else
self.view.panelSelect.gameObject:SetActiveIfNecessary(false)
self.view.panelInfo.gameObject:SetActiveIfNecessary(false)
self.view.panelEmpty.gameObject:SetActiveIfNecessary(true)
end
end
FacSoilCtrl.OnAnimationInFinished = HL.Override() << function(self)
local soil = self.m_soil
if soil and soil.hasSeed then
InputManagerInst:MoveVirtualMouseTo(self.view.itemDisplay.view.transform, self.uiCamera)
InputManagerInst:SetVirtualMouseIconVisible(true)
else
if self.m_seedItemTypeCount > 0 then
self.view.scrollListSeed:SetSelectedIndex(0, true, true)
InputManagerInst:SetVirtualMouseIconVisible(false)
end
end
end
FacSoilCtrl._OnUpdateSeedItemCell = HL.Method(HL.Any, HL.Number) << function(self, cell, luaIndex)
local seedItemData = self.m_seedInfoList[luaIndex]
cell.view.destroySelectNode.gameObject:SetActiveIfNecessary(false)
cell:InitItem({
id = seedItemData.itemId,
count = seedItemData.itemCount
},
function()
self:_OnFocusSeedItemCell(cell, luaIndex)
self:_OnClickSeedItemCell(cell, seedItemData, true)
end
)
cell.view.button.clickHintTextId = "key_hint_common_select"
end
FacSoilCtrl._OnFocusSeedItemCell = HL.Method(HL.Any, HL.Number) << function(self, cell, luaIndex)
if self.m_curFocusCell ~= nil then
self.m_curFocusCell:SetSelected(false)
end
self.view.scrollListSeed:SetSelectedIndex(CSIndex(luaIndex))
self.m_curFocusCell = cell
cell:SetSelected(true)
end
FacSoilCtrl._OnClickSeedItemCell = HL.Method(HL.Any, HL.Any, HL.Boolean) << function(self, cell, seedItemData)
if self.m_selectedCell == cell then
self.m_selectedCell.view.button.clickHintTextId = "key_hint_common_select"
self.m_selectedCell.view.destroySelectNode.gameObject:SetActiveIfNecessary(false)
self.m_selectedCell = nil
self.m_selectedSeedItem = nil
Notify(MessageConst.HIDE_ITEM_TIPS)
else
local posInfo = {
tipsPosType = UIConst.UI_TIPS_POS_TYPE.LeftTop,
tipsPosTransform = self.view.anchorItemTips.transform,
isSideTips = true
}
local timeCost = seedItemData.totalProgress
if self.m_selectedCell ~= nil then
self.m_selectedCell.view.destroySelectNode.gameObject:SetActiveIfNecessary(false)
self.m_selectedCell.view.button.clickHintTextId = "key_hint_common_select"
end
self.m_selectedCell = cell
cell.view.destroySelectNode.gameObject:SetActiveIfNecessary(true)
cell.view.button.clickHintTextId = "key_hint_common_unselect"
cell.prefixDesc = string.format(Language.LUA_FAC_SOIL_TIME_COST_TEXT, UIUtils.getRemainingText(timeCost))
cell.hideItemObtainWays = true
cell.hideBottomInfo = true
cell:ShowTips(posInfo)
self.m_selectedSeedItem = seedItemData
end
end
FacSoilCtrl._OnBtnPlant = HL.Method() << function(self)
local selectedSeedItem = self.m_selectedSeedItem
if selectedSeedItem ~= nil then
self.m_soil:PlantSeedFromBag(selectedSeedItem.itemId)
end
Notify(MessageConst.HIDE_ITEM_TIPS)
end
FacSoilCtrl.OnClose = HL.Override() << function(self)
Notify(MessageConst.HIDE_ITEM_TIPS)
end
FacSoilCtrl._OnBtnCancel = HL.Method() << function(self)
self:Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_FAC_SOIL_CANCEL_BUTTON_TEXT,
onConfirm = function()
self.m_soil:CancelSeed()
end
})
end
FacSoilCtrl._OnBtnHarvest = HL.Method() << function(self)
if self.m_soil.canHarvest then
self.m_soil:HarvestByPick()
end
end
HL.Commit(FacSoilCtrl)