PGRData/Script/matrix/xentity/xsupersmashbros/XSmashBTeamManager.lua

334 lines
13 KiB
Lua
Raw Normal View History

--===========================
--超限乱斗玩家队伍管理器
--模块负责:吕天元
--===========================
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
return data
end
local newData = {
FirstFightPos = 1,
CaptainPos = 1,
Color = {},
2024-09-01 20:49:41 +00:00
RoleIds = {},
Assistance = {},-- 支援角色位
}
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() -- 我方支援的开始下标
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
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 = {}, -- 支援角色位
}
2024-09-01 20:49:41 +00:00
---@type XSmashBMode
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()
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
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
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
return XSmashBTeamManager