Files
Endfield-Data/LuaScripts/UI/Widgets/SSGrowCabinBoxInfo.lua
2025-12-02 20:37:18 +07:00

350 lines
13 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
SSGrowCabinBoxInfo = HL.Class('SSGrowCabinBoxInfo', UIWidgetBase)
SSGrowCabinBoxInfo.m_roomId = HL.Field(HL.String) << ""
SSGrowCabinBoxInfo.m_boxId = HL.Field(HL.Number) << -1
SSGrowCabinBoxInfo.m_ctrl = HL.Field(HL.Userdata) << nil
SSGrowCabinBoxInfo.m_onBtnAddClick = HL.Field(HL.Function)
SSGrowCabinBoxInfo.m_inputIds = HL.Field(HL.Table)
SSGrowCabinBoxInfo._OnFirstTimeInit = HL.Override() << function(self)
self.view.btnAdd.onClick:AddListener(function()
if self.m_onBtnAddClick then
self.m_onBtnAddClick(self.m_boxId, false)
end
end)
local cultureCultivation = self.view.cultureCultivation
cultureCultivation.receiveBtn.onClick:AddListener(function()
GameInstance.player.spaceship:GrowCabinHarvest(self.m_roomId, self.m_boxId)
end)
cultureCultivation.cancelBtn.onClick:AddListener(function()
self:_OnCancelBtnClick()
end)
local culture = self.view.culture
culture.button.onClick:AddListener(function()
if self.m_onBtnAddClick then
self.m_onBtnAddClick(self.m_boxId, true)
end
end)
culture.bubble.onClick:AddListener(function()
self:_OnBubbleBtnClick()
end)
culture.cantBubble.onClick:AddListener(function()
self:_OnCantBubbleBtnClick()
end)
local function SetKeyHintState(select)
self.view.keyHintRemove.gameObject:SetActive(select)
self.view.keyHintCabinCollect.gameObject:SetActive(select)
self.view.keyHintItemDetail.gameObject:SetActive(select)
self.view.keyHintCulture.gameObject:SetActive(select)
self.view.keyHintCultureAgain.gameObject:SetActive(select)
self.view.keyHintBtnAdd.gameObject:SetActive(select)
end
SetKeyHintState(false)
self.view.inputBindingGroupNaviDecorator.onGroupSetAsNaviTarget:AddListener(function(select)
SetKeyHintState(select)
end)
end
SSGrowCabinBoxInfo._ShowPopUp = HL.Method(HL.Table) << function(self, args)
Notify(MessageConst.SHOW_POP_UP, {
content = args.content,
subContent = args.subContent,
items = args.items,
onConfirm = args.onConfirm,
onCancel = args.onCancel,
})
end
SSGrowCabinBoxInfo._OnCancelBtnClick = HL.Method() << function(self)
local spaceship = GameInstance.player.spaceship
local boxes = spaceship:GetGrowCabinBoxes(self.m_roomId)
local succ, box = boxes:TryGetValue(self.m_boxId)
if succ then
local formula = Tables.spaceshipGrowCabinFormulaTable[box.scdMsg.RecipeId]
local itemData = Tables.itemTable[formula.outcomeItemId]
local args = {
content = string.format(Language.LUA_SPACESHIP_ROOM_GROW_CABIN_BOX_CANCEL_SOW_CONFIRM_FORMAT,
itemData.name),
subContent = Language.LUA_SPACESHIP_ROOM_GROW_CABIN_BOX_CANCEL_SOW_CONFIRM_SUB_DESC,
onConfirm = function()
GameInstance.player.spaceship:GrowCabinCancel(self.m_roomId, self.m_boxId)
end,
}
self:_ShowPopUp(args)
end
end
SSGrowCabinBoxInfo._OnBubbleBtnClick = HL.Method() << function(self)
local spaceship = GameInstance.player.spaceship
local boxes = spaceship:GetGrowCabinBoxes(self.m_roomId)
local succ, box = boxes:TryGetValue(self.m_boxId)
if succ then
local formula = Tables.spaceshipGrowCabinFormulaTable[box.scdMsg.PreviewRecipeId]
local seedItemData = Tables.itemTable[formula.seedItemId]
local outcomeItemData = Tables.itemTable[formula.outcomeItemId]
local args = {
content = string.format(Language.LUA_SPACESHIP_ROOM_GROW_CABIN_CONTINUE_SOW_CONFIRM_FORMAT,
outcomeItemData.name),
subContent = string.format(Language.LUA_SPACESHIP_ROOM_GROW_CABIN_CONTINUE_SOW_CONFIRM_SUB_FORMAT,
seedItemData.name, formula.seedItemCount),
items = { { id = seedItemData.id, needCount = formula.seedItemCount, count = Utils.getItemCount(seedItemData.id) } },
onConfirm = function()
if not string.isEmpty(box.previewRecipeId) then
GameInstance.player.spaceship:GrowCabinSow(self.m_roomId, self.m_boxId, box.previewRecipeId)
end
end,
}
GameInstance.player.spaceship:GrowCabinClearPreviewRecipe(self.m_roomId, self.m_boxId)
self:_ShowPopUp(args)
end
end
SSGrowCabinBoxInfo._OnCantBubbleBtnClick = HL.Method() << function(self)
local spaceship = GameInstance.player.spaceship
local boxes = spaceship:GetGrowCabinBoxes(self.m_roomId)
local succ, box = boxes:TryGetValue(self.m_boxId)
if succ then
local formulaId = box.scdMsg.PreviewRecipeId
local formula = Tables.spaceshipGrowCabinFormulaTable[formulaId]
local seedItemData = Tables.itemTable[formula.seedItemId]
local args = {
content = string.format(Language.LUA_SPACESHIP_ROOM_GROW_CABIN_CONTINUE_SOW_TO_BREED_CONFIRM_FORMAT,
seedItemData.name),
items = { { id = seedItemData.id, needCount = formula.seedItemCount, count = Utils.getItemCount(seedItemData.id) } },
onConfirm = function()
self.m_ctrl:JumpToBreed(formulaId)
end,
}
GameInstance.player.spaceship:GrowCabinClearPreviewRecipe(self.m_roomId, self.m_boxId)
self:_ShowPopUp(args)
end
end
SSGrowCabinBoxInfo.InitSSGrowCabinBoxInfo = HL.Method(HL.Userdata, HL.String, HL.Number, HL.Any, HL.Function)
<< function(self, ctrl, roomId, boxId, lineCell, onBtnAddClick)
self:_FirstTimeInit()
self.m_roomId = roomId
self.m_boxId = boxId
self.m_onBtnAddClick = onBtnAddClick
self.m_ctrl = ctrl
self.view.culture.gameObject:SetActiveIfNecessary(false)
self.view.cultureCultivation.gameObject:SetActiveIfNecessary(false)
self.view.locked.gameObject:SetActiveIfNecessary(false)
self.view.btnAdd.gameObject:SetActiveIfNecessary(false)
self:Refresh(lineCell)
end
SSGrowCabinBoxInfo.Refresh = HL.Method(HL.Any) << function(self, lineCell)
local spaceship = GameInstance.player.spaceship
local boxes = spaceship:GetGrowCabinBoxes(self.m_roomId)
local boxProducing = spaceship:IsGrowCabinBoxStateProducing(self.m_roomId, self.m_boxId)
lineCell.gameObject:SetActiveIfNecessary(boxProducing)
if not self.m_ctrl.m_trainAudioPlayed and boxProducing then
AudioManager.PostEvent("Au_UI_Event_GrowCabin_Train")
self.m_ctrl.m_trainAudioPlayed = true
end
local succ, box = boxes:TryGetValue(self.m_boxId)
if succ then
local hasFormula = box.hasFormula
local sustainable = box.sustainable
self.view.btnAdd.gameObject:SetActiveIfNecessary(not hasFormula and not sustainable)
self.view.cultureCultivation.gameObject:SetActiveIfNecessary(hasFormula)
self.view.culture.gameObject:SetActiveIfNecessary(sustainable)
if hasFormula then
local cultureCultivation = self.view.cultureCultivation
local canReceive = box.scdMsg.IsReady
cultureCultivation.pauseNode.gameObject:SetActiveIfNecessary(not boxProducing)
cultureCultivation.schedule.gameObject:SetActiveIfNecessary(not canReceive)
cultureCultivation.timeNode.gameObject:SetActiveIfNecessary(not canReceive)
cultureCultivation.cancelBtn.gameObject:SetActiveIfNecessary(not canReceive)
cultureCultivation.canBeClaimed.gameObject:SetActiveIfNecessary(canReceive)
cultureCultivation.deco.gameObject:SetActiveIfNecessary(canReceive)
cultureCultivation.bgFrame.gameObject:SetActiveIfNecessary(canReceive)
cultureCultivation.bgFrameGlow.gameObject:SetActiveIfNecessary(canReceive)
local formula = Tables.spaceshipGrowCabinFormulaTable[box.scdMsg.RecipeId]
local itemId = formula.outcomeItemId
cultureCultivation.ccItem:InitItem({ id = itemId }, true)
local haveCharSkill = spaceship:IsRoomAttrHaveCharSkill(self.m_roomId, formula.roomAttrType, false)
cultureCultivation.accNode.gameObject:SetActiveIfNecessary(haveCharSkill)
self:RefreshTimeSchedule()
end
if sustainable then
local culture = self.view.culture
local formula = Tables.spaceshipGrowCabinFormulaTable[box.scdMsg.PreviewRecipeId]
local seedItemData = Tables.itemTable[formula.seedItemId]
local outcomeItemData = Tables.itemTable[formula.outcomeItemId]
local canBubble = Utils.getItemCount(formula.seedItemId) >= formula.seedItemCount
culture.cItem:InitItem({id = outcomeItemData.id, count = formula.outcomeItemCount})
culture.bubble.gameObject:SetActiveIfNecessary(canBubble)
culture.cantBubble.gameObject:SetActiveIfNecessary(not canBubble)
culture.canIcon:LoadSprite(UIConst.UI_SPRITE_ITEM, seedItemData.iconId)
culture.cantIcon:LoadSprite(UIConst.UI_SPRITE_ITEM, seedItemData.iconId)
end
else
local unlockLevel = Tables.spaceshipGrowCabinBoxIdToUnlockLevelTable[self.m_boxId]
self.view.unlockTxt.text = string.format(Language.LUA_SPACESHIP_ROOM_GROW_CABIN_BOX_UNLOCK_CONDITION_FORMAT,
unlockLevel)
end
local isHelped = GameInstance.player.spaceship:IsGrowCabinBoxHelped(self.m_roomId, self.m_boxId)
self.view.friendBoostTips.gameObject:SetActiveIfNecessary(isHelped)
self.view.locked.gameObject:SetActiveIfNecessary(not succ)
self.view.unlock.gameObject:SetActiveIfNecessary(succ)
local culture = self.view.culture
local cultureCultivation = self.view.cultureCultivation
self.m_inputIds = self.m_inputIds or {}
for i, id in ipairs(self.m_inputIds) do
InputManagerInst:DeleteBinding(id)
end
self.m_inputIds = {}
if culture.button.gameObject.activeInHierarchy or
self.view.btnAdd.gameObject.activeInHierarchy then
local id = InputManagerInst:CreateBindingByActionId("ss_cabin_cultivate", function()
if self.m_onBtnAddClick then
if culture.button.gameObject.activeInHierarchy then
self.m_onBtnAddClick(self.m_boxId, true)
else
self.m_onBtnAddClick(self.m_boxId, false)
end
end
self.m_ctrl:_DeleteDetailNaviBinding()
end, self.view.inputBindingGroupMonoTarget.groupId)
table.insert(self.m_inputIds, id)
end
if cultureCultivation.receiveBtn.gameObject.activeInHierarchy then
local id = InputManagerInst:CreateBindingByActionId("ss_cabin_collect", function()
GameInstance.player.spaceship:GrowCabinHarvest(self.m_roomId, self.m_boxId)
end, self.view.inputBindingGroupMonoTarget.groupId)
table.insert(self.m_inputIds, id)
end
if cultureCultivation.gameObject.activeInHierarchy then
local id =InputManagerInst:CreateBindingByActionId("ss_item_detail", function()
self.view.cultureCultivation.ccItem:ShowTips()
end, self.view.inputBindingGroupMonoTarget.groupId)
table.insert(self.m_inputIds, id)
end
if self.view.cultureCultivation.cancelBtn.gameObject.activeInHierarchy then
local id = InputManagerInst:CreateBindingByActionId("ss_cabin_item_remove", function()
self:_OnCancelBtnClick()
end, self.view.inputBindingGroupMonoTarget.groupId)
table.insert(self.m_inputIds, id)
end
if culture.bubble.gameObject.activeInHierarchy or
culture.cantBubble.gameObject.activeInHierarchy then
local id = InputManagerInst:CreateBindingByActionId("ss_cabin_cultivate_again", function()
if culture.bubble.gameObject.activeInHierarchy then
self:_OnBubbleBtnClick()
return
end
if culture.cantBubble.gameObject.activeInHierarchy then
self:_OnCantBubbleBtnClick()
return
end
end, self.view.inputBindingGroupMonoTarget.groupId)
table.insert(self.m_inputIds, id)
end
end
SSGrowCabinBoxInfo.RefreshTimeSchedule = HL.Method() << function(self)
local spaceship = GameInstance.player.spaceship
local boxes = spaceship:GetGrowCabinBoxes(self.m_roomId)
local succ, box = boxes:TryGetValue(self.m_boxId)
if not succ or string.isEmpty(box.scdMsg.RecipeId) or box.scdMsg.IsReady then
return
end
local boxProducing = spaceship:IsGrowCabinBoxStateProducing(self.m_roomId, self.m_boxId)
local cultureCultivation = self.view.cultureCultivation
local diffTime = boxProducing and DateTimeUtils.GetCurrentTimestampBySeconds() - box.lastSyncTime or 0
local formula = Tables.spaceshipGrowCabinFormulaTable[box.scdMsg.RecipeId]
local produceRate = spaceship:GetRoomProduceRate(self.m_roomId, formula.roomAttrType)
local totalProgress = formula.totalProgress
local curProgress = box.scdMsg.Progress + produceRate * diffTime
cultureCultivation.schedule.fillAmount = curProgress / totalProgress
cultureCultivation.timeTxt.text = UIUtils.getLeftTimeToSecond(math.max(totalProgress - curProgress,
0) / produceRate)
cultureCultivation.pauseNode.gameObject:SetActive(spaceship:IsGrowCabinStateShutDown(self.m_roomId))
end
HL.Commit(SSGrowCabinBoxInfo)
return SSGrowCabinBoxInfo