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

542 lines
19 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 XUiGridDoomsdayPlace = require("XUi/XUiDoomsday/XUiGridDoomsdayPlace")
local XUiGridDoomsdayResource = require("XUi/XUiDoomsday/XUiGridDoomsdayResource")
local XUiGridDoomsdayInhabitantAttr = require("XUi/XUiDoomsday/XUiGridDoomsdayInhabitantAttr")
local XUiDoomsdayDragZoomProxy = require("XUi/XUiDoomsday/XUiDoomsdayDragZoomProxy")
local MAX_PLACE_COUNT = 42 --最大探索地点数量
local EXPLORE_TEAM_NUM = 2 --探索小队数量
local ANIM_TIME = 0.5 --镜头移动动画时间
local PATH_GENERATOR_TIME = 0.8 --新地点生成,路径动画时长
local CSVector2 = CS.UnityEngine.Vector2
local CSVector3 = CS.UnityEngine.Vector3
local CSQuaternion = CS.UnityEngine.Quaternion
local PATH_NAME = "Line" --路径物体名
local XUiDoomsdayExplore = XLuaUiManager.Register(XLuaUi, "UiDoomsdayExplore")
function XUiDoomsdayExplore:OnAwake()
self.BtnInhabitant = self.PanelInhabitant:GetComponent("XUiButton")
self:AutoAddListener()
self.GridDoomsdayStageCamp.gameObject:SetActiveEx(false)
self.GridDoomsdayStage.gameObject:SetActiveEx(false)
self.BtnMainUi.gameObject:SetActiveEx(false)
self.DragProxy = XUiDoomsdayDragZoomProxy.New(self.PanelDrag)
self.Effect = self.Transform:Find("SafeAreaContentPane/Effect")
self.Line = {}
end
function XUiDoomsdayExplore:OnStart(stageId, focusPlaceId)
self.StageId = stageId
self.StageData = XDataCenter.DoomsdayManager.GetStageData(stageId)
self.PlaceGrids = {}
self.TeamGrids = {}
self.FocusPlaceId = focusPlaceId or XDoomsdayConfigs.StageConfig:GetProperty(stageId, "FirstPlace")
local prefab = self.PanelStages:LoadPrefab(XDoomsdayConfigs.StageConfig:GetProperty(stageId, "PrefabPath"))
self.MapPrefab = {}
XTool.InitUiObjectByUi(self.MapPrefab, prefab)
self.Waiting2AddPlace = {}
self:InitView()
end
function XUiDoomsdayExplore:OnEnable()
if self.IsEnd then
return
end
if XDataCenter.DoomsdayManager.OnActivityEnd() then
self.IsEnd = true
return
end
self:UpdateView()
end
function XUiDoomsdayExplore:OnGetEvents()
return {
XEventId.EVENT_DOOMSDAY_ACTIVITY_END
}
end
function XUiDoomsdayExplore:OnNotify(evt, ...)
if self.IsEnd then
return
end
local args = {...}
if evt == XEventId.EVENT_DOOMSDAY_ACTIVITY_END then
if XDataCenter.DoomsdayManager.OnActivityEnd() then
self.IsEnd = true
return
end
end
end
function XUiDoomsdayExplore:AutoAddListener()
self:BindHelpBtn()
self:BindExitBtns()
self.BtnTask.CallBack = handler(self, self.OnClickBtnTarget)
self.BtnPosition.CallBack = handler(self, self.OnClickBtnPosition)
self.BtnInhabitant.CallBack = handler(self, self.OnClickBtnInhabitant)
for i = 1, EXPLORE_TEAM_NUM do
self["BtnTeam0" .. i].CallBack = function()
self:OnClickBtnTeam(i)
end
end
end
function XUiDoomsdayExplore:InitView()
local stageId = self.StageId
self.TxtTitle.text = XDoomsdayConfigs.StageConfig:GetProperty(stageId, "Name")
local mainTargetId = XDoomsdayConfigs.StageConfig:GetProperty(stageId, "MainTaskId")
self.BtnTask:SetName(XDoomsdayConfigs.TargetConfig:GetProperty(mainTargetId, "Desc"))
end
function XUiDoomsdayExplore:UpdateView()
local stageId = self.StageId
local stageData = self.StageData
self:BindViewModelPropertyToObj(
stageData,
function(curWeatherId)
local effectPath = XDoomsdayConfigs.WeatherConfig:GetProperty(curWeatherId, "EffectPath")
if not string.IsNilOrEmpty(effectPath) then
self.Effect.gameObject:LoadUiEffect(effectPath)
end
end,
"_CurWeatherId"
)
--剩余天数
self:BindViewModelPropertyToObj(
stageData,
function(day)
self.TxtTitleDate.text = CsXTextManagerGetText("DoomsdayFubenMainLeftDaySimple", day)
end,
"_Day"
)
--资源栏
self:RefreshTemplateGrids(
self.GridResource,
XDoomsdayConfigs.GetResourceIds(),
self.PanelResource,
function()
return XUiGridDoomsdayResource.New(stageId)
end,
"ResourceGrids"
)
--居民信息
self:BindViewModelPropertiesToObj(
stageData,
function(idleCount, count)
self.TxtInhabitantCount.text = string.format("%d/%d", idleCount, count)
end,
"_IdleInhabitantCount",
"_InhabitantCount"
)
--居民异常状态
self:BindViewModelPropertyToObj(
stageData,
function(unhealthyInhabitantInfoList)
local isEmpty = XTool.IsTableEmpty(unhealthyInhabitantInfoList)
self.GridAttrList.gameObject:SetActiveEx(not isEmpty)
--只显示不健康状态下的属性
self:RefreshTemplateGrids(
self.PanelAttr,
unhealthyInhabitantInfoList,
self.GridAttrList,
XUiGridDoomsdayInhabitantAttr,
"InhabitantAttrGrids"
)
end,
"_UnhealthyInhabitantInfoList"
)
--探索地点
self:BindViewModelPropertyToObj(
stageData,
function(unlockPlaceIds)
self:RefreshPlaceGrid(unlockPlaceIds)
end,
"_UnlockPlaceIds"
)
--探索地点附加随机事件
local placeEventDic = stageData:GetPlaceEventDic()
for placeId, event in pairs(placeEventDic) do
local grid = self.PlaceGrids[placeId]
if grid then
grid:SetEvent(event)
end
end
--探索小队状态
self:BindViewModelPropertiesToObj(
stageData,
function()
for teamId = 1, EXPLORE_TEAM_NUM do
local btn = self["BtnTeam0" .. teamId]
local unlock = stageData:CanCreateTeam(teamId)
local grid = self.TeamGrids[teamId]
if not grid then
grid = XTool.InitUiObjectByUi({}, btn)
self.TeamGrids[teamId] = grid
end
local teamExist = stageData:CheckTeamExist(teamId)
grid.PanelUnlock.gameObject:SetActiveEx(teamExist)
grid.PanelCreat.gameObject:SetActiveEx(unlock and not teamExist)
if teamExist then
local team = stageData:GetTeam(teamId)
self:BindViewModelPropertiesToObj(
team,
function(placeId, targetPlaceId, state)
--探索路径画线
if placeId ~= targetPlaceId then
self:DrawMoveLine(placeId, targetPlaceId,teamId)
end
grid.PanelStatuMove.gameObject:SetActiveEx(state == XDoomsdayConfigs.TEAM_STATE.MOVING)
grid.PanelStatuEvent.gameObject:SetActiveEx(state == XDoomsdayConfigs.TEAM_STATE.BUSY)
grid.PanelStatuStand.gameObject:SetActiveEx(state == XDoomsdayConfigs.TEAM_STATE.WAITING)
end,
"_PlaceId",
"_TargetPlaceId",
"_State"
)
end
self["BtnTeam0" .. teamId]:SetDisable(not unlock and not teamExist)
end
end,
"_UnlockTeamCount",
"_TeamCount"
)
self:UpdateFocusPlace()
end
function XUiDoomsdayExplore:RefreshPlaceGrid(unlockPlaceIds)
for _, placeId in pairs(unlockPlaceIds) do
local isCamp = XDoomsdayConfigs.CheckPlaceIsCamp(self.StageId, placeId)
local grid = self.PlaceGrids[placeId]
if not grid then
local pos = XDoomsdayConfigs.PlaceConfig:GetProperty(placeId, "Pos")
local go = isCamp and self.GridDoomsdayStageCamp or self.GridDoomsdayStage
local parent = self.MapPrefab["Stage" .. pos]
grid =
XUiGridDoomsdayPlace.New(XUiHelper.Instantiate(go, parent), self.StageId, self,
handler(self, self.OnClickPlace))
self.PlaceGrids[placeId] = grid
local prePlaceId = XDoomsdayConfigs.PlaceConfig:GetProperty(placeId, "PrePlaceId")
if XTool.IsNumberValid(prePlaceId) then --拥有前置节点
local prePos = XDoomsdayConfigs.PlaceConfig:GetProperty(prePlaceId, "Pos")
local preParent = self.MapPrefab["Stage" .. prePos]
local posStart, posEnd = preParent.anchoredPosition, parent.anchoredPosition
posStart = CSVector2(posStart.x, posStart.y)
posEnd = CSVector2(posEnd.x, posEnd.y)
local _, width, angle =
XUiHelper.CalculateLineWithTwoPosition(
posStart,
posEnd,
posStart.y > posEnd.y and CSVector3(0, 0, -1) or CSVector3(0, 0, 1)
)
local line = CS.UnityEngine.GameObject.Instantiate(self.PathLine, preParent, false)
line.localScale = CSVector3.one
line.localRotation = angle
line.localPosition = CSVector3.zero
line.gameObject:SetActiveEx(true)
line.gameObject.name = PATH_NAME
local deltaY = self.PathLine.sizeDelta.y
line.sizeDelta = CSVector2.zero
if self.IsAnimation then
table.insert(self.Waiting2AddPlace, {grid, placeId, width, line, deltaY})
else
line.sizeDelta = CSVector2(width, deltaY)
grid.GameObject:SetActiveEx(true)
end
local uiLine = parent.transform:Find(PATH_NAME)
if uiLine then
uiLine.gameObject:SetActiveEx(false)
uiLine.gameObject.name = "UiLine"
end
end
if isCamp then --营地,没有前置
local line = parent.transform:Find(PATH_NAME)
if line then
line.gameObject:SetActiveEx(false)
line.gameObject.name = "UiLine"
end
grid.GameObject:SetActiveEx(true)
end
end
grid:Refresh(placeId, isCamp)
end
--首次进入界面不播放动画
self.IsAnimation = true
self:AddPlaceWithAnim()
end
function XUiDoomsdayExplore:AddPlaceWithAnim()
if XTool.IsTableEmpty(self.Waiting2AddPlace) then
return
end
local index = 1
RunAsyn(function()
while true do
--避免函数被多次执行
if (XLuaUiManager.IsUiShow("UidoomsdayEvent")) or self.IsDrawPath then
asynWaitSecond(0.02) --避免界面打开后不关while true 浪费性能,事件界面可能打开多次
goto continue
end
XLuaUiManager.SetMask(true)
local item = self.Waiting2AddPlace[index]
if not item then
self.Waiting2AddPlace = {}
XLuaUiManager.SetMask(false)
break
end
self.IsDrawPath = true
local grid, placeId, width, line, deltaY = table.unpack(item)
local asyncAnim = asynTask(grid.PlayEnable, grid)
XUiHelper.Tween(PATH_GENERATOR_TIME, function(dt)
local tmpWidth = width * dt
line.sizeDelta = CSVector2(tmpWidth, deltaY)
end, function()
self:FocusStage(grid, nil, nil, ANIM_TIME)
end)
XUiManager.TipMsg(XUiHelper.GetText("DoomsdayPlaceUnLockTips", XDoomsdayConfigs.PlaceConfig:GetProperty(placeId, "Name")))
asynWaitSecond(2) -- 等待提示关闭
grid.GameObject:SetActiveEx(true)
if grid.GameObject.activeInHierarchy
and self.GameObject.activeInHierarchy then
asyncAnim()
end
index = index + 1
self.IsDrawPath = false
XLuaUiManager.SetMask(false)
::continue::
end
end)
end
--探索路径画线
function XUiDoomsdayExplore:DrawMoveLine(placeId, targetPlaceId, teamId)
if not XTool.IsNumberValid(placeId) or not XTool.IsNumberValid(targetPlaceId) then
return
end
local gridA = self.PlaceGrids[placeId]
if not gridA then
XLog.Error(string.format("DrawMoveLine error:当前地点未解锁或不在配置中 placeId:%s", placeId))
return
end
local gridB = self.PlaceGrids[targetPlaceId]
if not gridB then
XLog.Error(string.format("DrawMoveLine error:目标地点未解锁或不在配置中 targetPlaceId:%s", targetPlaceId))
return
end
-----@type UnityEngine.Vector2
--local positionA, positionB =
-- self.PlaceGrids[placeId].Transform.parent.anchoredPosition,
-- self.PlaceGrids[targetPlaceId].Transform.parent.anchoredPosition
--positionA = Vector2(positionA.x, positionA.y)
--positionB = Vector2(positionB.x, positionB.y)
--local position, width, angle =
-- XUiHelper.CalculateLineWithTwoPosition(
-- positionB,
-- positionA,
-- positionA.y > positionB.y and CSVector3(0, 0, 1) or CSVector3(0, 0, -1)
--)
local transform = self.Line[teamId]
if not transform then
---@type UnityEngine.RectTransform
--transform = CS.UnityEngine.GameObject.Instantiate(self:FindTransform("Line25_28").gameObject).transform
local lineParent = CS.UnityEngine.GameObject.Instantiate(self.LinePrefab.gameObject, self.PanelStages.transform, false).transform
lineParent.gameObject:SetActiveEx(true)
local linEffect = lineParent.gameObject:LoadUiEffect(XDoomsdayConfigs.GetExplorePathFx())
transform = {}
XTool.InitUiObjectByUi(transform, linEffect)
self.Line[teamId] = transform
end
--transform.parent = self.PanelStages.transform
--transform.localPosition = CSVector3(position.x, position.y, 0)
--transform.localScale = CSVector3.one
--transform.localRotation = angle
--transform.sizeDelta = CSVector2(width, transform.sizeDelta.y)
--transform.gameObject:SetActiveEx(true)
transform.Start.position = self.PlaceGrids[placeId].Transform.position
transform.Target.position = self.PlaceGrids[targetPlaceId].Transform.position
end
function XUiDoomsdayExplore:OnClickPlace(placeId)
--if XDoomsdayConfigs.CheckPlaceIsCamp(self.StageId, placeId) then
-- self:Close()
-- return
--end
for inId, grid in pairs(self.PlaceGrids) do
local isShow = placeId == inId
grid:SetSelect(isShow)
grid.Transform.parent.gameObject:SetActiveEx(isShow)
if isShow then
self:FocusStage(grid, 0.382, 0.5, 0.5)
end
end
self:SetSelectLineState(placeId, false)
for _, obj in pairs(self.Line) do
obj.GameObject:SetActiveEx(false)
end
self.PanelHide.gameObject:SetActiveEx(false)
XLuaUiManager.Open("UiDoomsdayExploreTcanchuang", self.StageId, placeId, handler(self, self.OnStageDetailClose))
end
function XUiDoomsdayExplore:OnStageDetailClose(placeId)
self.PanelHide.gameObject:SetActiveEx(true)
for inId, grid in pairs(self.PlaceGrids) do
grid:SetSelect(false)
grid.Transform.parent.gameObject:SetActiveEx(true)
if self.AnimOffset then
self.PanelStages:DOLocalMove(self.PanelStages.localPosition - self.AnimOffset, 0.5)
self.AnimOffset = nil
end
end
self:SetSelectLineState(placeId, true)
for _, obj in pairs(self.Line) do
obj.GameObject:SetActiveEx(true)
end
end
function XUiDoomsdayExplore:SetSelectLineState(placeId, state)
local selectGrid = self.PlaceGrids[placeId]
if selectGrid then
local parent = selectGrid.Transform.parent
local count = parent.transform.childCount
for i = 0, count - 1 do
local child = parent:GetChild(i)
if child and child.name == PATH_NAME then
child.gameObject:SetActiveEx(state)
end
end
end
end
function XUiDoomsdayExplore:OnClickBtnTeam(teamIndex)
local stageId = self.StageId
local stageData = self.StageData
if self.StageData:IsFinishEndAndTips() then
return
end
local teamExist = stageData:CheckTeamExist(teamIndex)
if not teamExist and not stageData:CanCreateTeam(teamIndex) then
XUiManager.TipText("DoomsdayTeamLock")
return
end
local event = stageData:GetTeamEvent(teamIndex)
if event then
XDataCenter.DoomsdayManager.EnterEventUi(stageId, event)
else
XLuaUiManager.Open("UiDoomsdayTeamTip", stageId, teamIndex)
end
end
function XUiDoomsdayExplore:OnClickBtnPosition()
local stageId = self.StageId
local stageData = self.StageData
if self.StageData:IsFinishEndAndTips() then
return
end
local findPlaceId
local teamList = stageData:GetAlreadySetUpTeamList()
local teamMember = #teamList
for _, team in ipairs(teamList) do
local placeId = team:GetProperty("_PlaceId")
if teamMember > 1 and placeId ~= self.FocusPlaceId then
findPlaceId = placeId
end
end
if not findPlaceId and teamMember > 0 then
local team = teamList[1]
local placeId = team:GetProperty("_PlaceId")
findPlaceId = placeId
end
if findPlaceId then
self.FocusPlaceId = findPlaceId
self:UpdateFocusPlace()
end
local eventPlaceId = findPlaceId or self.FocusPlaceId
local event = stageData:GetPlaceEvent(eventPlaceId)
if event then
XDataCenter.DoomsdayManager.EnterEventUi(stageId, event)
end
end
function XUiDoomsdayExplore:UpdateFocusPlace()
local grid = self.PlaceGrids[self.FocusPlaceId]
if not grid then
return
end
grid.GameObject.name = "Focus"
self:FocusStage(grid, nil, nil, ANIM_TIME)
end
function XUiDoomsdayExplore:OnClickBtnTarget()
if self.StageData:IsFinishEndAndTips() then
return
end
XLuaUiManager.Open("UiDoomsdayFubenTask", self.StageId)
end
function XUiDoomsdayExplore:OnClickBtnInhabitant()
XLuaUiManager.Open("UiDoomsdayPeople", self.StageId)
end
function XUiDoomsdayExplore:FocusStage(grid, widthOffset, heightOffset, duration, easeType)
widthOffset = widthOffset or 0.5
heightOffset = heightOffset or 0.5
duration = duration or 0
easeType = easeType or CS.DG.Tweening.Ease.Linear
local stageObj = grid.Transform
local midScreenPos =
CS.UnityEngine.Vector2(CS.UnityEngine.Screen.width * widthOffset, CS.UnityEngine.Screen.height * heightOffset)
local _, midPos =
CS.UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle(
self.PanelStages,
midScreenPos,
CS.UnityEngine.Camera.main
)
local offset = CSVector3(midPos.x, midPos.y, 0) - stageObj.parent.localPosition
-- 避免缩放影响
offset.x = offset.x * self.PanelStages.localScale.x
offset.y = offset.y * self.PanelStages.localScale.y
self.AnimOffset = offset
self.PanelStages:DOLocalMove(self.PanelStages.localPosition + offset, duration)
end
return XUiDoomsdayExplore