PGRData/Script/matrix/xui/xuidoomsday/XUiDoomsdayFubenLineDetail.lua

649 lines
22 KiB
Lua
Raw Normal View History

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() --待建造
2024-09-01 20:49:41 +00:00
elseif state == XDoomsdayConfigs.BUILDING_STATE.BUILDING then
self:UpdateBuildingStateBuilding() --建造中
elseif state == XDoomsdayConfigs.BUILDING_STATE.WORKING then
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
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")
--建造消耗资源
2024-09-01 20:49:41 +00:00
local constructResourceInfos = XDoomsdayConfigs.GetBuildingConstructResourceInfos(buildingCfgId)
self:RefreshTemplateGrids(
{
self.PanelUseTool1,
self.PanelUseTool2
},
2024-09-01 20:49:41 +00:00
constructResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"ConstructResourceGrids"
)
2024-09-01 20:49:41 +00:00
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")
--建造消耗资源
2024-09-01 20:49:41 +00:00
local constructResourceInfos = XDoomsdayConfigs.GetBuildingConstructResourceInfos(buildingCfgId)
self:RefreshTemplateGrids(
{
self.PanelUseTool1,
self.PanelUseTool2
},
2024-09-01 20:49:41 +00:00
constructResourceInfos,
nil,
XUiGridDoomsdayResourceShow,
"ConstructResourceGrids"
)
2024-09-01 20:49:41 +00:00
--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
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
local consumeCount = #consumeResourceInfos --消耗物品种类
if consumeCount == 0 then
self:RefreshTemplateGrids(
2024-09-01 20:49:41 +00:00
self.GridGain1,
gainResourceInfos,
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
local constructResourceInfos = XDoomsdayConfigs.GetBuildingConstructResourceInfos(buildingCfgId)
self:RefreshTemplateGrids(
{
self.PanelUseTool1,
self.PanelUseTool2
},
2024-09-01 20:49:41 +00:00
constructResourceInfos
,
nil,
XUiGridDoomsdayResourceShow,
"WorkingConsumeResourceGrids"
)
2024-09-01 20:49:41 +00:00
--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()
2024-09-01 20:49:41 +00:00
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()
2024-09-01 20:49:41 +00:00
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()
2024-09-01 20:49:41 +00:00
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()
2024-09-01 20:49:41 +00:00
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()
2024-09-01 20:49:41 +00:00
if self.StageData:IsFinishEndAndTips() then
return
end
2024-09-01 20:49:41 +00:00
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
2024-09-01 20:49:41 +00:00
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