PGRData/Script/matrix/xui/xuidoomsday/XUiDoomsdayFubenLineDetail.lua
2024-09-01 22:49:41 +02:00

648 lines
22 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XUiGridDoomsdayResource = require("XUi/XUiDoomsday/XUiGridDoomsdayResource")
local XUiGridDoomsdayResourceShow = require("XUi/XUiDoomsday/XUiGridDoomsdayResourceShow")
local XUiGridDoomsdayInhabitantAttr = require("XUi/XUiDoomsday/XUiGridDoomsdayInhabitantAttr")
local XUiDoomsdayFubenLineDetail = XLuaUiManager.Register(XLuaUi, "UiDoomsdayFubenLineDetail")
--UI层建筑表现状态
local WORK_STATE = {
--待建造
EMPTY = {
NOT_SELECT_BUILDING = 1, --未选择建筑
SELECT_BUILDING = 2 --已选择建筑
},
BUILDING = 3, --建造中
WORKING = 4 --工作中/等待分配/工作打断
}
--确认按钮实际执行状态
XUiDoomsdayFubenLineDetail.CONFIRM_STATE = {
CAN_BUILD = 1, --可建造
BUILDING_INHABITANT_IN = 2, --建造中:请求撤下居民
BUILDING_INHABITANT_OUT = 3 --等待中:请求分配居民
}
function XUiDoomsdayFubenLineDetail:OnAwake()
self:AutoAddListener()
self.PanelClean.gameObject:SetActiveEx(false)
end
function XUiDoomsdayFubenLineDetail:OnStart(stageId, buildingIndex, closeCb)
self.StageId = stageId
self.StageData = XDataCenter.DoomsdayManager.GetStageData(stageId)
self.BuildingIndex = buildingIndex
self.ExistedBuilding = self.StageData:GetBuilding(buildingIndex)
self.CloseCb = closeCb
self.WorkState = nil
self.ConfirmState = nil
self.SelectBuildingCfgId = self.ExistedBuilding:GetProperty("_CfgId")
self.SelectInhabitantCount = self.ExistedBuilding:GetProperty("_WorkingInhabitantCount")
self.NeedInhabitantCount = 0
self.IdleCount = self.StageData:GetProperty("_IdleInhabitantCount")
self.IsReplace = false
end
function XUiDoomsdayFubenLineDetail:OnEnable()
self:UpdateView()
end
function XUiDoomsdayFubenLineDetail:AutoAddListener()
self.BtnClose.CallBack = handler(self, self.OnClickBtnClose)
self.BtnEnter.CallBack = handler(self, self.OnClickBtnEnter)
self.BtnRemove.CallBack = handler(self, self.OnClickBtnRemove)
self.BtnOut.CallBack = handler(self, self.OnClickBtnOut)
self.BtnIn.CallBack = handler(self, self.OnClickBtnIn)
local selectBuildingFunc = handler(self, self.OnClickBtnSelectBuilding)
self.BtnBuildSelect.CallBack = selectBuildingFunc
self.BtnBuildSelect2.CallBack = selectBuildingFunc
end
function XUiDoomsdayFubenLineDetail:UpdateView()
local stageId = self.StageId
local buildingIndex = self.BuildingIndex
local stageData = self.StageData
local building = self.ExistedBuilding
--居民信息
self:BindViewModelPropertiesToObj(
stageData,
function(idleCount, count)
self.TxtInhabitantCount.text = string.format("%d/%d", idleCount, count)
end,
"_IdleInhabitantCount",
"_InhabitantCount"
)
--居民异常状态
self:BindViewModelPropertyToObj(
stageData,
function(unhealthyInhabitantInfoList)
--只显示不健康状态下的属性
self:RefreshTemplateGrids(
self.GridAttr,
unhealthyInhabitantInfoList,
self.PanelInhabitant,
XUiGridDoomsdayInhabitantAttr,
"InhabitantAttrGrids"
)
end,
"_UnhealthyInhabitantInfoList"
)
--资源栏
self:RefreshTemplateGrids(
self.GridResource,
XDoomsdayConfigs.GetResourceIds(true),
self.PanelResource,
function()
return XUiGridDoomsdayResource.New(stageId)
end,
"ResourceGrids"
)
--建筑状态
self:BindViewModelPropertyToObj(building, handler(self, self.UpdateBuildingState), "_State")
end
--建筑状态机(数据层状态 -> UI状态
function XUiDoomsdayFubenLineDetail:UpdateBuildingState(state)
self.PanelBuildNotselected.gameObject:SetActiveEx(false)
self.PanelBuild.gameObject:SetActiveEx(false)
self.PanelClean.gameObject:SetActiveEx(false)
self.PanelWorking.gameObject:SetActiveEx(false)
self.PanelPeople.gameObject:SetActiveEx(false)
self.BtnRemove.gameObject:SetActiveEx(false)
self.BtnEnter:SetDisable(true, false)
local buildingIndex = self.BuildingIndex
local stageData = self.StageData
if state == XDoomsdayConfigs.BUILDING_STATE.EMPTY then
self:UpdateBuildingStateEmpty() --待建造
elseif state == XDoomsdayConfigs.BUILDING_STATE.BUILDING then
self:UpdateBuildingStateBuilding() --建造中
elseif state == XDoomsdayConfigs.BUILDING_STATE.WORKING then
self:UpdateBuildingStateWorking() --工作中
elseif state == XDoomsdayConfigs.BUILDING_STATE.PENDING
or state == XDoomsdayConfigs.BUILDING_STATE.UNDERSTAFFED then
if stageData:IsBuildingBuildUnderstaffed(buildingIndex) then
self:UpdateBuildingStateBuilding() --建造中断
else
self:UpdateBuildingStateWorking() --工作中断
end
else
local isDone = self.ExistedBuilding:GetProperty("_IsDone")
if isDone then --建造完成
self:UpdateBuildingStateWorking() --待分配工作
else --未建造完成,重新建造
self:UpdateBuildingStateBuilding() --建造中断
end
end
end
--待建造
function XUiDoomsdayFubenLineDetail:UpdateBuildingStateEmpty()
self.TxtTitle.text = CsXTextManagerGetText("DoomsdayFubenDetailBuildingEmptyTitle")
self.TxtDescribe.text =
XUiHelper.ConvertLineBreakSymbol(CsXTextManagerGetText("DoomsdayFubenDetailBuildingEmptyContent"))
if not self:CheckSelectedBuilding() then
--未选择建筑
self.WorkState = WORK_STATE.EMPTY.NOT_SELECT_BUILDING
self.PanelBuildNotselected.gameObject:SetActiveEx(true)
self.TxtTips.text = CsXTextManagerGetText("DoomsdayFubenDetailTipsSelectBuilding")
else
--已选择建筑
self.WorkState = WORK_STATE.EMPTY.SELECT_BUILDING
local buildingCfgId = self.SelectBuildingCfgId
--建筑名称
self.TxtBuildName.text = XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "Name")
--建造消耗资源
local constructResourceInfos = XDoomsdayConfigs.GetBuildingConstructResourceInfos(buildingCfgId)
self:RefreshTemplateGrids(
{
self.PanelUseTool1,
self.PanelUseTool2
},
constructResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"ConstructResourceGrids"
)
self:UpdateCanOperateResources(constructResourceInfos)
self.PanelBuild.gameObject:SetActiveEx(true)
end
--工作安排
self:UpdateInhabitantPanel()
end
--建造中
function XUiDoomsdayFubenLineDetail:UpdateBuildingStateBuilding()
self.WorkState = WORK_STATE.BUILDING
self.TxtTitle.text = CsXTextManagerGetText("DoomsdayFubenDetailBuildingEmptyTitle")
self.TxtDescribe.text =
XUiHelper.ConvertLineBreakSymbol(CsXTextManagerGetText("DoomsdayFubenDetailBuildingEmptyContent"))
local buildingCfgId = self.ExistedBuilding:GetProperty("_CfgId")
--建筑名称
self.TxtBuildName.text = XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "Name")
--建造消耗资源
local constructResourceInfos = XDoomsdayConfigs.GetBuildingConstructResourceInfos(buildingCfgId)
self:RefreshTemplateGrids(
{
self.PanelUseTool1,
self.PanelUseTool2
},
constructResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"ConstructResourceGrids"
)
--self:UpdateCanOperateResources(constructResourceInfos)
--除废墟类型外显示移除按钮
if not XDoomsdayConfigs.IsBuildingRuins(buildingCfgId) then
self.BtnRemove.gameObject:SetActiveEx(true)
end
self.PanelBuild.gameObject:SetActiveEx(true)
--工作安排
self:UpdateInhabitantPanel()
end
--工作中/等待分配/工作打断
function XUiDoomsdayFubenLineDetail:UpdateBuildingStateWorking()
self.WorkState = WORK_STATE.WORKING
local buildingCfgId = self.ExistedBuilding:GetProperty("_CfgId")
self.TxtTitle.text = XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "Name")
self.TxtDescribe.text = XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "Desc")
--除废墟类型外显示移除按钮
if not XDoomsdayConfigs.IsBuildingRuins(buildingCfgId) then
self.BtnRemove.gameObject:SetActiveEx(true)
end
if XDoomsdayConfigs.IsBuildingInOperable(buildingCfgId) then
--不可操作类型
--除废墟类型外显示移除按钮
if not XDoomsdayConfigs.IsBuildingRuins(buildingCfgId) then
self.BtnRemove.gameObject:SetActiveEx(true)
end
else
--可操作类型
--工作安排
self:UpdateInhabitantPanel()
end
end
--分配居民
function XUiDoomsdayFubenLineDetail:UpdateInhabitantPanel(ignoreBtn)
self.BtnIn.gameObject:SetActiveEx(false)
self.BtnOut.gameObject:SetActiveEx(false)
local stageData = self.StageData
local buildingCfgId = self.SelectBuildingCfgId
local curCount, needCount = self.SelectInhabitantCount, 0
local idleCount = stageData:GetProperty("_IdleInhabitantCount")
local showBtn
if self.WorkState == WORK_STATE.EMPTY.NOT_SELECT_BUILDING then
--待建造:未选择建筑
curCount = 0
showBtn = self.BtnIn
elseif self.WorkState == WORK_STATE.EMPTY.SELECT_BUILDING then
--待建造:已选择建筑
needCount = XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "LockPeopleOnBuilding")
if curCount < needCount then
--人手不足
self.TxtTips.text = CsXTextManagerGetText("DoomsdayFubenDetailTipsLackInhabitantToBuild")
showBtn = self.BtnIn
else
--可建造
self.TxtTips.text =
CsXTextManagerGetText(
"DoomsdayFubenDetailTipsBuildDay",
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "FinishDayCount")
)
showBtn = self.BtnOut
end
elseif self.WorkState == WORK_STATE.BUILDING then
--建造中
needCount = XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "LockPeopleOnBuilding")
if curCount < needCount then
--人手不足
self.TxtTips.text = CsXTextManagerGetText("DoomsdayFubenDetailTipsLackInhabitantToBuild")
if curCount > 0 then
showBtn = self.BtnOut
else
showBtn = self.BtnIn
end
else
--人手充足
self.TxtTips.text =
CsXTextManagerGetText(
"DoomsdayFubenDetailTipsBuildLeftDay",
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "FinishDayCount") -
self.ExistedBuilding:GetProperty("_ProgressDay")
)
showBtn = self.BtnOut
end
else
--工作中/等待工作/工作打断
needCount = XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "LockPeopleOnWorking")
if curCount < needCount then
--人手不足
self.TxtTips.text = CsXTextManagerGetText("DoomsdayFubenDetailTipsLackInhabitantToWork")
if curCount > 0 then
showBtn = self.BtnOut
else
showBtn = self.BtnIn
end
else
--人手充足
if XDoomsdayConfigs.IsBuildingRuins(buildingCfgId) then
--废墟清理时间
self.TxtTips.text =
CsXTextManagerGetText(
"DoomsdayFubenDetailTipsWorkDayRuins",
XDoomsdayConfigs.BuildingConfig:GetProperty(buildingCfgId, "WorkDayCount") -
self.ExistedBuilding:GetProperty("_ProgressDay")
)
else
--工作时间不显示
self.TxtTips.gameObject:SetActiveEx(false)
end
showBtn = self.BtnOut
end
self.NeedInhabitantCount = needCount
--工作每日转换资源
self:UpdateBuildingWorkingResourcePanel()
end
self.ImgProgressInhabitant.fillAmount = XUiHelper.GetFillAmountValue(curCount, needCount)
if curCount < needCount then
self.TxtInhabitantNeed.text =
CsXTextManagerGetText("DoomsdayFubenDetailBuildingInhabitantCountLack", curCount, needCount)
else
self.TxtInhabitantNeed.text =
CsXTextManagerGetText("DoomsdayFubenDetailBuildingInhabitantCount", curCount, needCount)
end
self.NeedInhabitantCount = needCount
if not ignoreBtn then
showBtn.gameObject:SetActiveEx(true)
end
self.PanelPeople.gameObject:SetActiveEx(true)
end
function XUiDoomsdayFubenLineDetail:UpdateCanOperateInhabitant()
self.TxtInhabitantCount.text =
string.format("%d/%d", self.IdleCount, self.StageData:GetProperty("_InhabitantCount"))
end
function XUiDoomsdayFubenLineDetail:UpdateCanOperateResources(constructResourceInfos)
if not constructResourceInfos then
return
end
for i, info in ipairs(constructResourceInfos) do
local grid = self:GetGrid(i, "ResourceGrids")
local resource = XDataCenter.DoomsdayManager.GetStageData(self.StageId):GetResource(info.Id)
grid.TxtTool1.text = math.max(resource:GetProperty("_Count") - info.Count, 0)
end
end
--工作每日转换资源
function XUiDoomsdayFubenLineDetail:UpdateBuildingWorkingResourcePanel()
self.PanelWork1.gameObject:SetActiveEx(false)
self.PanelWork2In1.gameObject:SetActiveEx(false)
self.PanelWork1In1.gameObject:SetActiveEx(false)
local buildingCfgId = self.ExistedBuilding:GetProperty("_CfgId")
local consumeResourceInfos = XDoomsdayConfigs.GetBuildingDailyConsumeResourceInfos(buildingCfgId) --消耗
local gainResourceInfos = XDoomsdayConfigs.GetBuildingDailyGainResourceInfos(buildingCfgId) --获得
if not self:CheckSelectedInhabitantFull() then
--居民不足时数量全部显示为0
for _, info in pairs(consumeResourceInfos) do
info.Count = 0
end
for _, info in pairs(gainResourceInfos) do
info.Count = 0
end
end
local consumeCount = #consumeResourceInfos --消耗物品种类
if consumeCount == 0 then
self:RefreshTemplateGrids(
self.GridGain1,
gainResourceInfos,
self.GridGain1.parent,
XUiGridDoomsdayResourceShow,
"WorkingGainResourceGrids1"
)
self.PanelWork1.gameObject:SetActiveEx(true)
elseif consumeCount == 1 then
self:RefreshTemplateGrids(
{
self.PanelWorkTool3
},
consumeResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"WorkingConsumeResourceGrids2"
)
self:RefreshTemplateGrids(
{
self.GridGain3
},
gainResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"WorkingGainResourceGrids2"
)
self.PanelWork1In1.gameObject:SetActiveEx(true)
elseif consumeCount == 2 then
self:RefreshTemplateGrids(
{
self.PanelWorkTool1,
self.PanelWorkTool2
},
consumeResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"WorkingConsumeResourceGrids3"
)
self:RefreshTemplateGrids(
{
self.GridGain2
},
gainResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"WorkingGainResourceGrids3"
)
self.PanelWork2In1.gameObject:SetActiveEx(true)
end
if #gainResourceInfos == 0 then
self.GridGain1.gameObject:SetActiveEx(false)
self.GridGain2.gameObject:SetActiveEx(false)
self.GridGain3.gameObject:SetActiveEx(false)
end
local constructResourceInfos = XDoomsdayConfigs.GetBuildingConstructResourceInfos(buildingCfgId)
self:RefreshTemplateGrids(
{
self.PanelUseTool1,
self.PanelUseTool2
},
constructResourceInfos
,
nil,
XUiGridDoomsdayResourceShow,
"WorkingConsumeResourceGrids"
)
--self:UpdateCanOperateResources(constructResourceInfos)
self.PanelWorking.gameObject:SetActiveEx(true)
end
--更新确认按钮实际工作状态
function XUiDoomsdayFubenLineDetail:UpdateConfirmState(state)
self.ConfirmState = state
if self:CheckSelectedInhabitantCountChange() then
self.BtnEnter:SetDisable(false, true)
else
self.BtnEnter:SetDisable(true, false)
end
end
function XUiDoomsdayFubenLineDetail:OnClickBtnClose()
self:Close()
if self.CloseCb then
self.CloseCb()
end
end
function XUiDoomsdayFubenLineDetail:OnClickBtnEnter()
if self.StageData:IsFinishEndAndTips() then
return
end
local isReplace = self.IsReplace
if self.WorkState == WORK_STATE.EMPTY.SELECT_BUILDING then
XDataCenter.DoomsdayManager.DoomsdayAddBuildingRequest(
self.StageData:GetProperty("_Id"),
self.BuildingIndex,
self.SelectBuildingCfgId,
self.SelectInhabitantCount,
isReplace,
function()
self.SelectInhabitantCount = self.ExistedBuilding:GetProperty("_WorkingInhabitantCount")
self:UpdateCanOperateInhabitant()
self.BtnEnter:SetDisable(true, false)
self.IsReplace = false
end
)
else
if self.ConfirmState == XUiDoomsdayFubenLineDetail.CONFIRM_STATE.BUILDING_INHABITANT_IN then
XDataCenter.DoomsdayManager.DoomsdayOpPeopleRequest(
self.StageData:GetProperty("_Id"),
self.BuildingIndex,
self.SelectInhabitantCount,
isReplace,
function()
self.SelectInhabitantCount = self.ExistedBuilding:GetProperty("_WorkingInhabitantCount")
self:UpdateCanOperateInhabitant()
self.BtnEnter:SetDisable(true, false)
self.IsReplace = false
end
)
elseif self.ConfirmState == XUiDoomsdayFubenLineDetail.CONFIRM_STATE.BUILDING_INHABITANT_OUT then
XDataCenter.DoomsdayManager.ZeroDoomsdayOpPeopleRequest(
self.StageData:GetProperty("_Id"),
self.BuildingIndex,
function()
self.SelectInhabitantCount = self.ExistedBuilding:GetProperty("_WorkingInhabitantCount")
self:UpdateCanOperateInhabitant()
self.BtnEnter:SetDisable(true, false)
self.IsReplace = false
end
)
end
end
end
function XUiDoomsdayFubenLineDetail:OnClickBtnRemove()
if self.StageData:IsFinishEndAndTips() then
return
end
local callFunc = function()
XDataCenter.DoomsdayManager.DoomsdayRemoveBuildingRequest(
self.StageData:GetProperty("_Id"),
self.BuildingIndex,
function()
self:Close()
end
)
end
local title = CsXTextManagerGetText("DoomsdayRemoveBuildingConfirmTitle")
local content = CsXTextManagerGetText("DoomsdayRemoveBuildingConfirmContent")
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, callFunc)
end
function XUiDoomsdayFubenLineDetail:OnClickBtnOut()
if self.StageData:IsFinishEndAndTips() then
return
end
self.IdleCount = self.IdleCount + self.SelectInhabitantCount
self.SelectInhabitantCount = 0
self.IsReplace = true
self:UpdateInhabitantPanel(true)
self:UpdateCanOperateInhabitant()
self.BtnIn.gameObject:SetActiveEx(true)
self:UpdateConfirmState(XUiDoomsdayFubenLineDetail.CONFIRM_STATE.BUILDING_INHABITANT_OUT)
end
function XUiDoomsdayFubenLineDetail:OnClickBtnIn()
if self.StageData:IsFinishEndAndTips() then
return
end
if self.WorkState == WORK_STATE.EMPTY.NOT_SELECT_BUILDING then
XUiManager.TipText("DoomsdayFubenDetailTipsSelectBuilding")
return
end
if self:CheckSelectedInhabitantFull() then
return
end
local needAllotCount = self.NeedInhabitantCount - self.SelectInhabitantCount
if self.IdleCount > needAllotCount then
self.IdleCount = self.IdleCount - needAllotCount
self.SelectInhabitantCount = self.SelectInhabitantCount + needAllotCount
else
self.SelectInhabitantCount = self.SelectInhabitantCount + self.IdleCount
self.IdleCount = 0
end
self:UpdateCanOperateInhabitant()
self:UpdateInhabitantPanel(true)
self.BtnOut.gameObject:SetActiveEx(true)
self:UpdateConfirmState(XUiDoomsdayFubenLineDetail.CONFIRM_STATE.BUILDING_INHABITANT_IN)
end
function XUiDoomsdayFubenLineDetail:OnClickBtnSelectBuilding()
if self.StageData:IsFinishEndAndTips() then
return
end
if self.WorkState == WORK_STATE.EMPTY.SELECT_BUILDING
or self.WorkState == WORK_STATE.EMPTY.NOT_SELECT_BUILDING then
local closeCb = function(buildingCfgId)
self.SelectBuildingCfgId = buildingCfgId
self:OnClickBtnOut()
self:UpdateBuildingState(XDoomsdayConfigs.BUILDING_STATE.EMPTY)
end
XLuaUiManager.Open("UiDoomsdayBuild", self.StageId, self.SelectBuildingCfgId, closeCb)
end
end
--是否选择了建筑
function XUiDoomsdayFubenLineDetail:CheckSelectedBuilding()
if not XTool.IsNumberValid(self.SelectBuildingCfgId) then
return false
end
return self.SelectBuildingCfgId ~= self.ExistedBuilding:GetProperty("_CfgId")
end
--居民是否充足
function XUiDoomsdayFubenLineDetail:CheckSelectedInhabitantFull()
if not XTool.IsNumberValid(self.SelectInhabitantCount) then
return false
end
return self.SelectInhabitantCount == self.NeedInhabitantCount
end
--是否修改了居民数量
function XUiDoomsdayFubenLineDetail:CheckSelectedInhabitantCountChange()
return self.SelectInhabitantCount ~= self.ExistedBuilding:GetProperty("_WorkingInhabitantCount")
end
return XUiDoomsdayFubenLineDetail