2023-07-14 19:35:33 +00:00
|
|
|
|
--===========================
|
|
|
|
|
--超限乱斗玩家队伍管理器
|
|
|
|
|
--模块负责:吕天元
|
|
|
|
|
--===========================
|
|
|
|
|
local XSmashBTeamManager = {}
|
|
|
|
|
--==================
|
|
|
|
|
--模式Id --> 我方队伍字典
|
|
|
|
|
--Key:ModeId
|
|
|
|
|
--Value:TeamData = {(值为示例)
|
|
|
|
|
--CaptainPos = 1
|
|
|
|
|
--FirstFightPos = 1
|
|
|
|
|
--RoleIds = {[1] = 0, [2] = 0, [3] = 0}
|
|
|
|
|
--Color = {[1] = red, [2] = blue, [3] = yellow}
|
|
|
|
|
--}
|
|
|
|
|
--==================
|
|
|
|
|
local OwnTeamDic
|
|
|
|
|
|
|
|
|
|
local DefaultTeamInfo
|
|
|
|
|
|
|
|
|
|
local SAVE_KEY = "SUPER_SMASH_TEAMDATA_"
|
|
|
|
|
--============
|
|
|
|
|
--根据模式获取本地保存队伍字符串
|
|
|
|
|
--============
|
|
|
|
|
local function GetSaveKey(modeId)
|
|
|
|
|
return SAVE_KEY .. XPlayer.Id .. XDataCenter.SuperSmashBrosManager.GetActivityId() .. modeId
|
|
|
|
|
end
|
|
|
|
|
--============
|
|
|
|
|
--获取默认队伍
|
|
|
|
|
--先获取本地保存的数据,若没有,则按照模式对应配置新建默认数据
|
|
|
|
|
--============
|
|
|
|
|
local function GetDefaultTeam(modeId)
|
|
|
|
|
local data = XSaveTool.GetData(GetSaveKey(modeId))
|
|
|
|
|
if data then
|
|
|
|
|
local mode = XDataCenter.SuperSmashBrosManager.GetModeByModeType(modeId)
|
|
|
|
|
--检测有没当前没有的角色(有可能配置了不同的机器人)
|
|
|
|
|
for index = 1, #(data.RoleIds or {}) do
|
|
|
|
|
local roleId = data.RoleIds[index]
|
|
|
|
|
if roleId > 0 then
|
|
|
|
|
local role = XDataCenter.SuperSmashBrosManager.GetRoleById(roleId)
|
|
|
|
|
if not role then
|
|
|
|
|
data.RoleIds[index] = 0
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not data.Assistance then
|
|
|
|
|
data.Assistance = {}
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
return data
|
|
|
|
|
end
|
|
|
|
|
local newData = {
|
|
|
|
|
FirstFightPos = 1,
|
|
|
|
|
CaptainPos = 1,
|
|
|
|
|
Color = {},
|
2024-09-01 20:49:41 +00:00
|
|
|
|
RoleIds = {},
|
|
|
|
|
Assistance = {},-- 支援角色位
|
2023-07-14 19:35:33 +00:00
|
|
|
|
}
|
|
|
|
|
local mode = XDataCenter.SuperSmashBrosManager.GetModeByModeType(modeId)
|
|
|
|
|
local roleMax = mode:GetRoleMaxPosition()
|
|
|
|
|
local battleNum = mode:GetRoleBattleNum()
|
|
|
|
|
local roleMin = mode:GetRoleMinPosition()
|
|
|
|
|
local maxPosition = mode:GetTeamMaxPosition() --我方队伍位置数
|
|
|
|
|
local forceRandomIndex = mode:GetRoleRandomStartIndex( ) --我方可强制随机的开始下标
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local roleForceAssistIndex = mode:GetRoleForceAssistIndex() -- 我方支援的开始下标
|
2023-07-14 19:35:33 +00:00
|
|
|
|
for index = 1, maxPosition do
|
|
|
|
|
if index > roleMax then
|
|
|
|
|
newData.RoleIds[index] = XSuperSmashBrosConfig.PosState.Ban
|
|
|
|
|
newData.Color[index] = XSuperSmashBrosConfig.ColorTypeEnum.None
|
|
|
|
|
else
|
|
|
|
|
--当上场人数大于1时为组队战,需要有排位颜色按默认顺序排列(红蓝黄),否则排位颜色时为None
|
|
|
|
|
local colorTypeIndex = ((battleNum == 1) and XSuperSmashBrosConfig.ColorTypeEnum.None) or index
|
|
|
|
|
newData.RoleIds[index] = XSuperSmashBrosConfig.PosState.Empty
|
|
|
|
|
newData.Color[index] = colorTypeIndex
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if forceRandomIndex and index >= forceRandomIndex then
|
|
|
|
|
newData.RoleIds[index] = XSuperSmashBrosConfig.PosState.Random
|
|
|
|
|
newData.Color[index] = XSuperSmashBrosConfig.ColorTypeEnum.None
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
-- 支援角色 颜色 代码1
|
|
|
|
|
if XSmashBTeamManager.IsAssistance(index, roleForceAssistIndex) then
|
|
|
|
|
newData.Color[index] = XSuperSmashBrosConfig.ColorTypeEnum.Purple
|
|
|
|
|
newData.Assistance[index] = true
|
|
|
|
|
else
|
|
|
|
|
newData.Assistance[index] = false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
return newData
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--保存默认队伍
|
|
|
|
|
--=============
|
|
|
|
|
local function SaveDefaultTeam(modeId, teamData)
|
|
|
|
|
XSaveTool.SaveData(GetSaveKey(modeId), teamData)
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--初始化
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.Init()
|
|
|
|
|
OwnTeamDic = {}
|
|
|
|
|
DefaultTeamInfo = {}
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--获取队伍
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.GetTeamByModeId(modeId)
|
|
|
|
|
if not OwnTeamDic[modeId] then
|
|
|
|
|
XSmashBTeamManager.CreateTeam(modeId)
|
|
|
|
|
end
|
|
|
|
|
return OwnTeamDic[modeId]
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--获取默认队伍
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.GetDefaultTeamInfoByModeId(modeId)
|
|
|
|
|
if not DefaultTeamInfo[modeId] then
|
|
|
|
|
XSmashBTeamManager.CreateTeam(modeId)
|
|
|
|
|
end
|
|
|
|
|
return DefaultTeamInfo[modeId]
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--修改默认队伍
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.SaveDefaultTeamByModeId(modeId, captainPos, firstFightPos, roleIds, color)
|
|
|
|
|
local defaultTeam = XSmashBTeamManager.GetDefaultTeamInfoByModeId(modeId)
|
|
|
|
|
if captainPos and captainPos > 0 then
|
|
|
|
|
defaultTeam.CaptainPos = captainPos
|
|
|
|
|
end
|
|
|
|
|
if firstFightPos and firstFightPos > 0 then
|
|
|
|
|
defaultTeam.FirstFightPos = firstFightPos
|
|
|
|
|
end
|
|
|
|
|
if roleIds then
|
|
|
|
|
for index, _ in pairs(defaultTeam.RoleIds) do
|
|
|
|
|
defaultTeam.RoleIds[index] = roleIds[index] or XSuperSmashBrosConfig.PosState.Empty
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if color then
|
|
|
|
|
for index = 1, #defaultTeam.Color do
|
|
|
|
|
local newId = color and color[index]
|
|
|
|
|
defaultTeam.Color[index] = newId or XSuperSmashBrosConfig.ColorTypeEnum.None
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
SaveDefaultTeam(modeId, defaultTeam)
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--创建默认队伍
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.CreateTeam(modeId)
|
|
|
|
|
OwnTeamDic[modeId] = {}
|
|
|
|
|
--设置默认队伍,也用于本地保存上次使用过的队伍
|
|
|
|
|
DefaultTeamInfo[modeId] = GetDefaultTeam(modeId)
|
|
|
|
|
OwnTeamDic[modeId] = {
|
|
|
|
|
FirstFightPos = 1,
|
|
|
|
|
CaptainPos = 1,
|
|
|
|
|
RoleIds = {},
|
2024-09-01 20:49:41 +00:00
|
|
|
|
Color = {},
|
|
|
|
|
Assistance = {}, -- 支援角色位
|
2023-07-14 19:35:33 +00:00
|
|
|
|
}
|
2024-09-01 20:49:41 +00:00
|
|
|
|
---@type XSmashBMode
|
2023-07-14 19:35:33 +00:00
|
|
|
|
local mode = XDataCenter.SuperSmashBrosManager.GetModeByModeType(modeId)
|
|
|
|
|
local roleMax = mode:GetRoleMaxPosition()
|
|
|
|
|
local battleNum = mode:GetRoleBattleNum()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local roleForceAssistIndex = mode:GetRoleForceAssistIndex()
|
2023-07-14 19:35:33 +00:00
|
|
|
|
for index = 1, roleMax do
|
|
|
|
|
OwnTeamDic[modeId].RoleIds[index] = 0
|
|
|
|
|
--当上场人数大于1时为组队战,需要有排位颜色按默认顺序排列(红蓝黄),否则排位颜色时为None
|
|
|
|
|
local colorTypeIndex = ((battleNum == 1) and XSuperSmashBrosConfig.ColorTypeEnum.None) or index
|
|
|
|
|
OwnTeamDic[modeId].Color[index] = colorTypeIndex == 0 and XSuperSmashBrosConfig.ColorTypeEnum.Red or colorTypeIndex
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
-- 支援角色 颜色 代码2
|
|
|
|
|
if XSmashBTeamManager.IsAssistance(index, roleForceAssistIndex) then
|
|
|
|
|
OwnTeamDic[modeId].Color[index] = XSuperSmashBrosConfig.ColorTypeEnum.Purple
|
|
|
|
|
OwnTeamDic[modeId].Assistance[index] = true
|
|
|
|
|
else
|
|
|
|
|
OwnTeamDic[modeId].Assistance[index] = false
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--重置队伍信息
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.ResetTeamByModeId(modeId)
|
|
|
|
|
local teamData = XSmashBTeamManager.GetTeamByModeId(modeId)
|
|
|
|
|
for index, roleId in pairs(teamData.RoleIds or {}) do
|
|
|
|
|
if roleId > 0 then
|
|
|
|
|
local role = XDataCenter.SuperSmashBrosManager.GetRoleById(roleId)
|
|
|
|
|
if role then
|
|
|
|
|
role:SetHpLeft(100)
|
|
|
|
|
role:SetSpLeft(0)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
teamData.RoleIds[index] = 0
|
|
|
|
|
end
|
|
|
|
|
--设置默认值
|
|
|
|
|
teamData.FirstFightPos = DefaultTeamInfo[modeId].FirstFightPos
|
|
|
|
|
teamData.CaptainPos = DefaultTeamInfo[modeId].CaptainPos
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
for index = 1, #DefaultTeamInfo[modeId].Color do
|
|
|
|
|
teamData.Color[index] = DefaultTeamInfo[modeId].Color[index]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--===============
|
|
|
|
|
--设置队伍数据
|
|
|
|
|
--@params
|
|
|
|
|
--captainPos:队长位
|
|
|
|
|
--firstFightPos:首发位
|
|
|
|
|
--===============
|
|
|
|
|
function XSmashBTeamManager.SetTeamByModeId(captainPos, firstFightPos, roleIds, posIds, modeId)
|
|
|
|
|
local teamData = XSmashBTeamManager.GetTeamByModeId(modeId)
|
|
|
|
|
teamData.CaptainPos = captainPos ~= nil and captainPos > 0 and captainPos or teamData.CaptainPos
|
|
|
|
|
teamData.FirstFightPos = firstFightPos ~= nil and firstFightPos > 0 and firstFightPos or teamData.FirstFightPos
|
|
|
|
|
for index = 1, #(roleIds or {}) do
|
|
|
|
|
teamData.RoleIds[index] = roleIds[index].Id
|
|
|
|
|
-- 记录彩蛋角色揭开之前应该显示的角色id. 服务器验证通过,绑定roll出的彩蛋机器人原角色(有orgId就可以判断这个角色是彩蛋角色) cxldV2
|
|
|
|
|
local orgId = roleIds[index].OrgId
|
|
|
|
|
if orgId and orgId > 0 then
|
|
|
|
|
local eggChar = XDataCenter.SuperSmashBrosManager.GetRoleById(roleIds[index].Id)
|
|
|
|
|
eggChar:SetEggRobotOrgId(orgId)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 给彩蛋角色装备上核心,彩蛋的核心是进入ready界面后通过服务器验证下发 (有eggPlugin就一定是彩蛋角色)
|
|
|
|
|
local eggPluginId = roleIds[index].EggPlugin
|
|
|
|
|
if eggPluginId and eggPluginId > 0 then -- 非彩蛋角色默认发0
|
|
|
|
|
local eggChar = XDataCenter.SuperSmashBrosManager.GetRoleById(roleIds[index].Id)
|
|
|
|
|
eggChar:SetCore(eggPluginId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
for index = 1, #(posIds or {}) do
|
|
|
|
|
--获取枚举的颜色字符串
|
|
|
|
|
local colorTypeIndex = XSuperSmashBrosConfig.ColorTypeIndex[posIds[index]]
|
|
|
|
|
teamData.Color[index] = XSuperSmashBrosConfig.ColorTypeEnum[colorTypeIndex]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--根据模式Id获取参战队伍的队长位
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.GetCaptainPosByModeId(modeId)
|
|
|
|
|
local teamData = XSmashBTeamManager.GetTeamByModeId(modeId)
|
|
|
|
|
return teamData.CaptainPos
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--根据模式Id获取参战队伍的首发位
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.GetFirstFightPosByModeId(modeId)
|
|
|
|
|
local teamData = XSmashBTeamManager.GetTeamByModeId(modeId)
|
|
|
|
|
return teamData.FirstFightPos
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--根据模式Id和队伍位置获取参战队伍角色的颜色位置
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.GetColorByIndexAndModeId(index, modeId)
|
|
|
|
|
local teamData = XSmashBTeamManager.GetTeamByModeId(modeId)
|
|
|
|
|
return teamData.Color and teamData.Color[index]
|
|
|
|
|
end
|
|
|
|
|
--=============
|
|
|
|
|
--根据模式Id获取参战队伍的角色Id列表
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.GetRoleIdsByModeId(modeId)
|
|
|
|
|
local teamData = XSmashBTeamManager.GetTeamByModeId(modeId)
|
|
|
|
|
return teamData.RoleIds or {}
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--=============
|
|
|
|
|
--清空本地保存的队伍数据,debug用
|
|
|
|
|
--=============
|
|
|
|
|
function XSmashBTeamManager.ClearSavedTeamData(mode)
|
|
|
|
|
XSaveTool.RemoveData(GetSaveKey(mode or 6))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--参考自:XUiSSBPickCharaHeadList:OnGridSelect(grid)
|
|
|
|
|
---@param mode XSmashBMode
|
|
|
|
|
---@param roleId number
|
|
|
|
|
---@param pos number
|
|
|
|
|
function XSmashBTeamManager.SetTeamAssistanceMember(mode, roleId, changePos)
|
|
|
|
|
local teamData = XSmashBTeamManager.GetDefaultTeamInfoByModeId(mode:GetId())
|
|
|
|
|
local teamIds = teamData.RoleIds
|
|
|
|
|
local characterIdSelected = XSmashBTeamManager.GetCharacterId(roleId)
|
|
|
|
|
if roleId == XSuperSmashBrosConfig.PosState.Random then
|
|
|
|
|
--若选的是随机,则直接赋值
|
|
|
|
|
teamIds[changePos] = roleId
|
|
|
|
|
elseif teamIds[changePos] == XSuperSmashBrosConfig.PosState.Empty or teamIds[changePos] == XSuperSmashBrosConfig.PosState.Random then
|
|
|
|
|
--若替换位是空位或随机,则直接把选中的Id赋值
|
|
|
|
|
for pos, teamRoleId in pairs(teamIds) do
|
|
|
|
|
local characterIdInTeam = XRobotManager.GetCharacterId(teamRoleId)
|
|
|
|
|
if characterIdInTeam > 0 and characterIdInTeam == characterIdSelected then --若跟其他位置相同且不为随机,则交换位置
|
|
|
|
|
teamIds[pos] = XSuperSmashBrosConfig.PosState.Empty
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
teamIds[changePos] = roleId
|
|
|
|
|
elseif teamIds[changePos] == roleId then --若重复选中,则表示取消选中
|
|
|
|
|
teamIds[changePos] = XSuperSmashBrosConfig.PosState.Empty
|
|
|
|
|
else
|
|
|
|
|
local roleForceAssistIndex = mode:GetRoleForceAssistIndex() -- 我方支援的开始下标
|
|
|
|
|
local switch = false
|
|
|
|
|
for pos, teamRoleId in pairs(teamIds) do
|
|
|
|
|
local characterIdInTeam = XSmashBTeamManager.GetCharacterId(teamRoleId)
|
|
|
|
|
if characterIdInTeam == characterIdSelected and characterIdSelected ~= 0 then --若跟其他位置相同,则交换位置
|
|
|
|
|
-- 要交换的位置是援助位,拒绝
|
|
|
|
|
if XSmashBTeamManager.IsAssistance(pos, roleForceAssistIndex) then
|
|
|
|
|
XUiManager.TipMsg(XUiHelper.GetText("SuperSmashRoleHasSelected", pos))
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
-- 我是援助位,拒绝
|
|
|
|
|
if XSmashBTeamManager.IsAssistance(changePos, roleForceAssistIndex) then
|
|
|
|
|
XUiManager.TipMsg(XUiHelper.GetText("SuperSmashRoleHasSelected", pos))
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
teamIds[pos] = teamIds[changePos]
|
|
|
|
|
teamIds[changePos] = teamRoleId
|
|
|
|
|
switch = true
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not switch then
|
|
|
|
|
teamIds[changePos] = roleId
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
XDataCenter.SuperSmashBrosManager.SaveDefaultTeamByModeId(mode:GetId())
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XSmashBTeamManager.IsAssistance(index, roleForceAssistIndex)
|
|
|
|
|
return roleForceAssistIndex > 0 and index >= roleForceAssistIndex
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XSmashBTeamManager.GetCharacterId(id)
|
|
|
|
|
local characterId = XRobotManager.GetCharacterId(id)
|
|
|
|
|
-- 支援id 无法转换
|
|
|
|
|
if characterId == 0 then
|
|
|
|
|
characterId = id
|
|
|
|
|
end
|
|
|
|
|
return characterId
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
return XSmashBTeamManager
|