forked from endernon/PGRData
2536 lines
No EOL
92 KiB
Lua
2536 lines
No EOL
92 KiB
Lua
local XUiPanelBabelTower = require("XUi/XUiNewRoomSingle/XUiPanelBabelTower")
|
||
local XUiPanelRoleModel = require("XUi/XUiCharacter/XUiPanelRoleModel")
|
||
|
||
local CSXTextManagerGetText = CS.XTextManager.GetText
|
||
|
||
local XUiNewRoomSingle = XLuaUiManager.Register(XLuaUi, "UiNewRoomSingle")
|
||
|
||
local CHAR_POS1 = 1
|
||
local CHAR_POS2 = 2
|
||
local CHAR_POS3 = 3
|
||
local MAX_CHAR_COUNT = 3
|
||
local LONG_CLICK_TIME = 0
|
||
local TIMER = 1
|
||
local LOAD_TIME = 10
|
||
|
||
function XUiNewRoomSingle:OnAwake()
|
||
self:AutoAddListener()
|
||
self.PanelTip.gameObject:SetActiveEx(false)
|
||
self.ImgRoleRepace.gameObject:SetActiveEx(false)
|
||
end
|
||
--== data 可能包含的变量 ----
|
||
-- ChallengeCount
|
||
-- ForceConditionIds
|
||
-- NodeId
|
||
-- TeamBuffId
|
||
-- WorldBossTeamDatas
|
||
-- BabelTowerData
|
||
-- ChallengeId
|
||
-- ChessPursuitData
|
||
--== end ----
|
||
-- !!! 该界面已废弃,请使用UiBattleRoleRoom
|
||
function XUiNewRoomSingle:OnStart(stageId, data, ...)
|
||
self.Args = { ... }
|
||
self.ChangeCharIndex = 0
|
||
local uiModelRoot = self.UiModelGo.transform
|
||
self.PanelCharacterInfo = {
|
||
[1] = {
|
||
PanelRoleEffect = uiModelRoot:FindTransform("PanelRoleEffect1"),
|
||
TongdiaoEffect = uiModelRoot:FindTransform("ImgEffectTongDiao1"),
|
||
RoleModelPanel = XUiPanelRoleModel.New(uiModelRoot:FindTransform("PanelRoleModel1"), self.Name, nil, true, nil, true, true),
|
||
},
|
||
[2] = {
|
||
PanelRoleEffect = uiModelRoot:FindTransform("PanelRoleEffect2"),
|
||
TongdiaoEffect = uiModelRoot:FindTransform("ImgEffectTongDiao2"),
|
||
RoleModelPanel = XUiPanelRoleModel.New(uiModelRoot:FindTransform("PanelRoleModel2"), self.Name, nil, true, nil, true, true),
|
||
},
|
||
[3] = {
|
||
PanelRoleEffect = uiModelRoot:FindTransform("PanelRoleEffect3"),
|
||
TongdiaoEffect = uiModelRoot:FindTransform("ImgEffectTongDiao3"),
|
||
RoleModelPanel = XUiPanelRoleModel.New(uiModelRoot:FindTransform("PanelRoleModel3"), self.Name, nil, true, nil, true, true),
|
||
},
|
||
}
|
||
|
||
self.Camera = self.Transform:GetComponent("Canvas").worldCamera
|
||
self.RectTransform = self.Transform:GetComponent("RectTransform")
|
||
self:InitInfo(stageId, data)
|
||
self.Proxy = XUiNewRoomSingleProxy.ProxyDic[self.StageInfos.Type]
|
||
self.BtnShowInfoToggle.CallBack = function(val)
|
||
self:OnBtnShowInfoToggleByProxy(val)
|
||
end
|
||
-- 默认助战为关闭状态
|
||
if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.OtherHelp) then
|
||
self.BtnSupportToggle:SetButtonState(XUiButtonState.Normal)
|
||
end
|
||
|
||
self:InitEffectPositionInfo()
|
||
self:InitTeamData()
|
||
self:InitPanelTeam()
|
||
self:SetWeakness()
|
||
self:InitCharacterLimit()
|
||
self:InitBtnLongClicks()
|
||
self:SetCondition()
|
||
self:SetStageInfo()
|
||
self:InitEndurance()
|
||
--更新战力限制提示
|
||
self:InitFightControl()
|
||
--更新战斗信息
|
||
self:InitCharacterInfo()
|
||
self:InitFirstFightTabBtns()
|
||
|
||
if self.StageInfos.HaveAssist == 1 then
|
||
self:ShowAssistToggle(true)
|
||
-- 保存玩家选择助战状态
|
||
local assistSwitch = CS.UnityEngine.PlayerPrefs.GetInt(XPrefs.AssistSwitch .. XPlayer.Id)
|
||
if assistSwitch == nil or assistSwitch == 0 then
|
||
self:SetAssistStatus(false)
|
||
else
|
||
self:SetAssistStatus(true)
|
||
end
|
||
else
|
||
self:ShowAssistToggle(false)
|
||
self:SetAssistStatus(false)
|
||
end
|
||
-- 更新爬塔活动切换助战按钮状态
|
||
self:SetSwitchRole()
|
||
self:InitProxyPanel()
|
||
self:InitWorldBoss()
|
||
self:InitPanelBabelTower()
|
||
self:InitPanelNieR()
|
||
self:InitChessPursuit()
|
||
|
||
XEventManager.AddEventListener(XEventId.EVENT_TEAM_PREFAB_SELECT, self.UpdateTeamPrefab, self)
|
||
XEventManager.AddEventListener(XEventId.EVENT_FIGHT_BEGIN_PLAYMOVIE, self.OnOpenLoadingOrBeginPlayMovie, self)
|
||
XEventManager.AddEventListener(XEventId.EVENT_FIGHT_LOADINGFINISHED, self.OnOpenLoadingOrBeginPlayMovie, self)
|
||
-- 自动关闭
|
||
local openAutoClose, autoCloseEndTime, callback = self:GetAutoCloseInfo()
|
||
if openAutoClose then
|
||
self:SetAutoCloseInfo(autoCloseEndTime, callback)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnDestroy()
|
||
self:DestroyNewRoomSingle()
|
||
XUiHelper.StopAnimation()
|
||
self:RemoveTimer()
|
||
XEventManager.RemoveEventListener(XEventId.EVENT_TEAM_PREFAB_SELECT, self.UpdateTeamPrefab, self)
|
||
XEventManager.RemoveEventListener(XEventId.EVENT_FIGHT_BEGIN_PLAYMOVIE, self.OnOpenLoadingOrBeginPlayMovie, self)
|
||
XEventManager.RemoveEventListener(XEventId.EVENT_FIGHT_LOADINGFINISHED, self.OnOpenLoadingOrBeginPlayMovie, self)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnEnable()
|
||
XUiNewRoomSingle.Super.OnEnable(self)
|
||
self:InitFightControl()
|
||
self:InitCharacterInfo()
|
||
XEventManager.AddEventListener(XEventId.EVENT_ROOM_CHANGE_STAGE, self.OnSetStageId, self)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnDisable()
|
||
XUiNewRoomSingle.Super.OnDisable(self)
|
||
XDataCenter.FavorabilityManager.StopCv()
|
||
XEventManager.RemoveEventListener(XEventId.EVENT_ROOM_CHANGE_STAGE, self.OnSetStageId, self)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnSetStageId(stageId, data)
|
||
local stageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
|
||
if not CS.XFight.IsRunning and not XLuaUiManager.IsUiLoad("UiLoading") then
|
||
local contenttext = CS.XTextManager.GetText("StageChangeInfo", stageCfg.Name)
|
||
XUiManager.TipMsg(contenttext)
|
||
end
|
||
self:InitInfo(stageId, data)
|
||
self:RefreshCharacterTypeTips()
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitInfo(stageId, data)
|
||
self.CurrentStageId = stageId
|
||
if data then
|
||
self.ChallengeCount = data.ChallengeCount
|
||
self.SuggestedConditionIds = data.SuggestedConditionIds -- 暂未使用
|
||
self.ForceConditionIds = data.ForceConditionIds
|
||
self.EventIds = data.EventIds -- 暂未使用
|
||
self.NodeId = data.NodeId
|
||
self.TeamBuffId = data.TeamBuffId
|
||
self.WorldBossTeamDatas = data.WorldBossTeamDatas
|
||
self.ChessPursuitData = data.ChessPursuitData
|
||
self.BabelTowerData = data.BabelTowerData
|
||
self.ChallengeId = data.ChallengeId
|
||
self.SimulateTrainInfo = data.SimulateTrainInfo
|
||
self.LivWarRaceData = data.LivWarRaceData
|
||
end
|
||
-- 需要默认值的变量
|
||
self.SuggestedConditionIds = self.SuggestedConditionIds or {}
|
||
self.ForceConditionIds = self.ForceConditionIds or {}
|
||
|
||
self.TypeIdMainLine = CS.XGame.Config:GetInt("TypeIdMainLine")
|
||
self.TypeIdBossSingle = CS.XGame.Config:GetInt("TypeIdBossSingle")
|
||
self.TypeIdExplore = CS.XGame.Config:GetInt("TypeIdExplore")
|
||
self.TypeIdRpgTower = CS.XGame.Config:GetInt("TypeIdRpgTower")
|
||
self.StageCfg = XDataCenter.FubenManager.GetStageCfg(stageId)
|
||
self.StageInfos = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitEffectPositionInfo()
|
||
if self.StageInfos.Type ~= XDataCenter.FubenManager.StageType.InfestorExplore then
|
||
self.PanelEffectPosition.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
self.TxtEffectPosition.text = XDataCenter.FubenInfestorExploreManager.GetBuffDes()
|
||
self.PanelEffectPosition.gameObject:SetActiveEx(true)
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitCharacterLimit()
|
||
local characterLimitType = self:GetCharacterLimitType()
|
||
|
||
if not XFubenConfigs.IsStageCharacterLimitConfigExist(characterLimitType) then
|
||
self.PanelCharacterLimit.gameObject:SetActiveEx(false)
|
||
return
|
||
else
|
||
self.PanelCharacterLimit.gameObject:SetActiveEx(true)
|
||
end
|
||
|
||
local icon = XFubenConfigs.GetStageCharacterLimitImageTeamEdit(characterLimitType)
|
||
self.ImgCharacterLimit:SetSprite(icon)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetCurTeamCharacterType()
|
||
for _, characterId in pairs(self.CurTeam.TeamData) do
|
||
if characterId > 0 then
|
||
return XCharacterConfigs.GetCharacterType(characterId)
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 获取队伍类型队列
|
||
function XUiNewRoomSingle:GetCurTeamCharacterTypeList()
|
||
local result = {}
|
||
for _, characterId in pairs(self.CurTeam.TeamData) do
|
||
if characterId > 0 then
|
||
table.insert(result, XCharacterConfigs.GetCharacterType(characterId))
|
||
end
|
||
end
|
||
return result
|
||
end
|
||
|
||
function XUiNewRoomSingle:RefreshCharacterTypeTips()
|
||
if self.Proxy and self.Proxy.RefreshCharacterTypeTips then
|
||
return self.Proxy.RefreshCharacterTypeTips(self)
|
||
end
|
||
|
||
local stageId = self.CurrentStageId
|
||
local limitBuffId = XFubenConfigs.GetStageCharacterLimitBuffId(stageId)
|
||
local characterType = self:GetCurTeamCharacterType()
|
||
local characterLimitType = self:GetCharacterLimitType()
|
||
local text = XFubenConfigs.GetStageCharacterLimitTextTeamEdit(characterLimitType, characterType, limitBuffId)
|
||
self.TxtCharacterLimit.text = text
|
||
end
|
||
|
||
-- 首次出场按钮组
|
||
function XUiNewRoomSingle:InitFirstFightTabBtns()
|
||
if self:GetIsHideSwitchFirstFightPosBtnsWithProxy() then
|
||
-- 出场按钮组与队长技能选择的显隐
|
||
self.PanelTeamLeader.gameObject:SetActiveEx(false)
|
||
self.PanelBtnLeader.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
|
||
local tabGroup = {
|
||
self.BtnRed,
|
||
self.BtnBlue,
|
||
self.BtnYellow,
|
||
}
|
||
self.PanelTabCaptain:Init(tabGroup, function(tabIndex) self:OnFirstFightTabClick(tabIndex) end)
|
||
|
||
-- 首发位为nil或0,使其与队长位一致(因为服务器在之前只有队长位,后面区分了队长位与首发位,存在有队长位,没有首发位的情况)
|
||
if self.CurTeam.FirstFightPos == nil or self.CurTeam.FirstFightPos == 0 then
|
||
self.CurTeam.FirstFightPos = self.CurTeam.CaptainPos
|
||
end
|
||
|
||
-- 首发位依然为nil或0则报错,默认第一位为首发位
|
||
if self.CurTeam.FirstFightPos == nil then
|
||
XLog.Error("XUiNewRoomSingle:InitFirstFightTabBtns函数错误, self.CurTeam.FirstFightPos为nil")
|
||
self.CurTeam.FirstFightPos = CHAR_POS1
|
||
elseif self.CurTeam.FirstFightPos == 0 then
|
||
XLog.Error("XUiNewRoomSingle:InitFirstFightTabBtns函数错误, self.CurTeam.FirstFightPos为0")
|
||
self.CurTeam.FirstFightPos = CHAR_POS1
|
||
end
|
||
|
||
self.PanelTabCaptain:SelectIndex(self.CurTeam.FirstFightPos)
|
||
end
|
||
|
||
-- 设置首次出场
|
||
function XUiNewRoomSingle:OnFirstFightTabClick(tabIndex)
|
||
local firstFightPos = self.CurTeam.FirstFightPos
|
||
if firstFightPos == tabIndex then
|
||
return
|
||
end
|
||
|
||
self.CurTeam.FirstFightPos = tabIndex
|
||
self:SetFirstFightPosWithProxy(tabIndex)
|
||
self:SetTeamByProxy()
|
||
if self:IsBabelTower() then
|
||
local cb = self.BabelTowerData.Cb
|
||
if cb then
|
||
cb(self.CurTeam.TeamData, self.CurTeam.CaptainPos, self.CurTeam.FirstFightPos)
|
||
end
|
||
end
|
||
self:InitPanelTeam()
|
||
end
|
||
|
||
-- 设置队长技能
|
||
function XUiNewRoomSingle:OnClickTabCallBack(tabIndex)
|
||
local captainPos = self.CurTeam.CaptainPos
|
||
if captainPos == tabIndex then
|
||
return
|
||
end
|
||
self.CurTeam.CaptainPos = tabIndex
|
||
self:SetCaptainPosWithProxy(tabIndex)
|
||
self:SetTeamByProxy()
|
||
local isUnionKillType = self:IsUnionKillType()
|
||
if isUnionKillType then
|
||
self:UpdateTeamCaptionPos()
|
||
end
|
||
|
||
if self:IsBabelTower() then
|
||
local cb = self.BabelTowerData.Cb
|
||
if cb then
|
||
cb(self.CurTeam.TeamData, self.CurTeam.CaptainPos, self.CurTeam.FirstFightPos)
|
||
end
|
||
end
|
||
self:InitPanelTeam()
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnOpenLoadingOrBeginPlayMovie()
|
||
self:Remove()
|
||
end
|
||
|
||
function XUiNewRoomSingle:AutoAddListener()
|
||
self:RegisterClickEvent(self.BtnBack, self.OnBtnBackClick)
|
||
self:RegisterClickEvent(self.BtnMainUi, self.OnBtnMainUiClick)
|
||
self:RegisterClickEvent(self.BtnTeamPrefab, self.OnBtnTeamPrefabClick)
|
||
self:RegisterClickEvent(self.BtnChar1, self.OnBtnChar1Click)
|
||
self:RegisterClickEvent(self.BtnChar2, self.OnBtnChar2Click)
|
||
self:RegisterClickEvent(self.BtnChar3, self.OnBtnChar3Click)
|
||
|
||
self.CharacterPets1:GetObject("BtnClick").CallBack = function() self:HandlePartnerClick(CHAR_POS1) end
|
||
self.CharacterPets2:GetObject("BtnClick").CallBack = function() self:HandlePartnerClick(CHAR_POS2) end
|
||
self.CharacterPets3:GetObject("BtnClick").CallBack = function() self:HandlePartnerClick(CHAR_POS3) end
|
||
|
||
self.BtnEnterFight.CallBack = function() self:OnBtnEnterFightClick() end
|
||
self.BtnSupportToggle.CallBack = function(state) self:OnBtnAssistToggleClick(state) end
|
||
self.BtnSwitchRole01.CallBack = function() self:OnBtnSwitchRoleClick() end
|
||
self.BtnSwitchRole02.CallBack = function() self:OnBtnSwitchRoleClick() end
|
||
self.BtnTeamBuff.CallBack = function() self:OnClickBtnTeamBuff() end
|
||
self.BtnGo.CallBack = function() self:OnPanelBtnLeaderClick() end
|
||
if not XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.OtherHelp) then
|
||
self.BtnSupportToggle:SetDisable(true)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnPanelBtnLeaderClick()
|
||
-- 获取机器人为RobotId,玩家角色为CharacterId的队伍数据
|
||
-- 如果代理没有实现该接口,且队伍拥有没有使用RobotId的机器人,则无法获取机器人配置的时装与解放等级数据,队长头像会使用初始头像
|
||
local realCharData = self:GetRealCharDataByProxy()
|
||
local teamData = realCharData or self.CurTeam.TeamData
|
||
|
||
XLuaUiManager.Open("UiNewRoomSingleTip", self, teamData, self.CurTeam.CaptainPos, function(index)
|
||
self:OnClickTabCallBack(index)
|
||
end)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnTeamPrefabClick()
|
||
if self:IsWorldBossType() then
|
||
return
|
||
end
|
||
if self:IsRogueLikeType() then
|
||
return
|
||
end
|
||
if self:CheckHasRobot() then
|
||
return
|
||
end
|
||
|
||
local stageId = self.CurrentStageId
|
||
local limitBuffId = XFubenConfigs.GetStageCharacterLimitBuffId(stageId)
|
||
local characterLimitType = self:GetCharacterLimitType()
|
||
local teamGridId = self:GetTeamGridId()
|
||
XLuaUiManager.Open("UiRoomTeamPrefab", self.CurTeam.CaptainPos, self.CurTeam.FirstFightPos, characterLimitType, limitBuffId, self.StageInfos.Type, teamGridId, nil, stageId, self.CurTeam)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetTeamGridId()
|
||
local teamGridId
|
||
if self:IsChessPursuit() then
|
||
teamGridId = self.ChessPursuitData.TeamGridIndex
|
||
end
|
||
return teamGridId
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnShowInfoToggle(val)
|
||
if val then
|
||
local key = "NewRoomShowInfoToggle" .. tostring(XPlayer.Id)
|
||
CS.UnityEngine.PlayerPrefs.SetInt(key, val)
|
||
end
|
||
self:InitCharacterInfo()
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnAssistToggleClick(state)
|
||
if self:IsRogueLikeType() or self:IsUnionKillType() then
|
||
return
|
||
end
|
||
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.OtherHelp) then
|
||
return
|
||
end
|
||
|
||
self:SetAssistStatus(XUiHelper.GetToggleVal(state))
|
||
local assistSwitch = self:GetAssistStatus() and 1 or 0
|
||
CS.UnityEngine.PlayerPrefs.SetInt(XPrefs.AssistSwitch .. XPlayer.Id, assistSwitch)
|
||
if self:GetAssistStatus() then
|
||
self:PlayTips("FightAssistOpen", true)
|
||
else
|
||
self:PlayTips("FightAssistClose", false)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetBossSingleInfo()
|
||
self:ShowAssistToggle(false)
|
||
end
|
||
|
||
-- 初始化长按事件
|
||
function XUiNewRoomSingle:InitBtnLongClicks()
|
||
local btnLongClick1 = self.BtnChar1:GetComponent("XUiPointer")
|
||
local btnLongClick2 = self.BtnChar2:GetComponent("XUiPointer")
|
||
local btnLongClick3 = self.BtnChar3:GetComponent("XUiPointer")
|
||
XUiButtonLongClick.New(btnLongClick1, 10, self, nil, self.OnBtnUnLockLongClick1, self.OnBtnUnLockLongUp, false)
|
||
XUiButtonLongClick.New(btnLongClick2, 10, self, nil, self.OnBtnUnLockLongClick2, self.OnBtnUnLockLongUp, false)
|
||
XUiButtonLongClick.New(btnLongClick3, 10, self, nil, self.OnBtnUnLockLongClick3, self.OnBtnUnLockLongUp, false)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnUnLockLongUp()
|
||
self.ImgRoleRepace.gameObject:SetActiveEx(false)
|
||
self.IsUp = not self.IsUp
|
||
LONG_CLICK_TIME = 0
|
||
|
||
local stageId = self.CurrentStageId
|
||
if not self:CheckCharCanClickByProxy(stageId) then
|
||
return
|
||
end
|
||
|
||
if self.ChangeCharIndex > 0 then
|
||
local targetX = math.floor(self:GetPisont().x + self.RectTransform.rect.width / 2)
|
||
local targetIndex
|
||
if targetX <= self.RectTransform.rect.width / 3 then
|
||
targetIndex = CHAR_POS2
|
||
elseif targetX > self.RectTransform.rect.width / 3 and targetX <= self.RectTransform.rect.width / 3 * 2 then
|
||
targetIndex = CHAR_POS1 --UI的位置1号位是在中间的
|
||
else
|
||
targetIndex = CHAR_POS3
|
||
end
|
||
|
||
local changeIndex = self.ChangeCharIndex
|
||
if targetIndex > 0 and targetIndex ~= changeIndex then
|
||
local teamData = XTool.Clone(self.CurTeam.TeamData)
|
||
local targetId = teamData[targetIndex]
|
||
teamData[targetIndex] = teamData[changeIndex]
|
||
teamData[changeIndex] = targetId
|
||
|
||
self:HandleSwitchTeamPosWithProxy(changeIndex, targetIndex)
|
||
self:UpdateTeam(teamData)
|
||
|
||
if self:IsUnionKillType() then
|
||
self:SwitchCacheTeam(changeIndex, targetIndex)
|
||
end
|
||
|
||
if self:IsRogueLikeType() and self.RogueLikeIsRobot then
|
||
local teamCache = self.ChooseRobots
|
||
local temp = teamCache[changeIndex]
|
||
teamCache[changeIndex] = teamCache[targetIndex]
|
||
teamCache[targetIndex] = temp
|
||
end
|
||
end
|
||
self.ChangeCharIndex = 0
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:SeBtnUnLockLongClickt(index, time)
|
||
if not self:CheckCharCanLongClickByProxy(self.CurrentStageId) then
|
||
return
|
||
end
|
||
|
||
if self.CurTeam.TeamData[index] <= 0 then
|
||
self.IsUp = true
|
||
return
|
||
end
|
||
|
||
LONG_CLICK_TIME = LONG_CLICK_TIME + time / 1000
|
||
if self.IsUp then
|
||
self.IsUp = false
|
||
return
|
||
end
|
||
if LONG_CLICK_TIME > TIMER and not self.IsUp then
|
||
self.IsUp = false
|
||
if not self.ImgRoleRepace.gameObject.activeSelf then
|
||
self.ImgRoleRepace.gameObject:SetActiveEx(true)
|
||
end
|
||
self.ImgRoleRepace.gameObject.transform.localPosition = self:GetPisont()
|
||
end
|
||
if self.ChangeCharIndex <= 0 then
|
||
self.ChangeCharIndex = index
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetPisont()
|
||
local screenPoint
|
||
if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsEditor or CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsPlayer then
|
||
screenPoint = CS.UnityEngine.Vector2(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y)
|
||
else
|
||
screenPoint = CS.UnityEngine.Input.GetTouch(0).position
|
||
end
|
||
|
||
-- 设置拖拽
|
||
local hasValue, v2 = CS.UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle(self.RectTransform, screenPoint, self.Camera)
|
||
if hasValue then
|
||
return CS.UnityEngine.Vector3(v2.x, v2.y, 0)
|
||
else
|
||
return CS.UnityEngine.Vector3.zero
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnUnLockLongClick1(time)
|
||
self:SeBtnUnLockLongClickt(CHAR_POS1, time)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnUnLockLongClick2(time)
|
||
self:SeBtnUnLockLongClickt(CHAR_POS2, time)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnUnLockLongClick3(time)
|
||
self:SeBtnUnLockLongClickt(CHAR_POS3, time)
|
||
end
|
||
|
||
-- 初始化 team 数据
|
||
function XUiNewRoomSingle:InitTeamData()
|
||
local curTeam
|
||
curTeam = self:GetTeamByProxy()
|
||
if not curTeam then
|
||
if self.StageInfos.Type == XDataCenter.FubenManager.StageType.BossSingle then
|
||
curTeam = XDataCenter.TeamManager.GetPlayerTeam(self.TypeIdBossSingle)
|
||
elseif self.StageInfos.Type == XDataCenter.FubenManager.StageType.Explore then
|
||
curTeam = XDataCenter.TeamManager.GetPlayerTeam(self.TypeIdExplore)
|
||
--每次进入清空上次的选则
|
||
for i = 1, #curTeam.TeamData do
|
||
curTeam.TeamData[i] = 0
|
||
end
|
||
elseif self:IsWorldBossType() then
|
||
local characterDatas = self.WorldBossTeamDatas
|
||
local tmpData = {}
|
||
for index, data in pairs(characterDatas) do
|
||
tmpData.TeamData = tmpData.TeamData or {}
|
||
if data.IsCaptain then
|
||
tmpData.CaptainPos = index
|
||
end
|
||
|
||
if data.IsFirstFight then
|
||
tmpData.FirstFightPos = index
|
||
end
|
||
|
||
if data.RobotId > 0 then
|
||
table.insert(tmpData.TeamData, data.RobotId)
|
||
elseif data.Id > 0 then
|
||
table.insert(tmpData.TeamData, data.Id)
|
||
else
|
||
table.insert(tmpData.TeamData, 0)
|
||
end
|
||
end
|
||
curTeam = next(tmpData) and tmpData
|
||
curTeam = curTeam or XWorldBossConfigs.DefaultTeam
|
||
elseif self:IsChessPursuit() then
|
||
-- 默认清空
|
||
curTeam = self.ChessPursuitData.CurTeam
|
||
elseif self:IsBabelTower() then
|
||
curTeam = self.BabelTowerData.TeamList
|
||
elseif self:IsNieRType() then
|
||
curTeam = XDataCenter.NieRManager.GetPlayerTeamData(self.CurrentStageId)
|
||
else
|
||
curTeam = XDataCenter.TeamManager.GetPlayerTeam(self.TypeIdMainLine)
|
||
end
|
||
end
|
||
if curTeam == nil then
|
||
return
|
||
end
|
||
|
||
self:LimitCharacterByProxy(curTeam)
|
||
|
||
-- 初始化爬塔阵容
|
||
if self:IsRogueLikeType() then
|
||
curTeam = self:RogueLikeInitTeam(curTeam)
|
||
end
|
||
-- 初始化狙击战阵容
|
||
if self:IsUnionKillType() then
|
||
curTeam = self:UnionKillInitTeam(curTeam)
|
||
end
|
||
self.CurTeam = curTeam
|
||
local stageCfg = XDataCenter.FubenManager.GetStageCfg(self.CurrentStageId)
|
||
local RobotIds = self:GetRobotIdsByProxy(self.CurrentStageId)
|
||
self.HasRobot = RobotIds and #RobotIds > 0 or (self:IsNieRType() and self.Args[3])
|
||
|
||
if RobotIds and #RobotIds > 0 then
|
||
self.CurTeam.TeamData = {}
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
if i > #RobotIds then
|
||
table.insert(self.CurTeam.TeamData, 0)
|
||
else
|
||
local charId = XRobotManager.GetCharacterId(RobotIds[i])
|
||
table.insert(self.CurTeam.TeamData, charId)
|
||
end
|
||
end
|
||
|
||
-- 有机器人出战位和首发位设为1
|
||
self.CurTeam.CaptainPos = self:GetCaptainPos()
|
||
self.CurTeam.FirstFightPos = self:GetFirstFightPos()
|
||
end
|
||
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local teamCfg = XTeamConfig.GetTeamCfgById(i)
|
||
if teamCfg and not string.IsNilOrEmpty(teamCfg.EffectPath) then
|
||
self.PanelCharacterInfo[i].PanelRoleEffect:LoadPrefab(teamCfg.EffectPath, false)
|
||
end
|
||
end
|
||
end
|
||
|
||
-- team Ui 初始化
|
||
function XUiNewRoomSingle:InitPanelTeam()
|
||
self.BtnEnterFight:SetDisable(true, false)
|
||
|
||
if not self.CurTeam then
|
||
return
|
||
end
|
||
local firstFightPos = self.CurTeam.FirstFightPos
|
||
-- 记录是否全部加载完成
|
||
self.LoadModelCount = 0
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local posData = self.CurTeam.TeamData[i]
|
||
if posData and posData > 0 then
|
||
self.LoadModelCount = self.LoadModelCount + 1
|
||
end
|
||
|
||
-- 设置首发标签,隐藏所有队长标签
|
||
self["PanelLeader" .. i].gameObject:SetActiveEx(false)
|
||
self["PanelFirstRole" .. i].gameObject:SetActiveEx(not self:GetIsHideSwitchFirstFightPosBtnsWithProxy()
|
||
and i == firstFightPos)
|
||
|
||
end
|
||
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
self["Timer" .. i] = XScheduleManager.ScheduleOnce(function()
|
||
-- if XTool.UObjIsNil(self.Transform) or not self.GameObject.activeSelf then
|
||
-- return
|
||
-- end
|
||
if XTool.UObjIsNil(self.Transform) then
|
||
return
|
||
end
|
||
local posData = self.CurTeam.TeamData[i]
|
||
if posData and posData > 0 then
|
||
self:UpdateRoleModelByProxy(posData, self.PanelCharacterInfo[i].RoleModelPanel, i)
|
||
self["ImgAdd" .. i].gameObject:SetActiveEx(false)
|
||
self:UpdateRoleStanmina(posData, i)
|
||
else
|
||
self["PanelStaminaBar" .. i].gameObject:SetActiveEx(false)
|
||
self["ImgAdd" .. i].gameObject:SetActiveEx(true)
|
||
end
|
||
end, i * LOAD_TIME)
|
||
end
|
||
|
||
self:RefreshCaptainSkill()
|
||
end
|
||
|
||
function XUiNewRoomSingle:UpdateFightControl()
|
||
local teamAbility = {}
|
||
|
||
for _, v in ipairs(self.CurTeam.TeamData) do
|
||
if self.Proxy and self.Proxy.GetCharAbility then
|
||
table.insert(teamAbility, self.Proxy.GetCharAbility(v))
|
||
end
|
||
local isRobot = XRobotManager.CheckIsRobotId(v)
|
||
local char = XDataCenter.CharacterManager.GetCharacter(v)
|
||
|
||
if isRobot then
|
||
table.insert(teamAbility, XRobotManager.GetRobotAbility(v))
|
||
elseif char == nil then
|
||
table.insert(teamAbility, 0)
|
||
else
|
||
table.insert(teamAbility, char.Ability)
|
||
end
|
||
end
|
||
local conditionResult = true
|
||
for _, id in pairs(self.ForceConditionIds) do
|
||
local ret = XConditionManager.CheckCondition(id, self.CurTeam.TeamData)
|
||
if not ret then
|
||
conditionResult = false
|
||
end
|
||
end
|
||
self.FightControlResult = self.FightControl:UpdateInfo(self.StageCfg.FightControlId, teamAbility, conditionResult, self.CurrentStageId, self.CurTeam.TeamData)
|
||
end
|
||
|
||
function XUiNewRoomSingle:RemoveTimer()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
if self["Timer" .. i] then
|
||
XScheduleManager.UnSchedule(self["Timer" .. i])
|
||
self["Timer" .. i] = nil
|
||
end
|
||
end
|
||
end
|
||
|
||
--更新模型
|
||
function XUiNewRoomSingle:UpdateRoleModel(charId, roleModelPanel, pos)
|
||
roleModelPanel:ShowRoleModel() -- 先Active 再加载模型以及播放动画
|
||
local callback = function()
|
||
self.LoadModelCount = self.LoadModelCount - 1
|
||
if self.LoadModelCount <= 0 then
|
||
self.BtnEnterFight:SetDisable(false)
|
||
end
|
||
end
|
||
-- 根据机器人id来更新模型
|
||
if self.HasRobot then
|
||
local RobotIds = self:GetRobotIdsByProxy(self.CurrentStageId)
|
||
local robotId = RobotIds[pos]
|
||
self:UpdateRobotModel(robotId, roleModelPanel, callback)
|
||
else
|
||
if self:IsRogueLikeType() and self.RogueLikeIsRobot then
|
||
roleModelPanel:UpdateCharacterModel(charId, nil, nil, nil, callback, self:GetRogueLikeFactionByCid(charId))
|
||
elseif self:IsUnionKillType() then
|
||
self:UpdateUnionKillMode(roleModelPanel, pos, callback, charId)
|
||
else
|
||
if XRobotManager.CheckIsRobotId(charId) then
|
||
local robotId = charId
|
||
self:UpdateRobotModel(robotId, roleModelPanel, callback)
|
||
else
|
||
roleModelPanel:UpdateCharacterModel(charId, nil, nil, nil, callback)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
--==============================
|
||
---@desc 更新机器人模型,支持自定义涂装
|
||
---@robotId 机器人Id
|
||
---@roleModelPanel @class XUiPanelRoleModel
|
||
---@callback 回调
|
||
--==============================
|
||
function XUiNewRoomSingle:UpdateRobotModel(robotId, roleModelPanel, callback)
|
||
local characterId = XRobotManager.GetCharacterId(robotId)
|
||
local isOwn = XDataCenter.CharacterManager.IsOwnCharacter(characterId)
|
||
if XRobotManager.CheckUseFashion(robotId) and isOwn then
|
||
local character = XDataCenter.CharacterManager.GetCharacter(characterId)
|
||
local viewModel = character:GetCharacterViewModel()
|
||
roleModelPanel:UpdateCharacterModel(characterId, nil, nil, nil, callback, viewModel:GetFashionId())
|
||
else
|
||
local robotCfg = XRobotManager.GetRobotTemplate(robotId)
|
||
roleModelPanel:UpdateRobotModel(robotId, characterId, callback, robotCfg.FashionId, robotCfg.WeaponId)
|
||
end
|
||
end
|
||
|
||
--更新耐力值
|
||
function XUiNewRoomSingle:UpdateRoleStanmina(charId, index)
|
||
local maxStamina = 9
|
||
local curStamina = 0
|
||
if self.StageInfos.Type == XDataCenter.FubenManager.StageType.BossSingle then
|
||
maxStamina = XDataCenter.FubenBossSingleManager.GetMaxStamina()
|
||
curStamina = maxStamina - XDataCenter.FubenBossSingleManager.GetCharacterChallengeCount(charId)
|
||
elseif self.StageInfos.Type == XDataCenter.FubenManager.StageType.Explore then
|
||
maxStamina = XDataCenter.FubenExploreManager.GetMaxEndurance(XDataCenter.FubenExploreManager.GetCurChapterId())
|
||
curStamina = maxStamina - XDataCenter.FubenExploreManager.GetEndurance(XDataCenter.FubenExploreManager.GetCurChapterId(), charId)
|
||
else
|
||
self["PanelStaminaBar" .. index].gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
|
||
local text = CSXTextManagerGetText("RoomStamina", curStamina, maxStamina)
|
||
self["TxtMyStamina" .. index].text = text
|
||
self["ImgStaminaExpFill" .. index].fillAmount = curStamina / maxStamina
|
||
self["PanelStaminaBar" .. index].gameObject:SetActiveEx(true)
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetAssistStatus(active)
|
||
if XFunctionManager.JudgeCanOpen(XFunctionManager.FunctionName.OtherHelp) then
|
||
if active then
|
||
self.BtnSupportToggle:SetButtonState(XUiButtonState.Select)
|
||
else
|
||
self.BtnSupportToggle:SetButtonState(XUiButtonState.Normal)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:ShowAssistToggle(show)
|
||
if show then
|
||
self.BtnSupportToggle.gameObject:SetActiveEx(true)
|
||
else
|
||
self.BtnSupportToggle.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetAssistStatus()
|
||
return self.BtnSupportToggle:GetToggleState()
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetWeakness()
|
||
self.PanelWeakness.gameObject:SetActiveEx(true)
|
||
|
||
local eventDesc
|
||
if self.EventIds and #self.EventIds > 0 and self.EventIds[1] > 0 then
|
||
eventDesc = XRoomSingleManager.GetEvenDesc(self.EventIds[1])
|
||
self.TxtWeaknessDesc.text = eventDesc
|
||
return
|
||
end
|
||
|
||
eventDesc = XRoomSingleManager.GetEventDescByMapId(self.CurrentStageId)
|
||
if eventDesc then
|
||
self.TxtWeaknessDesc.text = eventDesc
|
||
else
|
||
self.PanelWeakness.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetCondition()
|
||
self.GridCondition.gameObject:SetActiveEx(false)
|
||
|
||
local stageSuggestedConditionIds, stageForceConditionIds = XDataCenter.FubenManager.GetConditonByMapId(self.CurrentStageId)
|
||
for _, value in pairs(stageSuggestedConditionIds) do
|
||
table.insert(self.SuggestedConditionIds, value)
|
||
end
|
||
|
||
for _, value in pairs(stageForceConditionIds) do
|
||
table.insert(self.ForceConditionIds, value)
|
||
end
|
||
|
||
for _, id in pairs(self.SuggestedConditionIds) do
|
||
self:SetConditionGrid(id)
|
||
end
|
||
|
||
for _, id in pairs(self.ForceConditionIds) do
|
||
self:SetConditionGrid(id)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetConditionGrid(id)
|
||
local item = CS.UnityEngine.Object.Instantiate(self.GridCondition)
|
||
item.gameObject.transform:SetParent(self.PanelConditionContent, false)
|
||
local textDesc = item.gameObject.transform:Find("TxtDesc"):GetComponent("Text")
|
||
local _, desc = XConditionManager.CheckCondition(id, self.CurTeam.TeamData)
|
||
textDesc.text = desc
|
||
item.gameObject:SetActiveEx(true)
|
||
end
|
||
|
||
function XUiNewRoomSingle:RefreshCaptainSkill()
|
||
-- 开启技能面板、队长头像、技能描述
|
||
self.PanelSkill.gameObject:SetActiveEx(true)
|
||
self.PanelRole.gameObject:SetActiveEx(true)
|
||
self.TxtSkillDesc.gameObject:SetActiveEx(true)
|
||
|
||
local teamMemberNum = self:GetCurTeamMemberNum()
|
||
local captainId = self:GetCaptainIdByProxy()
|
||
|
||
-- 获取机器人为RobotId,玩家角色为CharacterId的队伍数据
|
||
-- 如果代理没有实现该接口,且队伍拥有没有使用RobotId的机器人,则无法获取机器人配置的时装与解放等级数据,队长头像会使用初始头像
|
||
local realCharData = self:GetRealCharDataByProxy()
|
||
if realCharData then
|
||
captainId = realCharData[self.CurTeam.CaptainPos]
|
||
end
|
||
|
||
if captainId == nil or captainId <= 0 then
|
||
-- 当前队长位没有角色
|
||
if teamMemberNum <= 0 then
|
||
-- 队伍内没有角色,隐藏技能面板
|
||
self.PanelSkill.gameObject:SetActiveEx(false)
|
||
else
|
||
-- 队伍内还有其他角色,隐藏队长头像与技能描述
|
||
self.PanelRole.gameObject:SetActiveEx(false)
|
||
self.TxtSkillDesc.gameObject:SetActiveEx(false)
|
||
|
||
-- 队长技能名称更改为未选择队长
|
||
self.TxtSkillName.text = CS.XTextManager.GetText("TeamDoNotChooseCaptain")
|
||
end
|
||
return
|
||
end
|
||
|
||
-- 获取队长技能信息
|
||
local captianSkillInfo
|
||
if not XRobotManager.CheckIsRobotId(captainId) then
|
||
captianSkillInfo = XDataCenter.CharacterManager.GetCaptainSkillInfo(captainId)
|
||
else
|
||
captianSkillInfo = XRobotManager.GetRobotCaptainSkillInfo(captainId)
|
||
end
|
||
|
||
if captianSkillInfo == nil then
|
||
return
|
||
end
|
||
|
||
-- 设置队长技能图标与名称
|
||
self:SetUiSprite(self.ImgSkillIcon, captianSkillInfo.Icon)
|
||
self.TxtSkillName.text = captianSkillInfo.Name
|
||
|
||
-- 设置队长头像与队长技能描述
|
||
local head
|
||
local skillDesc
|
||
if not XRobotManager.CheckIsRobotId(captainId) then
|
||
if self.HasRobot or self.RogueLikeIsRobot then
|
||
-- 使用了CharacterId的机器人
|
||
skillDesc = captianSkillInfo.Intro
|
||
-- 机器人使用了CharacterId,无法得知机器人的RobotId(获取终解等级与时装配置数据),使用初始头像代替
|
||
head = XDataCenter.CharacterManager.GetCharSmallHeadIcon(captainId, true)
|
||
else
|
||
-- 玩家角色
|
||
skillDesc = captianSkillInfo.Level > 0 and captianSkillInfo.Intro or CS.XTextManager.GetText("CaptainSkillLock")
|
||
head = XDataCenter.CharacterManager.GetCharSmallHeadIcon(captainId)
|
||
end
|
||
else
|
||
-- 使用了RobotId的机器人
|
||
head = XRobotManager.GetRobotSmallHeadIcon(captainId)
|
||
skillDesc = captianSkillInfo.Intro
|
||
end
|
||
if head then
|
||
self.RImgCapIcon:SetRawImage(head)
|
||
end
|
||
if skillDesc then
|
||
self.TxtSkillDesc.text = skillDesc
|
||
end
|
||
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetStageInfo()
|
||
local chapterName, stageName = XDataCenter.FubenManager.GetFubenNames(self.CurrentStageId)
|
||
self.TxtChapterName.text = chapterName
|
||
self.TxtStageName.text = stageName
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitEndurance()
|
||
if self.StageInfos.Type == XDataCenter.FubenManager.StageType.Explore then
|
||
if XDataCenter.FubenExploreManager.IsNodeFinish(XDataCenter.FubenExploreManager.GetCurChapterId(), XDataCenter.FubenExploreManager.GetCurNodeId()) then
|
||
self.PanelEndurance.gameObject:SetActiveEx(false)
|
||
else
|
||
self.PanelEndurance.gameObject:SetActiveEx(true)
|
||
self.TxtEnduranceNum.text = XDataCenter.FubenExploreManager.GetCurNodeEndurance()
|
||
end
|
||
else
|
||
self.PanelEndurance.gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
|
||
--更新战斗信息
|
||
function XUiNewRoomSingle:InitCharacterInfo()
|
||
self:UpdateTeamBuff()
|
||
self:UpdatePartnerInfo()
|
||
self:UpdateFeatureInfo()
|
||
--机器人关卡不显示战斗信息
|
||
if self.HasRobot or self:IsRogueLikeType() or self:IsUnionKillType() or self:IsNieRType() then
|
||
self.BtnShowInfoToggle.gameObject:SetActiveEx(false)
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
self["CharacterInfo" .. i].gameObject:SetActiveEx(false)
|
||
end
|
||
self:InitCharacterInfoByProxy()
|
||
return
|
||
end
|
||
self.BtnShowInfoToggle.gameObject:SetActiveEx(true)
|
||
self.IsShowCharacterInfo = 0
|
||
local key = "NewRoomShowInfoToggle" .. tostring(XPlayer.Id)
|
||
if CS.UnityEngine.PlayerPrefs.HasKey(key) then
|
||
self.IsShowCharacterInfo = CS.UnityEngine.PlayerPrefs.GetInt(key)
|
||
else
|
||
CS.UnityEngine.PlayerPrefs.SetInt(key, 0)
|
||
end
|
||
self:InitCharacterInfoByProxy()
|
||
self.PanelCombatPower = {}
|
||
self.TxtCombatPower = {}
|
||
self.ImgCombatPower = {}
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
-- 位于角色右上方的战斗参数
|
||
self.PanelCombatPower[i] = self["CharacterInfo" .. i]
|
||
self.TxtCombatPower[i] = self["TxtFight" .. i]
|
||
self.ImgCombatPower[i] = self["RImgType" .. i]
|
||
end
|
||
|
||
|
||
if self.IsShowCharacterInfo > 0 then
|
||
|
||
self.BtnShowInfoToggle:SetButtonState(XUiButtonState.Select)
|
||
for i = 1, #self.CurTeam.TeamData do
|
||
if not XRobotManager.CheckIsRobotId(self.CurTeam.TeamData[i]) then
|
||
local character = XDataCenter.CharacterManager.GetCharacter(self.CurTeam.TeamData[i])
|
||
if character == nil then
|
||
self.PanelCombatPower[i].gameObject:SetActiveEx(false)
|
||
else
|
||
self.PanelCombatPower[i].gameObject:SetActiveEx(true)
|
||
self.TxtCombatPower[i].text = math.floor(character.Ability)
|
||
self.ImgCombatPower[i]:SetRawImage(XCharacterConfigs.GetNpcTypeIcon(character.Type))
|
||
end
|
||
elseif self.CurTeam.TeamData[i] > 0 then
|
||
local robotId = self.CurTeam.TeamData[i]
|
||
local robotData = XRobotManager.GetRobotTemplate(robotId)
|
||
local detailConfig = XCharacterConfigs.GetCharDetailTemplate(robotData.CharacterId)
|
||
local careerConfig = XCharacterConfigs.GetNpcTypeTemplate(detailConfig.Career)
|
||
if robotData == nil then
|
||
self.PanelCombatPower[i].gameObject:SetActiveEx(false)
|
||
else
|
||
self.PanelCombatPower[i].gameObject:SetActiveEx(true)
|
||
if self.Proxy and self.Proxy.GetCharAbility then
|
||
self.TxtCombatPower[i].text = self.Proxy.GetCharAbility(robotId)
|
||
else
|
||
self.TxtCombatPower[i].text = XRobotManager.GetRobotAbility(robotId)
|
||
end
|
||
self.ImgCombatPower[i]:SetRawImage(careerConfig.Icon)
|
||
end
|
||
else
|
||
self.PanelCombatPower[i].gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
else
|
||
self.BtnShowInfoToggle:SetButtonState(XUiButtonState.Normal)
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
self.PanelCombatPower[i].gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:DefaultUpdatePartnerInfo()
|
||
if self.HasRobot or self:IsRogueLikeType() or self:IsUnionKillType() or self:IsNieRType() then
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local stageCfg = XDataCenter.FubenManager.GetStageCfg(self.CurrentStageId)
|
||
local robotId = stageCfg.RobotId[i]
|
||
if robotId then
|
||
local robotPartner = XRobotManager.GetRobotPartner(robotId)
|
||
self:ShowPartner(self["CharacterPets" .. i], robotPartner, true)
|
||
else
|
||
self["CharacterPets" .. i].gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
return
|
||
end
|
||
|
||
self.PanelPartner = {}
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
self.PanelPartner[i] = self["CharacterPets" .. i]
|
||
end
|
||
|
||
for i = 1, #self.CurTeam.TeamData do
|
||
if not XRobotManager.CheckIsRobotId(self.CurTeam.TeamData[i]) then
|
||
local character = XDataCenter.CharacterManager.GetCharacter(self.CurTeam.TeamData[i])
|
||
if character == nil then
|
||
self.PanelPartner[i].gameObject:SetActiveEx(false)
|
||
else
|
||
self.PanelPartner[i].gameObject:SetActiveEx(true)
|
||
local partner = XDataCenter.PartnerManager.GetCarryPartnerEntityByCarrierId(character.Id)
|
||
self:ShowPartner(self.PanelPartner[i], partner, false)
|
||
end
|
||
elseif self.CurTeam.TeamData[i] > 0 then
|
||
local robotId = self.CurTeam.TeamData[i]
|
||
local robotData = XRobotManager.GetRobotTemplate(robotId)
|
||
local robotPartner = XRobotManager.GetRobotPartner(robotId)
|
||
|
||
if robotData == nil then
|
||
self.PanelPartner[i].gameObject:SetActiveEx(false)
|
||
else
|
||
self.PanelPartner[i].gameObject:SetActiveEx(true)
|
||
self:ShowPartner(self.PanelPartner[i], robotPartner, true)
|
||
end
|
||
else
|
||
self.PanelPartner[i].gameObject:SetActiveEx(false)
|
||
end
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:DefaultUpdateFeatureInfo()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
self["CharacterFeature" .. i].gameObject:SetActiveEx(false)
|
||
end
|
||
|
||
self.PanelStageFeature.gameObject:SetActiveEx(false)
|
||
end
|
||
|
||
function XUiNewRoomSingle:ShowPartner(panel, partner, IsRobot)
|
||
if partner and next(partner) then
|
||
panel:GetObject("RImgType"):SetRawImage(partner:GetIcon())
|
||
end
|
||
local IsHasPartner = partner and next(partner)
|
||
panel:GetObject("RImgType").gameObject:SetActiveEx(IsHasPartner)
|
||
panel.gameObject:SetActiveEx(IsHasPartner or (not IsRobot))
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnBackClick()
|
||
self:Close()
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnMainUiClick()
|
||
if self.Proxy and self.Proxy.HandleBtnMainUiClick then
|
||
self.Proxy.HandleBtnMainUiClick()
|
||
return
|
||
else
|
||
XLuaUiManager.RunMain()
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:HandleCharClick(charPos)
|
||
if self:IsRogueLikeType() and self.RogueLikeIsRobot then
|
||
self:OnRogueLikeChangeRole(charPos)
|
||
return
|
||
end
|
||
if self:IsUnionKillType() then
|
||
self:OnUnionKillChangeRole(charPos)
|
||
return
|
||
end
|
||
|
||
local stageId = self.CurrentStageId
|
||
|
||
-- 默认交给代理检查,否则目前单一检查是否为机器人
|
||
if not self:CheckCharCanClickByProxy(stageId) then
|
||
return
|
||
end
|
||
|
||
local teamData = XTool.Clone(self.CurTeam.TeamData)
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
|
||
if self:IsChessPursuit() then
|
||
XLuaUiManager.Open("UiRoomCharacter", teamData, charPos, function(resTeam)
|
||
self:UpdateTeam(resTeam)
|
||
end, stageInfo.Type, nil, {
|
||
IsHideQuitButton = self.ChessPursuitData.SceneUiType == XChessPursuitCtrl.SCENE_UI_TYPE.BOSS_ROUND,
|
||
RobotIdList = self.ChessPursuitData.RobotList,
|
||
MapId = self.ChessPursuitData.MapId,
|
||
TeamGridIndex = self.ChessPursuitData.TeamGridIndex,
|
||
SceneUiType = self.ChessPursuitData.SceneUiType,
|
||
})
|
||
elseif self:IsBabelTower() then
|
||
self:OpenBabelRoomCharacter(teamData, charPos)
|
||
elseif self:IsWorldBossType() then
|
||
local worldBossActivity = XDataCenter.WorldBossManager.GetCurWorldBossActivity()
|
||
if worldBossActivity then
|
||
local robotBuffIdList = worldBossActivity:GetGetedRobotIdList()
|
||
local robotIdList = {}
|
||
for _, buffId in pairs(robotBuffIdList) do
|
||
local buffData = XDataCenter.WorldBossManager.GetWorldBossBuffById(buffId)
|
||
table.insert(robotIdList, buffData:GetCustomizeId())
|
||
end
|
||
|
||
XLuaUiManager.Open("UiRoomCharacter", teamData, charPos, function(resTeam)
|
||
self:UpdateTeam(resTeam)
|
||
end, stageInfo.Type, nil, { RobotIdList = robotIdList })
|
||
end
|
||
elseif self:IsNieRType() then
|
||
local robotList = XDataCenter.NieRManager.GetChapterCharacterList(self.Args[1], self.Args[2])
|
||
XLuaUiManager.Open("UiSelectCharacterWin", function(resTeam)
|
||
self:UpdateTeam(resTeam)
|
||
end, UiSelectCharacterType.NieROnlyRobot, teamData, charPos, robotList)
|
||
else
|
||
self:HandleCharClickByProxy(charPos)
|
||
end
|
||
end
|
||
|
||
-- 进入辅助机选择
|
||
function XUiNewRoomSingle:HandlePartnerClick(charPos)
|
||
local stageId = self.CurrentStageId
|
||
if not self:CheckCharCanClickByProxy(stageId) then return end
|
||
|
||
self:HandlePartnerClickByProxy(charPos)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnChar1Click()
|
||
self:HandleCharClick(CHAR_POS1)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnChar2Click()
|
||
self:HandleCharClick(CHAR_POS2)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnChar3Click()
|
||
self:HandleCharClick(CHAR_POS3)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetTeamData()
|
||
return self.CurTeam
|
||
end
|
||
|
||
-- 更新队伍
|
||
function XUiNewRoomSingle:UpdateTeam(teamData, isUsePrefab)
|
||
for posId, val in pairs(teamData) do
|
||
local oldCharId = self.CurTeam.TeamData[posId]
|
||
if oldCharId and oldCharId > 0 and oldCharId ~= val then
|
||
-- 检查被替换的位置是否有角色,并且不相同
|
||
self.PanelCharacterInfo[posId].RoleModelPanel:HideRoleModel()
|
||
end
|
||
end
|
||
|
||
self.CurTeam.TeamData = XTool.Clone(teamData)
|
||
|
||
self:UpdateTeamByProxy()
|
||
self:InitPanelTeam() -- 更新当前队伍显示状态
|
||
|
||
if self:IsBabelTower() then
|
||
local cb = self.BabelTowerData.Cb
|
||
if cb then
|
||
cb(teamData, self.CurTeam.CaptainPos, self.CurTeam.FirstFightPos)
|
||
end
|
||
elseif self:IsNieRType() then
|
||
XDataCenter.NieRManager.SetPlayerTeamData(self.CurTeam, self.CurrentStageId)
|
||
elseif self:IsChessPursuit() then
|
||
XDataCenter.ChessPursuitManager.SetPlayerTeamData(self.CurTeam, self.ChessPursuitData.MapId, self.ChessPursuitData.TeamGridIndex, isUsePrefab)
|
||
elseif self:GetIsSaveTeamData() then
|
||
XDataCenter.TeamManager.SetPlayerTeam(self.CurTeam, false) -- 保存数据
|
||
end
|
||
--更新角色信息面板
|
||
self:InitCharacterInfo()
|
||
end
|
||
|
||
function XUiNewRoomSingle:UpdateTeamBuff()
|
||
local teamBuffId = self.TeamBuffId
|
||
|
||
if not teamBuffId or teamBuffId <= 0 then
|
||
self.PanelTeamBuff.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
|
||
local maxCount = XFubenConfigs.GetTeamBuffMaxBuffCount(teamBuffId)
|
||
if maxCount <= 0 then
|
||
self.PanelTeamBuff.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
|
||
self.PanelTeamBuff.gameObject:SetActiveEx(true)
|
||
|
||
local fitCount = XFubenConfigs.GetTeamBuffFitCharacterCount(teamBuffId, self.CurTeam.TeamData)
|
||
local isBuffOn = fitCount > 0
|
||
self.PanelTeamBuffOn.gameObject:SetActiveEx(isBuffOn)
|
||
self.PanelTeamBuffOff.gameObject:SetActiveEx(not isBuffOn)
|
||
self.TxtTeamBuff.text = CSXTextManagerGetText("NewRoomSingleTeamBuffDes", fitCount, maxCount)
|
||
end
|
||
|
||
function XUiNewRoomSingle:UpdateTeamPrefab(team)
|
||
-- 巴别塔特殊检查
|
||
if self:IsBabelTower() then
|
||
team = XDataCenter.FubenBabelTowerManager.FilterPrefabTeamData(self.CurrentStageId, self.BabelTowerData.TeamId, team)
|
||
self.BabelTowerPanel:Refresh(team.TeamData)
|
||
end
|
||
self:OnClickTabCallBack(team.CaptainPos)
|
||
self.PanelTabCaptain:SelectIndex(team.FirstFightPos)
|
||
|
||
if self:IsUnionKillType() then
|
||
self:UpdateUnionKillTeamCache(team.TeamData)
|
||
end
|
||
self:UpdateTeam(team.TeamData, true)
|
||
end
|
||
|
||
function XUiNewRoomSingle:PlayTips(key, isOn)
|
||
local msg = CSXTextManagerGetText(key)
|
||
self.TxtTips1.text = isOn and msg or ""
|
||
self.TxtTips2.text = isOn and "" or msg
|
||
self.PanelTip.gameObject:SetActiveEx(true)
|
||
|
||
self:PlayAnimation("PanelTipEnable", handler(self, function()
|
||
self.PanelTip.gameObject:SetActiveEx(false)
|
||
end))
|
||
end
|
||
|
||
function XUiNewRoomSingle:CheckHasRobot()
|
||
if self.HasRobot then
|
||
local text = CSXTextManagerGetText("NewRoomSingleCannotSetRobot")
|
||
XUiManager.TipError(text)
|
||
end
|
||
return self.HasRobot
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnBtnEnterFightClick()
|
||
-- 进战前检查
|
||
if not self:CheckEnterFightByProxy() then
|
||
return
|
||
end
|
||
|
||
-- 巴别塔进入战斗
|
||
if self:IsBabelTower() then
|
||
self:HandleEnterBabelTower()
|
||
return
|
||
end
|
||
|
||
if self:GetIsCheckCaptainIdAndFirstFightId() then
|
||
local captainId = self:GetTeamCaptainId()
|
||
local firstFightId = self:GetTeamFirstFightId()
|
||
-- 检查队长位与首发位是否为空
|
||
if captainId == nil or captainId <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if firstFightId == nil or firstFightId <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
end
|
||
|
||
if not XDataCenter.FubenManager.CheckFightConditionByTeamData(self.ForceConditionIds, self.CurTeam.TeamData) then
|
||
return
|
||
end
|
||
|
||
if not self:CheckRoleStanmina() then
|
||
return
|
||
end
|
||
|
||
local stage = XDataCenter.FubenManager.GetStageCfg(self.CurrentStageId)
|
||
local isAssist = self:GetAssistStatus()
|
||
|
||
if self.StageInfos.Type == XDataCenter.FubenManager.StageType.Explore then
|
||
XDataCenter.FubenExploreManager.SetCurTeam(self.CurTeam)
|
||
end
|
||
|
||
if self.StageInfos.Type == XDataCenter.FubenManager.StageType.Daily then
|
||
XDataCenter.FubenDailyManager.SetFubenDailyRecord(self.CurrentStageId)
|
||
end
|
||
|
||
-- 狙击战进入战斗相关
|
||
if self:IsUnionKillType() then
|
||
self:HandleEnterUnionKill(stage)
|
||
return
|
||
end
|
||
|
||
-- 爬塔玩法出站人数必须为3人
|
||
if self:IsRogueLikeType() then
|
||
self:HandleEnterRogueLike(stage)
|
||
return
|
||
end
|
||
|
||
--追击玩法
|
||
if self:IsChessPursuit() then
|
||
self:HandleSaveChessPursuit(stage)
|
||
return
|
||
end
|
||
|
||
-- 世界boss进入战斗
|
||
if self:IsWorldBossType() then
|
||
self:HandleEnterWorldBoss(stage)
|
||
return
|
||
end
|
||
|
||
-- 尼尔玩法进入战斗
|
||
if self:IsNieRType() then
|
||
self:HandleEnterNieR(stage)
|
||
return
|
||
end
|
||
|
||
--跑团BOSS进入战斗
|
||
if XTRPGConfigs.IsBossStage(self.CurrentStageId) then
|
||
self:HandleEnterTRPGWorldBoss(stage)
|
||
return
|
||
end
|
||
|
||
--杀戮无双进入战斗
|
||
if self:IsKillZone() then
|
||
self:HandleEnterKillZone(stage)
|
||
return
|
||
end
|
||
|
||
--全服决战进入战斗
|
||
if self:IsAreaWar() then
|
||
self:HandleEnterAreaWar(stage)
|
||
return
|
||
end
|
||
|
||
if self:IsActivityBossSingle() then
|
||
self:HandleEnterActivityBossSingle(stage)
|
||
return
|
||
end
|
||
|
||
if self:IsPracticeBoss() then
|
||
self:HandleEnterPracticeBoss(stage)
|
||
return
|
||
end
|
||
|
||
--特训关检查是否超时
|
||
if self:IsSpecialTrain() then
|
||
if XDataCenter.FubenSpecialTrainManager.CheckActivityTimeout(XDataCenter.FubenSpecialTrainManager.CurActiveId, true) then
|
||
return
|
||
end
|
||
end
|
||
|
||
--战力警告
|
||
if self.FightControlResult == XUiFightControlState.Ex then
|
||
local data = XFubenConfigs.GetStageFightControl(self.StageCfg.FightControlId)
|
||
local contenttext
|
||
--计算战力
|
||
local teamAbility = {}
|
||
for i = 1, #self.CurTeam.TeamData do
|
||
local character = XDataCenter.CharacterManager.GetCharacter(self.CurTeam.TeamData[i])
|
||
if character == nil then
|
||
table.insert(teamAbility, 0)
|
||
else
|
||
table.insert(teamAbility, character.Ability)
|
||
end
|
||
end
|
||
|
||
if data.MaxRecommendFight > 0 then
|
||
contenttext = CSXTextManagerGetText("Insufficient", data.MaxShowFight)
|
||
elseif data.AvgRecommendFight > 0 then
|
||
local count = 0
|
||
for _, v in pairs(teamAbility) do
|
||
if v > 0 then
|
||
if v < data.AvgShowFight then
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
contenttext = CSXTextManagerGetText("AvgInsufficient", count, data.AvgShowFight)
|
||
else
|
||
contenttext = CSXTextManagerGetText("Insufficient", data.ShowFight)
|
||
end
|
||
|
||
local titletext = CSXTextManagerGetText("AbilityInsufficient")
|
||
XUiManager.DialogTip(titletext, contenttext, XUiManager.DialogType.Normal, nil, function()
|
||
XDataCenter.FubenManager.EnterFight(stage, self.CurTeam.TeamId, isAssist, self.ChallengeCount)
|
||
end)
|
||
else
|
||
XDataCenter.FubenManager.EnterFight(stage, self.CurTeam.TeamId, isAssist, self.ChallengeCount, self.ChallengeId)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:CheckRoleStanmina()
|
||
if self.StageInfos.Type == XDataCenter.FubenManager.StageType.BossSingle then
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local posData = self.CurTeam.TeamData[i]
|
||
if posData and posData > 0 then
|
||
local curStamina = XDataCenter.FubenBossSingleManager.GetMaxStamina() - XDataCenter.FubenBossSingleManager.GetCharacterChallengeCount(posData)
|
||
if curStamina <= 0 then
|
||
local charName = XCharacterConfigs.GetCharacterName(posData)
|
||
local text = CSXTextManagerGetText("BossSingleNoStamina", charName)
|
||
XUiManager.TipError(text)
|
||
return false
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
return true
|
||
end
|
||
|
||
-- 获取当前队伍的角色数
|
||
function XUiNewRoomSingle:GetCurTeamMemberNum()
|
||
local count = 0
|
||
for _, id in pairs(self.CurTeam.TeamData) do
|
||
if id > 0 then
|
||
count = count + 1
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
--------------------------------------------------------------------------------------------------------------------------狙击战相关
|
||
function XUiNewRoomSingle:IsUnionKillType()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.UnionKill
|
||
end
|
||
|
||
function XUiNewRoomSingle:UpdateTeamCaptionPos()
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
local captainPos = self.CurTeam.CaptainPos
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local memberInfo = teamCache[i]
|
||
if memberInfo then
|
||
memberInfo.IsTeamLeader = captainPos == i
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 初始化阵容
|
||
function XUiNewRoomSingle:UnionKillInitTeam(curTeam)
|
||
-- UiUnionKillTipCardShare
|
||
--
|
||
-- 显示共享角色
|
||
--
|
||
local fightData = XDataCenter.FubenUnionKillManager.GetCurRoomData()
|
||
if fightData and fightData.UnionKillPlayerInfos and not fightData.IsShowShareCharacter then
|
||
local shareInfos = {}
|
||
for _, v in pairs(fightData.UnionKillPlayerInfos) do
|
||
if v.Id ~= XPlayer.Id then
|
||
table.insert(shareInfos, v.ShareNpcData)
|
||
end
|
||
end
|
||
if #shareInfos > 0 then
|
||
XLuaUiManager.Open("UiUnionKillTipCardShare", shareInfos)
|
||
end
|
||
fightData.IsShowShareCharacter = true
|
||
end
|
||
|
||
local isTrialBoss = XDataCenter.FubenUnionKillManager.IsTrialStage(self.CurrentStageId) and XDataCenter.FubenUnionKillManager.CurIsTrialBoss()
|
||
local isUseShare = XDataCenter.FubenUnionKillManager.GetTrialUseShare()
|
||
-- 是试炼关清掉共享角色
|
||
if isTrialBoss and not isUseShare then
|
||
local adjustCache = {}
|
||
local shareTeamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local characterInfo = shareTeamCache[i]
|
||
if characterInfo and not characterInfo.IsShare then
|
||
adjustCache[i] = {}
|
||
adjustCache[i].CharacterId = characterInfo.CharacterId
|
||
adjustCache[i].IsShare = false
|
||
adjustCache[i].PlayerId = characterInfo.PlayerId
|
||
adjustCache[i].IsTeamLeader = characterInfo.IsTeamLeader
|
||
end
|
||
end
|
||
XDataCenter.FubenUnionKillManager.UpdateCacheTeam(adjustCache)
|
||
end
|
||
|
||
local unionTeam = XTool.Clone(curTeam)
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
unionTeam.CaptainPos = 1
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
unionTeam.TeamData[i] = 0
|
||
local characterInfo = teamCache[i]
|
||
if characterInfo then
|
||
unionTeam.TeamData[i] = characterInfo.CharacterId
|
||
if characterInfo.IsTeamLeader then
|
||
unionTeam.CaptainPos = i
|
||
end
|
||
end
|
||
end
|
||
|
||
curTeam = unionTeam
|
||
return curTeam
|
||
end
|
||
|
||
-- 缓存阵容切换
|
||
function XUiNewRoomSingle:SwitchCacheTeam(changeIndex, targetIndex)
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
local temp = teamCache[changeIndex]
|
||
teamCache[changeIndex] = teamCache[targetIndex]
|
||
teamCache[targetIndex] = temp
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local characterInfo = teamCache[i]
|
||
if characterInfo then
|
||
characterInfo.IsTeamLeader = i == self.CurTeam.CaptainPos
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 狙击战换人
|
||
function XUiNewRoomSingle:OnUnionKillChangeRole(index)
|
||
|
||
local args = {}
|
||
args.StageId = self.CurrentStageId
|
||
args.DefaultSelectId = self.CurTeam.TeamData[index]
|
||
args.Index = index
|
||
args.CallBack = function(selectItem, isJoin)
|
||
self:OnUnionKillSelectRole(index, selectItem, isJoin)
|
||
end
|
||
|
||
args.InTeamList = {}
|
||
args.CharacterInTeamList = {}
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
if teamCache[i] then
|
||
local characterId = teamCache[i].CharacterId
|
||
local playerId = teamCache[i].PlayerId
|
||
local key = string.format("%s_%s", tostring(playerId), tostring(characterId))
|
||
args.InTeamList[key] = true
|
||
args.CharacterInTeamList[tostring(characterId)] = true
|
||
end
|
||
end
|
||
if teamCache[index] then
|
||
args.DefaultSelectOwner = teamCache[index].PlayerId
|
||
else
|
||
args.DefaultSelectOwner = XPlayer.Id
|
||
end
|
||
|
||
-- 我的角色
|
||
args.CharacterList = {}
|
||
local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList()
|
||
for _, v in pairs(ownCharacters or {}) do
|
||
table.insert(args.CharacterList, {
|
||
Id = v.Id,
|
||
OwnerId = XPlayer.Id,
|
||
Flag = XFubenUnionKillConfigs.UnionKillCharType.Own,
|
||
Ability = math.floor(v.Ability)
|
||
})
|
||
end
|
||
|
||
-- 共享角色
|
||
local unionFightRoomData = XDataCenter.FubenUnionKillManager.GetCurRoomData()
|
||
local isTrialBoss = XDataCenter.FubenUnionKillManager.IsTrialStage(self.CurrentStageId) and XDataCenter.FubenUnionKillManager.CurIsTrialBoss()
|
||
local isUseShare = XDataCenter.FubenUnionKillManager.GetTrialUseShare()
|
||
local dontShare = isTrialBoss and not isUseShare
|
||
if unionFightRoomData and not dontShare then
|
||
for id, playerInfo in pairs(unionFightRoomData.UnionKillPlayerInfos or {}) do
|
||
if id ~= XPlayer.Id then
|
||
local character = playerInfo.ShareNpcData.Character
|
||
table.insert(args.CharacterList, {
|
||
Id = character.Id,
|
||
OwnerId = id,
|
||
Flag = XFubenUnionKillConfigs.UnionKillCharType.Share,
|
||
OwnerInfo = playerInfo,
|
||
Ability = math.floor(character.Ability)
|
||
})
|
||
end
|
||
end
|
||
end
|
||
|
||
XLuaUiManager.Open("UiUnionKillXuanRen", args)
|
||
end
|
||
|
||
function XUiNewRoomSingle:UpdateUnionKillTeamCache(teamData)
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
if teamData[i] and teamData[i] > 0 then
|
||
teamCache[i] = {}
|
||
teamCache[i].CharacterId = teamData[i]
|
||
teamCache[i].IsShare = false
|
||
teamCache[i].PlayerId = XPlayer.Id
|
||
teamCache[i].IsTeamLeader = self.CurTeam.CaptainPos == i
|
||
else
|
||
teamCache[i] = nil
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 选中角色
|
||
function XUiNewRoomSingle:OnUnionKillSelectRole(index, selectItem, isJoin)
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
if selectItem then
|
||
if isJoin then
|
||
local oldIndex
|
||
local oldItem
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local cacheItem = teamCache[i]
|
||
if cacheItem then
|
||
if selectItem.OwnerId == cacheItem.PlayerId and selectItem.Id == cacheItem.CharacterId and i ~= index then
|
||
oldIndex = i
|
||
oldItem = cacheItem
|
||
break
|
||
end
|
||
end
|
||
end
|
||
if oldIndex and oldItem then
|
||
teamCache[oldIndex] = teamCache[index]
|
||
end
|
||
teamCache[index] = {}
|
||
teamCache[index].CharacterId = selectItem.Id
|
||
teamCache[index].IsShare = selectItem.Flag == XFubenUnionKillConfigs.UnionKillCharType.Share
|
||
teamCache[index].PlayerId = selectItem.OwnerId
|
||
teamCache[index].IsTeamLeader = self.CurTeam.CaptainPos == index
|
||
if selectItem.Flag == XFubenUnionKillConfigs.UnionKillCharType.Share then
|
||
local unionFightRoomData = XDataCenter.FubenUnionKillManager.GetCurRoomData()
|
||
if unionFightRoomData and unionFightRoomData.UnionKillPlayerInfos then
|
||
local playerInfo = unionFightRoomData.UnionKillPlayerInfos[selectItem.OwnerId]
|
||
if playerInfo then
|
||
teamCache[index].Character = playerInfo.ShareNpcData.Character
|
||
end
|
||
end
|
||
else
|
||
teamCache[index].Character = nil
|
||
end
|
||
else
|
||
teamCache[index] = nil
|
||
end
|
||
end
|
||
|
||
-- 更新
|
||
local teamData = {}
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
if teamCache[i] then
|
||
teamData[i] = teamCache[i].CharacterId
|
||
else
|
||
teamData[i] = 0
|
||
end
|
||
end
|
||
self:UpdateTeam(teamData)
|
||
end
|
||
|
||
-- 更新狙击战模型
|
||
function XUiNewRoomSingle:UpdateUnionKillMode(roleModelPanel, pos, callback, defaultCharId)
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
local teamItem = teamCache[pos]
|
||
if teamItem and teamItem.IsShare then
|
||
local playerId = teamItem.PlayerId
|
||
local fashionId
|
||
local shareNpcData
|
||
local unionFightRoomData = XDataCenter.FubenUnionKillManager.GetCurRoomData()
|
||
if unionFightRoomData and unionFightRoomData.UnionKillPlayerInfos then
|
||
local playerInfo = unionFightRoomData.UnionKillPlayerInfos[playerId]
|
||
if playerInfo then
|
||
fashionId = playerInfo.ShareNpcData.Character.FashionId
|
||
shareNpcData = playerInfo.ShareNpcData
|
||
end
|
||
end
|
||
|
||
local roleModelLoadedCb = function(model)
|
||
if shareNpcData then
|
||
roleModelPanel:UpdateEquipsModelsByFightNpcData(model, shareNpcData)
|
||
end
|
||
end
|
||
|
||
roleModelPanel:UpdateCharacterModel(defaultCharId, nil, nil, roleModelLoadedCb, callback, fashionId)
|
||
else
|
||
local characterInfo = XDataCenter.CharacterManager.GetCharacter(teamItem.CharacterId)
|
||
roleModelPanel:UpdateCharacterModel(defaultCharId, nil, nil, nil, callback, characterInfo.FashionId)
|
||
end
|
||
end
|
||
|
||
-- 狙击战进入战斗
|
||
function XUiNewRoomSingle:HandleEnterUnionKill(stage)
|
||
local teamCache = XDataCenter.FubenUnionKillManager.GetCacheTeam()
|
||
XDataCenter.FubenManager.EnterUnionKillFight(stage, self.CurTeam, teamCache, function()
|
||
-- 进入战斗请求后续处理
|
||
end)
|
||
end
|
||
|
||
--------------------------------------------------------------------------------------------------------------------------爬塔活动相关
|
||
-- 初始化阵容
|
||
function XUiNewRoomSingle:RogueLikeInitTeam(curTeam)
|
||
local rogueLikeTeam = XTool.Clone(curTeam)
|
||
local characterInfos = XDataCenter.FubenRogueLikeManager.GetCharacterInfos()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local characterInfo = characterInfos[i]
|
||
if characterInfo then
|
||
rogueLikeTeam.TeamData[characterInfo.TeamPos] = characterInfo.Id
|
||
if characterInfo.Captain == 1 then
|
||
rogueLikeTeam.CaptainPos = characterInfo.TeamPos
|
||
end
|
||
if characterInfo.FirstFight == 1 then
|
||
rogueLikeTeam.FirstFightPos = characterInfo.TeamPos
|
||
end
|
||
else
|
||
rogueLikeTeam.TeamData[i] = 0
|
||
end
|
||
end
|
||
curTeam = rogueLikeTeam
|
||
return curTeam
|
||
end
|
||
|
||
|
||
-- 爬塔活动玩法
|
||
function XUiNewRoomSingle:IsRogueLikeType()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.RogueLike
|
||
end
|
||
|
||
function XUiNewRoomSingle:IsRogueLikeIsTiral()
|
||
return XDataCenter.FubenRogueLikeManager.IsSectionPurgatory()
|
||
end
|
||
|
||
-- 特训关活动玩法
|
||
function XUiNewRoomSingle:IsSpecialTrain()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.SpecialTrain
|
||
end
|
||
|
||
--追击玩法
|
||
function XUiNewRoomSingle:IsChessPursuit()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.ChessPursuit
|
||
end
|
||
|
||
--世界boss玩法
|
||
function XUiNewRoomSingle:IsWorldBossType()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.WorldBoss
|
||
end
|
||
|
||
--尼尔玩法
|
||
function XUiNewRoomSingle:IsNieRType()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.NieR
|
||
end
|
||
|
||
--杀戮无双
|
||
function XUiNewRoomSingle:IsKillZone()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.KillZone
|
||
end
|
||
|
||
--全服决战
|
||
function XUiNewRoomSingle:IsAreaWar()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.AreaWar
|
||
end
|
||
|
||
--活动个人boss
|
||
function XUiNewRoomSingle:IsActivityBossSingle()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.ActivityBossSingle
|
||
end
|
||
|
||
--拟真boss
|
||
function XUiNewRoomSingle:IsPracticeBoss()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.PracticeBoss
|
||
end
|
||
|
||
-- 更换爬塔助战角色
|
||
function XUiNewRoomSingle:OnRogueLikeChangeRole(index)
|
||
local currentActivityId = XDataCenter.FubenRogueLikeManager.GetRogueLikeActivityId()
|
||
local activityTemplate = XFubenRogueLikeConfig.GetRougueLikeTemplateById(currentActivityId)
|
||
local args = {}
|
||
args.TeamSelectPos = index
|
||
args.TeamCharIdMap = self.ChooseRobots
|
||
args.Type = XFubenRogueLikeConfig.SelectCharacterType.Robot
|
||
args.CharacterLimitType = activityTemplate.CharacterLimitType
|
||
args.LimitBuffId = XFubenConfigs.GetLimitShowBuffId(activityTemplate.LimitBuffId)
|
||
args.CallBack = function(selectId, isJoin, isReset)
|
||
self:HandleSelectRobot(index, selectId, isJoin, isReset)
|
||
end
|
||
XLuaUiManager.Open("UiRogueLikeRoomCharacter", args)
|
||
end
|
||
|
||
-- 选完机器人回来
|
||
function XUiNewRoomSingle:HandleSelectRobot(index, selectRobot, isJoin, isReset)
|
||
if isReset then
|
||
self.ChooseRobots = {}
|
||
end
|
||
|
||
if isJoin then
|
||
local oldIndex
|
||
local oldRobot
|
||
for k, v in pairs(self.ChooseRobots) do
|
||
if k ~= index and v == selectRobot then
|
||
oldIndex = k
|
||
oldRobot = v
|
||
break
|
||
end
|
||
end
|
||
if oldIndex and oldRobot then
|
||
self.ChooseRobots[oldIndex] = self.ChooseRobots[index]
|
||
self.ChooseRobots[index] = selectRobot
|
||
else
|
||
self.ChooseRobots[index] = selectRobot
|
||
end
|
||
|
||
else
|
||
self.ChooseRobots[index] = nil
|
||
end
|
||
-- 更新
|
||
local teamData = {}
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local robotId = self.ChooseRobots[i]
|
||
if robotId then
|
||
local characterId = XRobotManager.GetCharacterId(robotId)
|
||
teamData[i] = characterId
|
||
else
|
||
teamData[i] = 0
|
||
end
|
||
end
|
||
self:UpdateTeam(teamData)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetRogueLikeFactionByCid(cid)
|
||
local factionId
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local robotId = self.ChooseRobots[i]
|
||
if robotId then
|
||
local robotTemplate = XRobotManager.GetRobotTemplate(robotId)
|
||
if robotTemplate and cid == robotTemplate.CharacterId then
|
||
factionId = robotTemplate.FashionId
|
||
break
|
||
end
|
||
|
||
end
|
||
end
|
||
return factionId
|
||
end
|
||
|
||
-- 爬塔活动切换助战角色
|
||
function XUiNewRoomSingle:OnBtnSwitchRoleClick()
|
||
if not self:CanRogueLikeSwitchAssist() and not self.RogueLikeIsRobot then
|
||
XUiManager.TipMsg(CSXTextManagerGetText("RogueLikeNeed3SupportChars"))
|
||
return
|
||
end
|
||
self.RogueLikeIsRobot = not self.RogueLikeIsRobot
|
||
if self.CurTeam then
|
||
local teamData = {}
|
||
self.PanelTeamLeader.gameObject:SetActiveEx(not self.RogueLikeIsRobot)
|
||
self.PanelBtnLeader.gameObject:SetActiveEx(not self.RogueLikeIsRobot)
|
||
if self.RogueLikeIsRobot then
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local robotId = self.ChooseRobots[i]
|
||
if robotId then
|
||
local characterId = XRobotManager.GetCharacterId(robotId)
|
||
teamData[i] = characterId
|
||
else
|
||
teamData[i] = 0
|
||
end
|
||
end
|
||
|
||
-- 设置队长位与首发位为1
|
||
self.CurTeam.CaptainPos = 1
|
||
self.CurTeam.FirstFightPos = 1
|
||
|
||
self:InitPanelTeam()
|
||
self:SetRogueLikeRobotTips()
|
||
else
|
||
-- 获取NotifyRogueLikeData下发的参战列表,并检查是不是首发或者队长
|
||
-- 切换队长与首发时,爬塔活动不保存阵容,只在开始战斗时保存阵容
|
||
local characterInfos = XDataCenter.FubenRogueLikeManager.GetCharacterInfos()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
local characterInfo = characterInfos[i]
|
||
if characterInfo then
|
||
teamData[characterInfo.TeamPos] = characterInfo.Id
|
||
if characterInfo.Captain == 1 then
|
||
self.CurTeam.CaptainPos = characterInfo.TeamPos
|
||
self:InitPanelTeam()
|
||
end
|
||
|
||
if characterInfo.FirstFight == 1 then
|
||
self.CurTeam.FirstFightPos = characterInfo.TeamPos
|
||
self:InitPanelTeam()
|
||
end
|
||
else
|
||
teamData[i] = 0
|
||
end
|
||
end
|
||
self:SetRogueLikeCharacterTips()
|
||
end
|
||
self:UpdateTeam(teamData)
|
||
self:PlayAnimation("AnimEnable")
|
||
self.BtnSwitchRole01.gameObject:SetActiveEx(not self.RogueLikeIsRobot)
|
||
self.BtnSwitchRole02.gameObject:SetActiveEx(self.RogueLikeIsRobot)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetSwitchRole()
|
||
self.RogueLikeIsRobot = false
|
||
self.BtnSwitchRole01.gameObject:SetActiveEx(not self.RogueLikeIsRobot and self:IsRogueLikeType() and not self:IsRogueLikeIsTiral())
|
||
self.BtnSwitchRole02.gameObject:SetActiveEx(self.RogueLikeIsRobot and self:IsRogueLikeType() and not self:IsRogueLikeIsTiral())
|
||
self.BtnSwitchRole01:SetDisable(not self:CanRogueLikeSwitchAssist())
|
||
self.ChooseRobots = {}
|
||
if #self.ChooseRobots < MAX_CHAR_COUNT then
|
||
local robots = XDataCenter.FubenRogueLikeManager.GetAssistRobots()
|
||
for i = 1, MAX_CHAR_COUNT do
|
||
self.ChooseRobots[i] = robots[i] and robots[i].Id or nil
|
||
end
|
||
end
|
||
|
||
local teamPrefabState = (self:IsRogueLikeType() or self:IsWorldBossType()) and XUiButtonState.Disable or XUiButtonState.Normal
|
||
self.BtnTeamPrefab:SetButtonState(teamPrefabState)
|
||
|
||
self:SetPanelRogueLikeByProxy()
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetRogueLikeCharacterTips()
|
||
if self.Proxy and self.Proxy.SetRogueLikeCharacterTips then
|
||
return self.Proxy.SetRogueLikeCharacterTips(self)
|
||
end
|
||
|
||
local activityId = XDataCenter.FubenRogueLikeManager.GetRogueLikeActivityId()
|
||
if not activityId then return end
|
||
local activityTemplate = XFubenRogueLikeConfig.GetRougueLikeTemplateById(activityId)
|
||
if not activityTemplate then return end
|
||
self.PanelEnduranceRogueLike.gameObject:SetActiveEx(not self:IsRogueLikeIsTiral())
|
||
self.TxtActionPointNum.text = CSXTextManagerGetText("RogueLikeCostAction", activityTemplate.FightNeedPoint)
|
||
self.TxtTeamMemberCount.text = CSXTextManagerGetText("RogueLikeTeamNeedCount", XDataCenter.FubenRogueLikeManager:GetTeamMemberCount())
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetRogueLikeRobotTips()
|
||
--self.PanelEnduranceRogueLike.gameObject:SetActiveEx(false)
|
||
local activityId = XDataCenter.FubenRogueLikeManager.GetRogueLikeActivityId()
|
||
if not activityId then return end
|
||
local activityTemplate = XFubenRogueLikeConfig.GetRougueLikeTemplateById(activityId)
|
||
if not activityTemplate then return end
|
||
self.TxtActionPointNum.text = CSXTextManagerGetText("RogueLikeCostAction", activityTemplate.FightNeedPoint) --CSXTextManagerGetText("RogueLikeNotCostAction")
|
||
self.TxtTeamMemberCount.text = CSXTextManagerGetText("RogueLikeDefaultSupportChar")
|
||
end
|
||
|
||
-- 是否为爬塔并且不可以切换上阵角色
|
||
function XUiNewRoomSingle:IsRogueLikeLockCharacter()
|
||
return self:IsRogueLikeType() and XDataCenter.FubenRogueLikeManager.IsRogueLikeCharacterLock()
|
||
end
|
||
|
||
-- 是否为爬塔并且可以切换为助战角色
|
||
function XUiNewRoomSingle:CanRogueLikeSwitchAssist()
|
||
return self:IsRogueLikeType() and XDataCenter.FubenRogueLikeManager.CanSwitch2Assist()
|
||
end
|
||
|
||
-- 爬塔进入战斗并保存阵容
|
||
function XUiNewRoomSingle:HandleEnterRogueLike(stage)
|
||
local curTeamMemberCount = 0
|
||
local isAssist = self.RogueLikeIsRobot and 1 or 0
|
||
for i = 1, #self.CurTeam.TeamData do
|
||
if self.CurTeam.TeamData[i] > 0 then
|
||
curTeamMemberCount = curTeamMemberCount + 1
|
||
end
|
||
end
|
||
if XDataCenter.FubenRogueLikeManager.GetTeamMemberCount() > curTeamMemberCount then
|
||
XUiManager.TipMsg(CSXTextManagerGetText("RogueLikeTeamMaxMember"))
|
||
return
|
||
end
|
||
|
||
XDataCenter.FubenRogueLikeManager.UpdateRogueLikeStageRobots(self.CurrentStageId, isAssist, self.ChooseRobots)
|
||
|
||
-- function参数是PreFightRequest协议返回之后的回调函数
|
||
XDataCenter.FubenManager.EnterRogueLikeFight(stage, self.CurTeam, isAssist, self.NodeId, function()
|
||
for _, robotId in pairs(self.ChooseRobots or {}) do
|
||
XDataCenter.FubenRogueLikeManager.UpdateNewRobots(robotId)
|
||
end
|
||
-- 非机器人
|
||
-- 更新位置、队长位置、首发位置
|
||
if not self.RogueLikeIsRobot then
|
||
local id2Index = {}
|
||
local characterInfos = XDataCenter.FubenRogueLikeManager.GetCharacterInfos()
|
||
for i = 1, #self.CurTeam.TeamData do
|
||
id2Index[self.CurTeam.TeamData[i]] = i
|
||
end
|
||
for i = 1, #characterInfos do
|
||
local characterInfo = characterInfos[i]
|
||
local characterId = characterInfo.Id
|
||
characterInfo.TeamPos = id2Index[characterId]
|
||
characterInfo.Captain = (self.CurTeam.CaptainPos == id2Index[characterId]) and 1 or 0
|
||
characterInfo.FirstFight = (self.CurTeam.FirstFightPos == id2Index[characterId]) and 1 or 0
|
||
end
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XUiNewRoomSingle:HandleSaveChessPursuit(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
|
||
if self.ChessPursuitData.SceneUiType == XChessPursuitCtrl.SCENE_UI_TYPE.BOSS_ROUND then
|
||
XDataCenter.ChessPursuitManager.RequestChessPursuitChangeTeam(self.ChessPursuitData.TeamGridIndex)
|
||
else
|
||
XDataCenter.ChessPursuitManager.SaveTempTeamData(self.ChessPursuitData.MapId)
|
||
end
|
||
|
||
self:Close()
|
||
end
|
||
|
||
-- 世界boss进入战斗,检查队长位与首发位是否为空
|
||
function XUiNewRoomSingle:HandleEnterWorldBoss(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
local stageLevel = XDataCenter.WorldBossManager.GetBossStageLevel()
|
||
XDataCenter.FubenManager.EnterWorldBossFight(stage, self.CurTeam, stageLevel)
|
||
end
|
||
|
||
-- 尼尔玩法进入战斗,检查队长位与首发位是否为空
|
||
function XUiNewRoomSingle:HandleEnterNieR(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
XDataCenter.FubenManager.EnterNieRFight(stage, self.CurTeam)
|
||
end
|
||
|
||
-- 跑团世界boss进入战斗,检查队长位与首发位是否为空
|
||
function XUiNewRoomSingle:HandleEnterTRPGWorldBoss(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
XDataCenter.FubenManager.EnterTRPGWorldBossFight(stage, self.CurTeam)
|
||
end
|
||
|
||
function XUiNewRoomSingle:HandleEnterKillZone(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
XDataCenter.FubenManager.EnterKillZoneFight(stage, self.CurTeam)
|
||
end
|
||
|
||
function XUiNewRoomSingle:HandleEnterAreaWar(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
XDataCenter.FubenManager.EnterStageWithRobot(stage, self.CurTeam)
|
||
end
|
||
|
||
function XUiNewRoomSingle:HandleEnterActivityBossSingle(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
XDataCenter.FubenManager.EnterStageWithRobot(stage, self.CurTeam)
|
||
end
|
||
|
||
function XUiNewRoomSingle:HandleEnterPracticeBoss(stage)
|
||
if self.CurTeam.TeamData[self.CurTeam.CaptainPos] == nil or self.CurTeam.TeamData[self.CurTeam.CaptainPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
if self.CurTeam.TeamData[self.CurTeam.FirstFightPos] == nil or self.CurTeam.TeamData[self.CurTeam.FirstFightPos] <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckFirstFightNil")
|
||
return
|
||
end
|
||
XDataCenter.FubenManager.EnterPracticeBoss(stage, self.CurTeam, self.SimulateTrainInfo)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetCharacterLimitType()
|
||
if self:IsRogueLikeType() then
|
||
local currentActivityId = XDataCenter.FubenRogueLikeManager.GetRogueLikeActivityId()
|
||
local activityTemplate = XFubenRogueLikeConfig.GetRougueLikeTemplateById(currentActivityId)
|
||
return activityTemplate.CharacterLimitType
|
||
end
|
||
|
||
local stageId = self.CurrentStageId
|
||
return stageId and XFubenConfigs.GetStageCharacterLimitType(stageId)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnClickBtnTeamBuff()
|
||
XLuaUiManager.Open("UiRoomTeamBuff", self.TeamBuffId)
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitWorldBoss()
|
||
if not self:IsWorldBossType() then return end
|
||
self.BtnTeamPrefab.gameObject:SetActiveEx(false)
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnGetEvents()
|
||
return { XEventId.EVENT_ACTIVITY_ON_RESET }
|
||
end
|
||
|
||
function XUiNewRoomSingle:OnNotify(evt, ...)
|
||
local args = { ... }
|
||
if evt == XEventId.EVENT_ACTIVITY_ON_RESET then
|
||
self:OnResetEvent(args[1])
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:IsBabelTower()
|
||
return self.StageInfos.Type == XDataCenter.FubenManager.StageType.BabelTower
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitPanelBabelTower()
|
||
if not self:IsBabelTower() then
|
||
self.PanelBabel.gameObject:SetActiveEx(false)
|
||
return
|
||
end
|
||
self.PanelBabel.gameObject:SetActiveEx(true)
|
||
-- local maxTeamMemberCount = XDataCenter.FubenBabelTowerManager.GetMaxTeamMemberCount()
|
||
-- self.BtnTeamPrefab.gameObject:SetActiveEx(maxTeamMemberCount >= 3)
|
||
self.BtnTeamPrefab.gameObject:SetActiveEx(false)
|
||
|
||
self.BabelTowerPanel = XUiPanelBabelTower.New(self.PanelBabel, self.CurrentStageId, self.CurTeam.TeamData)
|
||
self.BtnEnterFight:SetNameByGroup(0, CSXTextManagerGetText("BabelTowerNewRoomBtnName"))
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitChessPursuit()
|
||
if not self:IsChessPursuit() then
|
||
return
|
||
end
|
||
|
||
self.BtnTeamPrefab.gameObject:SetActiveEx(self.ChessPursuitData.SceneUiType == XChessPursuitCtrl.SCENE_UI_TYPE.BUZHEN and not XUiManager.IsHideFunc)
|
||
self.BtnEnterFight:SetNameByGroup(0, CSXTextManagerGetText("ChessPursuitBuZhenEnter"))
|
||
end
|
||
|
||
function XUiNewRoomSingle:OpenBabelRoomCharacter(teamData, charPos)
|
||
local args = {}
|
||
args.StageId = self.CurrentStageId
|
||
args.TeamId = self.BabelTowerData.TeamId
|
||
args.Index = charPos
|
||
args.CurTeamList = teamData
|
||
args.CharacterLimitType = XFubenConfigs.GetStageCharacterLimitType(self.CurrentStageId)
|
||
args.LimitBuffId = XFubenConfigs.GetStageCharacterLimitBuffId(self.CurrentStageId)
|
||
XLuaUiManager.Open("UiBabelTowerRoomCharacter", args, function(resTeam)
|
||
self:UpdateTeam(resTeam)
|
||
self.BabelTowerPanel:Refresh(resTeam)
|
||
end)
|
||
end
|
||
|
||
-- 巴别塔进入战斗,检查队长位与首发位是否为空
|
||
function XUiNewRoomSingle:HandleEnterBabelTower()
|
||
local captainPos = self.CurTeam.CaptainPos
|
||
local firstFightPos = self.CurTeam.FirstFightPos
|
||
local team = self.CurTeam.TeamData
|
||
|
||
local captainId = team[captainPos]
|
||
if captainId == nil or captainId <= 0 then
|
||
XUiManager.TipText("TeamManagerCheckCaptainNil")
|
||
return
|
||
end
|
||
|
||
local firFightId = team[firstFightPos]
|
||
if firFightId == nil or firFightId <= 0 then
|
||
XUiManager.TipMsg(CS.XTextManager.GetText("TeamManagerCheckFirstFightNil"))
|
||
return
|
||
end
|
||
|
||
local closeCb = self.BabelTowerData.CloseCb
|
||
if closeCb then
|
||
XLuaUiManager.Remove("UiNewRoomSingle")
|
||
closeCb(team, captainPos, firstFightPos)
|
||
else
|
||
self:Close()
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:InitPanelNieR()
|
||
if not self:IsNieRType() then
|
||
return
|
||
end
|
||
self.BtnTeamPrefab.gameObject:SetActiveEx(false)
|
||
self.PanelCharacterLimit.gameObject:SetActiveEx(false)
|
||
self:ShowAssistToggle(false)
|
||
end
|
||
|
||
|
||
function XUiNewRoomSingle:GetLivWarRaceData()
|
||
return self.LivWarRaceData
|
||
end
|
||
--============================================================
|
||
-- 页面代理方法
|
||
-- 详情参考XUiNewRoomSingleProxy,注册页面代理
|
||
--============================================================
|
||
--================
|
||
--初始化界面
|
||
--================
|
||
function XUiNewRoomSingle:InitProxyPanel()
|
||
if not self.Proxy then return end
|
||
if self.Proxy.InitEditBattleUi then self.Proxy.InitEditBattleUi(self) end
|
||
end
|
||
|
||
--================
|
||
--显示资料处理
|
||
--================
|
||
function XUiNewRoomSingle:OnBtnShowInfoToggleByProxy(val)
|
||
if (not self.Proxy) or (not self.Proxy.OnBtnShowInfoToggle) then
|
||
self:OnBtnShowInfoToggle(val)
|
||
else
|
||
self.Proxy.OnBtnShowInfoToggle(self, val)
|
||
end
|
||
end
|
||
--================
|
||
--刷新成员信息处理
|
||
--================
|
||
function XUiNewRoomSingle:InitCharacterInfoByProxy()
|
||
if (not self.Proxy) or (not self.Proxy.InitEditBattleUiCharacterInfo) then
|
||
self:RefreshCharacterTypeTips()
|
||
return
|
||
end
|
||
self.Proxy.InitEditBattleUiCharacterInfo(self)
|
||
end
|
||
--================
|
||
--保存玩法出战队伍操作,更改队长位和首发位时触发
|
||
--================
|
||
function XUiNewRoomSingle:SetTeamByProxy()
|
||
if not self.Proxy then
|
||
-- 不保存阵容
|
||
if not self:IsRogueLikeType()
|
||
and not self:IsUnionKillType()
|
||
and not self:IsBabelTower()
|
||
and not self:IsWorldBossType()
|
||
and not self:IsChessPursuit()
|
||
and not self:IsNieRType() then
|
||
XDataCenter.TeamManager.SetPlayerTeam(self.CurTeam, false)
|
||
end
|
||
return
|
||
end
|
||
|
||
if self.Proxy.SetPlayerTeam then
|
||
self.Proxy.SetPlayerTeam(self.CurTeam)
|
||
end
|
||
|
||
if self.Proxy.SetEditBattleUiTeam then
|
||
self.Proxy.SetEditBattleUiTeam(self)
|
||
elseif self.Proxy.UpdateTeam then
|
||
self.Proxy.UpdateTeam(self)
|
||
end
|
||
end
|
||
|
||
--================
|
||
--获取队长ID
|
||
--================
|
||
function XUiNewRoomSingle:GetCaptainIdByProxy()
|
||
if (not self.Proxy) or (not self.Proxy.GetEditBattleUiCaptainId) then
|
||
return self.CurTeam.TeamData[self.CurTeam.CaptainPos]
|
||
end
|
||
return self.Proxy.GetEditBattleUiCaptainId(self)
|
||
end
|
||
|
||
--================
|
||
--获取队伍数据
|
||
--================
|
||
function XUiNewRoomSingle:GetTeamByProxy()
|
||
if not self.Proxy then return nil end
|
||
if self.Proxy.GetBattleTeamData then
|
||
return self.Proxy.GetBattleTeamData(self)
|
||
end
|
||
return nil
|
||
end
|
||
|
||
--=========================================
|
||
--获取队伍的角色Id
|
||
--与CurTeam不同,它主要用于区分机器人与玩家角色
|
||
--在CurTeam中,有些机器人用了CharacterId而不是RobotId,无法获得得到机器人配置数据
|
||
--
|
||
--所以如果玩法中有机器人,并且CurTeam使用了CharacterId,则代理需要实现接口返回机器人的robotId,玩家角色则不变
|
||
--不然机器人会使用玩家数据或者默认数据
|
||
--
|
||
--返回的数据结构与TeamData一致,索引1为中间,2为左边,3为右边
|
||
--机器人是robotId,玩家角色是characterId
|
||
--=========================================
|
||
function XUiNewRoomSingle:GetRealCharDataByProxy()
|
||
if not self.Proxy then
|
||
return nil
|
||
end
|
||
if self.Proxy.GetRealCharData then
|
||
return self.Proxy.GetRealCharData(self, self.CurrentStageId)
|
||
end
|
||
return nil
|
||
end
|
||
|
||
--================
|
||
--当点击角色模型时
|
||
--================
|
||
function XUiNewRoomSingle:HandleCharClickByProxy(charPos)
|
||
if (not self.Proxy) or (not self.Proxy.HandleCharClick) then
|
||
local teamData = XTool.Clone(self.CurTeam.TeamData)
|
||
local stageId = self.CurrentStageId
|
||
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
||
local characterLimitType = self:GetCharacterLimitType()
|
||
XLuaUiManager.Open("UiRoomCharacter", teamData, charPos,
|
||
function(resTeam)
|
||
self:UpdateTeam(resTeam)
|
||
end,
|
||
stageInfo.Type,
|
||
characterLimitType,
|
||
{
|
||
LimitBuffId = XFubenConfigs.GetStageCharacterLimitBuffId(stageId),
|
||
ChallengeId = self.ChallengeId,
|
||
TeamBuffId = self.TeamBuffId,
|
||
})
|
||
return
|
||
end
|
||
self.Proxy.HandleCharClick(self, charPos, self.CurrentStageId)
|
||
end
|
||
|
||
--================
|
||
--当点击角色辅助机时
|
||
--================
|
||
function XUiNewRoomSingle:HandlePartnerClickByProxy(charPos)
|
||
if (not self.Proxy) or (not self.Proxy.HandlePartnerClick) then
|
||
self:HandleCharClick(charPos)
|
||
return
|
||
end
|
||
self.Proxy.HandlePartnerClick(self, charPos, self.CurrentStageId)
|
||
end
|
||
|
||
--================
|
||
--刷新警告面板
|
||
--================
|
||
function XUiNewRoomSingle:InitFightControl()
|
||
if not self.FightControl then
|
||
self.FightControl = XUiNewRoomFightControl.New(self.PanelNewRoomFightControl)
|
||
end
|
||
if (not self.Proxy) or (not self.Proxy.UpdateFightControl) then
|
||
self:UpdateFightControl()
|
||
else
|
||
self.FightControlResult = self.Proxy.UpdateFightControl(self, self.CurTeam)
|
||
end
|
||
end
|
||
|
||
--================
|
||
--刷新队伍,编队角色或编队顺序发生变化时触发
|
||
--================
|
||
function XUiNewRoomSingle:UpdateTeamByProxy()
|
||
if (not self.Proxy) or (not self.Proxy.UpdateTeam) then
|
||
return
|
||
end
|
||
self.Proxy.UpdateTeam(self)
|
||
end
|
||
|
||
--================
|
||
--刷新模型
|
||
--================
|
||
function XUiNewRoomSingle:UpdateRoleModelByProxy(charId, roleModelPanel, pos)
|
||
if (not self.Proxy) or (not self.Proxy.UpdateRoleModel) then
|
||
self:UpdateRoleModel(charId, roleModelPanel, pos)
|
||
return
|
||
end
|
||
self.Proxy.UpdateRoleModel(self, charId, roleModelPanel, pos)
|
||
end
|
||
|
||
--================
|
||
--接受到活动重置或结束消息时
|
||
--================
|
||
function XUiNewRoomSingle:OnResetEvent(stageType)
|
||
if self.StageInfos.Type ~= stageType then return end
|
||
if self.Proxy.OnResetEvent then self.Proxy.OnResetEvent(self) end
|
||
end
|
||
|
||
--================
|
||
--筛选角色
|
||
--================
|
||
function XUiNewRoomSingle:LimitCharacterByProxy(curTeam)
|
||
if (not self.Proxy) or (not self.Proxy.LimitCharacter) then
|
||
return
|
||
end
|
||
self.Proxy.LimitCharacter(self, curTeam)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetRobotIdsByProxy(stageId)
|
||
if self.Proxy and self.Proxy.GetRobotIds then
|
||
return self.Proxy.GetRobotIds(stageId)
|
||
end
|
||
return XDataCenter.FubenManager.GetStageCfg(stageId).RobotId
|
||
end
|
||
|
||
function XUiNewRoomSingle:CheckCharCanLongClickByProxy(stageId)
|
||
if self.Proxy and self.Proxy.CheckCanCharLongClick then
|
||
return self.Proxy.CheckCanCharLongClick(self, stageId)
|
||
end
|
||
return true
|
||
end
|
||
|
||
function XUiNewRoomSingle:CheckCharCanClickByProxy(stageId)
|
||
if self.Proxy and self.Proxy.CheckCanCharClick then
|
||
return self.Proxy.CheckCanCharClick(self, stageId)
|
||
end
|
||
return not self:CheckHasRobot()
|
||
end
|
||
|
||
-- 获取是否隐藏切换第一次战斗位置按钮信息(红色,蓝色,黄色)
|
||
function XUiNewRoomSingle:GetIsHideSwitchFirstFightPosBtnsWithProxy()
|
||
if self.Proxy and self.Proxy.GetIsHideSwitchFirstFightPosBtns then
|
||
return self.Proxy.GetIsHideSwitchFirstFightPosBtns()
|
||
end
|
||
return self.HasRobot
|
||
end
|
||
--================
|
||
--销毁窗口时
|
||
--================
|
||
function XUiNewRoomSingle:DestroyNewRoomSingle()
|
||
if (not self.Proxy) or (not self.Proxy.DestroyNewRoomSingle) then
|
||
return
|
||
end
|
||
self.Proxy.DestroyNewRoomSingle(self)
|
||
end
|
||
--================
|
||
--更新伙伴信息
|
||
--================
|
||
function XUiNewRoomSingle:UpdatePartnerInfo()
|
||
if (not self.Proxy) or (not self.Proxy.UpdatePartnerInfo) then
|
||
self:DefaultUpdatePartnerInfo()
|
||
return
|
||
end
|
||
self.Proxy.UpdatePartnerInfo(self, MAX_CHAR_COUNT)
|
||
end
|
||
|
||
--================
|
||
--更新人物特性信息
|
||
--================
|
||
function XUiNewRoomSingle:UpdateFeatureInfo()
|
||
if (not self.Proxy) or (not self.Proxy.UpdateFeatureInfo) then
|
||
self:DefaultUpdateFeatureInfo()
|
||
return
|
||
end
|
||
self.Proxy.UpdateFeatureInfo(self, MAX_CHAR_COUNT)
|
||
end
|
||
|
||
--================
|
||
--进战前检查
|
||
--================
|
||
function XUiNewRoomSingle:CheckEnterFightByProxy()
|
||
if (not self.Proxy) or (not self.Proxy.CheckEnterFight) then
|
||
return true
|
||
end
|
||
return self.Proxy.CheckEnterFight(self, self.CurTeam)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetIsSaveTeamData()
|
||
if self.Proxy and self.Proxy.GetIsSaveTeamData then
|
||
return self.Proxy.GetIsSaveTeamData()
|
||
end
|
||
return not self:IsRogueLikeType() and not self:IsUnionKillType() and not self:IsWorldBossType()
|
||
end
|
||
|
||
function XUiNewRoomSingle:HandleSwitchTeamPosWithProxy(fromPos, toPos)
|
||
if self.Proxy and self.Proxy.SwitchTeamPos then
|
||
self.Proxy.SwitchTeamPos(self.CurrentStageId, fromPos, toPos)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetFirstFightPosWithProxy(index)
|
||
if self.Proxy and self.Proxy.SetFirstFightPos then
|
||
self.Proxy.SetFirstFightPos(self.CurrentStageId, index)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:SetCaptainPosWithProxy(index)
|
||
if self.Proxy and self.Proxy.SetCaptainPos then
|
||
self.Proxy.SetCaptainPos(self.CurrentStageId, index)
|
||
end
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetFirstFightPos()
|
||
if self.Proxy and self.Proxy.GetFirstFightPos then
|
||
return self.Proxy.GetFirstFightPos(self.CurrentStageId)
|
||
end
|
||
return CHAR_POS1
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetCaptainPos()
|
||
if self.Proxy and self.Proxy.GetCaptainPos then
|
||
return self.Proxy.GetCaptainPos(self.CurrentStageId)
|
||
end
|
||
return CHAR_POS1
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetTeamCaptainId()
|
||
if self.Proxy and self.Proxy.GetTeamCaptainId then
|
||
return self.Proxy.GetTeamCaptainId(self.CurrentStageId)
|
||
end
|
||
return XDataCenter.TeamManager.GetTeamCaptainId(self.CurTeam.TeamId)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetTeamFirstFightId()
|
||
if self.Proxy and self.Proxy.GetTeamFirstFightId then
|
||
return self.Proxy.GetTeamFirstFightId(self.CurrentStageId)
|
||
end
|
||
return XDataCenter.TeamManager.GetTeamFirstFightId(self.CurTeam.TeamId)
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetIsCheckCaptainIdAndFirstFightId()
|
||
if self.Proxy and self.Proxy.GetIsCheckCaptainIdAndFirstFightId then
|
||
return self.Proxy.GetIsCheckCaptainIdAndFirstFightId(self.CurrentStageId)
|
||
end
|
||
return not self:IsWorldBossType()
|
||
and not self.HasRobot
|
||
and (not self:IsRogueLikeType())
|
||
and (not self:IsUnionKillType())
|
||
and (not self:IsChessPursuit())
|
||
and (not self:IsNieRType())
|
||
end
|
||
|
||
function XUiNewRoomSingle:GetAutoCloseInfo()
|
||
if self.Proxy and self.Proxy.GetAutoCloseInfo then
|
||
return self.Proxy.GetAutoCloseInfo(self.StageCfg)
|
||
end
|
||
return false
|
||
end
|
||
|
||
--================
|
||
--左下红底的出战人数说明
|
||
--================
|
||
function XUiNewRoomSingle:SetPanelRogueLikeByProxy()
|
||
if self.Proxy and self.Proxy.SetPanelRogueLike then
|
||
return self.Proxy.SetPanelRogueLike(self)
|
||
end
|
||
|
||
if self.PanelRogueLike then
|
||
self.PanelRogueLike.gameObject:SetActiveEx(self:IsRogueLikeType())
|
||
if self.RogueLikeIsRobot then
|
||
self:SetRogueLikeRobotTips()
|
||
else
|
||
self:SetRogueLikeCharacterTips()
|
||
end
|
||
end
|
||
end |