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

296 lines
9.4 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.SettlementTokenInstruction
local settlementSystem = GameInstance.player.settlementSystem
SettlementTokenInstructionCtrl = HL.Class('SettlementTokenInstructionCtrl', uiCtrl.UICtrl)
SettlementTokenInstructionCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_SETTLEMENT_REMAIN_MONEY_MODIFY] = '_OnRemainMoneyModify',
}
SettlementTokenInstructionCtrl.m_stlId = HL.Field(HL.String) << ""
SettlementTokenInstructionCtrl.m_curLevel = HL.Field(HL.Number) << 0
SettlementTokenInstructionCtrl.m_info = HL.Field(HL.Table)
SettlementTokenInstructionCtrl.m_tickTimeKey = HL.Field(HL.Number) << -1
SettlementTokenInstructionCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self:_InitUI()
if arg == nil or type(arg) ~= "string" then
logger.error(ELogChannel.UI, "据点代币说明界面参数错误")
return
end
self:_InitData(arg)
self:_RefreshAllUI()
end
SettlementTokenInstructionCtrl.OnShow = HL.Override() << function(self)
self.m_tickTimeKey = LuaUpdate:Add("Tick", function(deltaTime)
self:_RefreshTimeText()
end)
settlementSystem:AddSettlementSyncRequest(self.view.transform.name)
end
SettlementTokenInstructionCtrl.OnClose = HL.Override() << function(self)
LuaUpdate:Remove(self.m_tickTimeKey)
settlementSystem:RemoveSettlementSyncRequest(self.view.transform.name)
end
SettlementTokenInstructionCtrl._InitData = HL.Method(HL.Any) << function(self, arg)
self.m_stlId = arg
self.m_curLevel = settlementSystem:GetSettlementLevel(self.m_stlId)
local stlData = Tables.settlementBasicDataTable[self.m_stlId]
local stlLevelData = stlData.settlementLevelMap[self.m_curLevel]
local domainCfg = Tables.domainDataTable[stlData.domainId]
local moneyId = domainCfg.domainGoldItemId
local moneyItemData = Tables.itemTable[moneyId]
local basicProduceSpeed = stlLevelData.moneyPeriod * 3600 / Tables.settlementConst.produceMoneyDurationPerLoop
local officerId = settlementSystem:GetSettlementOfficerId(self.m_stlId)
local officerEnhanceRate = 0
if not string.isEmpty(officerId) then
for _, stlTagId in pairs(stlData.wantTagIdGroup) do
if settlementSystem:IsCharMatchSettlementTag(officerId, stlTagId) then
local stlTagData = Tables.settlementTagTable[stlTagId]
officerEnhanceRate = officerEnhanceRate + stlTagData.enhanceMoneyProduceSpeedRate
end
end
end
self.m_info = {
curMoney = settlementSystem:GetSettlementCurMoney(self.m_stlId),
maxMoney = stlLevelData.moneyMax,
moneyIcon = moneyItemData.iconId,
filledMoneyTime = 0,
basicProduceSpeed = basicProduceSpeed,
totalProduceSpeed = math.floor(basicProduceSpeed * (100 + officerEnhanceRate) / 100),
speedHasEnhance = false,
totalEnhance = 0,
officerEnhanceRate = officerEnhanceRate,
hasTimeLimitTdGainEffect = false,
timeLimitTdEffectLevelName = "",
timeLimitTdGainEffect = 0,
tdGainEffectExpirationTs = 0,
tdGainEffectLevelName = "",
tdGainEffect = 0,
}
self:_UpdateDefenseGainEffect()
self.m_info.speedHasEnhance = self.m_info.officerEnhanceRate > 0 or
self.m_info.hasTimeLimitTdGainEffect or
self.m_info.tdGainEffect > 0
self.m_info.totalEnhance = self.m_info.officerEnhanceRate + self.m_info.tdGainEffect + self.m_info.timeLimitTdGainEffect
self.m_info.totalProduceSpeed = math.floor(basicProduceSpeed * (100 + self.m_info.totalEnhance) / 100)
self.m_info.filledMoneyTime = self:_GetFilledMoneyTime()
end
SettlementTokenInstructionCtrl._UpdateDefenseGainEffect = HL.Method() << function(self)
local settlementData = settlementSystem:GetUnlockSettlementData(self.m_stlId)
if settlementData == nil then
return
end
if settlementData ~= nil and DateTimeUtils.GetCurrentTimestampBySeconds() < settlementData.tdGainEffectExpirationTs then
self.m_info.hasTimeLimitTdGainEffect = true
self.m_info.timeLimitTdEffectLevelName = self:_GetLevelGroupName(settlementData.timeLimitTdGainEffectByTdId)
self.m_info.timeLimitTdGainEffect = settlementData.timeLimitTdGainEffect
self.m_info.tdGainEffectExpirationTs = settlementData.tdGainEffectExpirationTs
end
if settlementData.tdGainEffect > 0 then
self.m_info.tdGainEffect = settlementData.tdGainEffect
self.m_info.tdGainEffectLevelName = self:_GetLevelGroupName(settlementData.tdGainEffectByTdId)
end
end
SettlementTokenInstructionCtrl._InitUI = HL.Method() << function(self)
self.view.closeBtn.onClick:AddListener(function()
self:PlayAnimationOutAndClose()
end)
self.view.fullScreenCloseBtn.onClick:AddListener(function()
self:PlayAnimationOutAndClose()
end)
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({self.view.inputGroup.groupId})
end
SettlementTokenInstructionCtrl._RefreshAllUI = HL.Method() << function(self)
self.view.curOwnMoneyTxt.text = self.m_info.curMoney
self.view.maxOwnMoneyTxt.text = "/" .. self.m_info.maxMoney
self.view.moneyIconImg1:LoadSprite(UIConst.UI_SPRITE_WALLET, self.m_info.moneyIcon)
self.view.moneyIconImg2:LoadSprite(UIConst.UI_SPRITE_WALLET, self.m_info.moneyIcon)
self.view.moneyProduceSpeedTxt.text = self.m_info.totalProduceSpeed
self.view.moneyProduceStateCtrl:SetState(self.m_info.speedHasEnhance and "HasEnhance" or "Normal")
self.view.basicSpeedTxt.text = string.format(Language.LUA_SETTLEMENT_BASIC_MONEY_PRODUCE_SPEED, self.m_info.basicProduceSpeed)
if self.m_info.speedHasEnhance then
self.view.improveNode.gameObject:SetActive(true)
local totalEnhance = self.m_info.totalEnhance
self.view.improvePercentTxt.text = string.format("%d%%", totalEnhance)
self.view.improveDescTxt:SetAndResolveTextStyle(string.format(Language.LUA_SETTLEMENT_MONEY_EXTRA_ENHANCE_TEXT, totalEnhance))
if self.m_info.officerEnhanceRate ~= 0 then
self.view.officerNode.gameObject:SetActive(true)
self.view.officerEffectNumTxt.text = string.format("%d%%", self.m_info.officerEnhanceRate)
else
self.view.officerNode.gameObject:SetActive(false)
end
self:_RefreshGainEffect()
else
self.view.improveNode.gameObject:SetActive(false)
end
self:_RefreshTimeText()
end
SettlementTokenInstructionCtrl._RefreshTimeText = HL.Method() << function(self)
local curTime = DateTimeUtils.GetCurrentTimestampBySeconds()
local leftSec = self:_GetFilledMoneyTime() - curTime
if leftSec <= 0 then
self.view.timeNode.gameObject:SetActive(false)
return
end
self.view.timeNode.gameObject:SetActive(true)
local showTimeStr = UIUtils.getFullLeftTime(leftSec)
self.view.timeTxt.text = string.format(Language.LUA_SETTLEMENT_FILLED_MONEY_TIME, showTimeStr)
end
SettlementTokenInstructionCtrl._GetFilledMoneyTime = HL.Method().Return(HL.Number) << function(self)
local curTime = DateTimeUtils.GetCurrentTimestampBySeconds()
local leftMoney = self.m_info.maxMoney - self.m_info.curMoney
if leftMoney <= 0 then
return curTime
end
local leftTime = leftMoney * 3600 / self.m_info.totalProduceSpeed
return curTime + leftTime
end
SettlementTokenInstructionCtrl._RefreshGainEffect = HL.Method() << function(self)
self.view.manualDefenseNode.gameObject:SetActive(false)
self.view.defensivePlanNode.gameObject:SetActive(false)
if self.m_info.hasTimeLimitTdGainEffect then
self.view.manualDefenseNode.gameObject:SetActive(true)
self.view.manualDefenseNode.gainSpeedTxt.text = string.format(Language.LUA_TD_LEVEL_COMPLETED_FORMAT, self.m_info.timeLimitTdEffectLevelName)
self.view.manualDefenseNode.buffManNumTxt.text = string.format("%d%%", math.floor(self.m_info.timeLimitTdGainEffect))
self.view.manualDefenseNode.durationNode:InitCountDownText(self.m_info.tdGainEffectExpirationTs, function()
self:_UpdateDefenseGainEffect()
self:_RefreshGainEffect()
end, UIUtils.getLeftTimeToSecond)
end
if self.m_info.tdGainEffect > 0 then
self.view.defensivePlanNode.gameObject:SetActive(true)
self.view.defensivePlanNode.defensivePlanTxt.text = string.format(Language.LUA_TD_LEVEL_COMPLETED_FORMAT, self.m_info.tdGainEffectLevelName)
self.view.defensivePlanNode.buffNumTxt.text = string.format("%d%%", math.floor(self.m_info.tdGainEffect))
end
end
SettlementTokenInstructionCtrl._OnRemainMoneyModify = HL.Method(HL.Any) << function(self, arg)
local stlId, curMoney = unpack(arg)
if self.m_stlId ~= stlId or self.m_info == nil then
return
end
self.m_info.curMoney = curMoney
self.m_info.filledMoneyTime = self:_GetFilledMoneyTime()
self.view.curOwnMoneyTxt.text = curMoney
end
SettlementTokenInstructionCtrl._GetLevelGroupName = HL.Method(HL.String).Return(HL.String) << function(self, tdId)
local levelName = ""
local _, tdLevelData = Tables.towerDefenseTable:TryGetValue(tdId)
if tdLevelData then
local _, groupTableData = Tables.towerDefenseGroupTable:TryGetValue(tdLevelData.tdGroup)
if groupTableData then
levelName = groupTableData.name
end
end
return levelName
end
HL.Commit(SettlementTokenInstructionCtrl)