PGRData/Resources/Scripts/XUi/XUiAssign/XUiAssignRoomCharacter.lua
2022-12-26 14:06:01 +05:30

625 lines
No EOL
23 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local CSXTextManagerGetText = CS.XTextManager.GetText
local TabBtnIndex = {
Normal = 1,
Isomer = 2,
}
local CharacterTypeConvert = {
[TabBtnIndex.Normal] = XCharacterConfigs.CharacterType.Normal,
[TabBtnIndex.Isomer] = XCharacterConfigs.CharacterType.Isomer,
}
local TabBtnIndexConvert = {
[XCharacterConfigs.CharacterType.Normal] = TabBtnIndex.Normal,
[XCharacterConfigs.CharacterType.Isomer] = TabBtnIndex.Isomer,
}
local XUiAssignRoomCharacter = XLuaUiManager.Register(XLuaUi, "UiAssignRoomCharacter")
function XUiAssignRoomCharacter:OnAwake()
self:InitComponent()
self.GridIndex = {}
self.TagCacheDic = {}
self.SortFunction = {}
self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Default] = function(leftCharacter, rightCharacter)
local leftInTeam = self:IsInTeam(leftCharacter.Id)
local leftLevel = leftCharacter.Level
local leftQuality = leftCharacter.Quality
local leftPriority = XCharacterConfigs.GetCharacterPriority(leftCharacter.Id)
local rightInTeam = self:IsInTeam(rightCharacter.Id)
local rightLevel = rightCharacter.Level
local rightQuality = rightCharacter.Quality
local rightPriority = XCharacterConfigs.GetCharacterPriority(rightCharacter.Id)
if leftInTeam ~= rightInTeam then
return rightInTeam
end
if leftLevel ~= rightLevel then
return leftLevel > rightLevel
end
if leftQuality ~= rightQuality then
return leftQuality > rightQuality
end
return leftPriority < rightPriority
end
self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Quality] = function(leftCharacter, rightCharacter)
local leftQuality = leftCharacter.Quality
local rightQuality = rightCharacter.Quality
if leftQuality ~= rightQuality then
return leftQuality > rightQuality
end
return self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Default](leftCharacter, rightCharacter)
end
self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Level] = function(leftCharacter, rightCharacter)
local leftLevel = leftCharacter.Level
local rightLevel = rightCharacter.Level
if leftLevel ~= rightLevel then
return leftLevel > rightLevel
end
return self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Default](leftCharacter, rightCharacter)
end
self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Ability] = function(leftCharacter, rightCharacter)
local leftAbility = leftCharacter.Ability
local rightAbility = rightCharacter.Ability
if leftAbility ~= rightAbility then
return leftAbility > rightAbility
end
return self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Default](leftCharacter, rightCharacter)
end
end
-- teamCharIdMap, teamSelectPos, cb, canQuitCharIdMap, teamOrderCharIdMap, ablityRequire, curTeamOrder
function XUiAssignRoomCharacter:OnStart(teamCharIdMap, teamSelectPos, cb, teamOrderCharIdMap, canQuitCharIdMap, ablityRequire, curTeamOrder, characterLimitType, limitBuffId, teamId)
self.CharacterGrids = {}
self.TeamCharIdMap = teamCharIdMap
self.TeamSelectPos = teamSelectPos
self.TeamResultCb = cb
self.TeamOrderCharIdMap = teamOrderCharIdMap
self.CanQuitCharIdMap = canQuitCharIdMap
self.CurTeamOrder = curTeamOrder
self.CharacterLimitType = characterLimitType or XFubenConfigs.CharacterLimitType.All
self.LimitBuffId = limitBuffId
self.TeamId = teamId
self.TxtTeamInfoName.text = CS.XTextManager.GetText("AssignTeamTitle", self.CurTeamOrder) -- 作战梯队{0}
self.TxtRequireAbility.text = ablityRequire and ablityRequire or ""
self:InitRequireCharacterInfo()
self:InitCharacterTypeBtns()
end
function XUiAssignRoomCharacter:OnEnable()
CS.XGraphicManager.UseUiLightDir = true
self:UpdateInfo()
end
function XUiAssignRoomCharacter:OnDisable()
CS.XGraphicManager.UseUiLightDir = false
end
function XUiAssignRoomCharacter:InitRequireCharacterInfo()
local characterLimitType = self.CharacterLimitType
if not XFubenConfigs.IsStageCharacterLimitConfigExist(characterLimitType) then
self.PanelRequireCharacter.gameObject:SetActiveEx(false)
return
else
self.PanelRequireCharacter.gameObject:SetActiveEx(true)
end
local icon = XFubenConfigs.GetStageCharacterLimitImageTeamEdit(characterLimitType)
self.ImgRequireCharacter:SetSprite(icon)
end
function XUiAssignRoomCharacter:RefreshCharacterTypeTips()
local limitBuffId = self.LimitBuffId
local characterType = CharacterTypeConvert[self.SelectTabBtnIndex]
local characterLimitType = self.CharacterLimitType
local text = XFubenConfigs.GetStageCharacterLimitTextSelectCharacter(characterLimitType, characterType, limitBuffId)
self.TxtRequireCharacter.text = text
end
function XUiAssignRoomCharacter:ResetTeamData()
local teamId = self.TeamId
for k, characterId in pairs(self.TeamCharIdMap) do
if XDataCenter.FubenAssignManager.IsCharacterInTeamById(teamId, characterId) then
self.TeamCharIdMap[k] = 0
end
end
end
function XUiAssignRoomCharacter:InitCharacterTypeBtns()
self.BtnTabShougezhe.gameObject:SetActiveEx(not XFunctionManager.CheckFunctionFitter(XFunctionManager.FunctionName.Isomer))
local tabBtns = { self.BtnTabGouzaoti, self.BtnTabShougezhe }
self.PanelCharacterTypeBtns:Init(tabBtns, function(index) self:TrySelectCharacterType(index) end)
local characterLimitType = self.CharacterLimitType
local lockGouzaoti = characterLimitType == XFubenConfigs.CharacterLimitType.Isomer
local lockShougezhe = not XFunctionManager.JudgeOpen(XFunctionManager.FunctionName.Isomer) or characterLimitType == XFubenConfigs.CharacterLimitType.Normal
self.BtnTabGouzaoti:SetDisable(lockGouzaoti)
self.BtnTabShougezhe:SetDisable(lockShougezhe)
--检查选择角色类型是否和副本限制类型冲突
local characterType = XDataCenter.FubenManager.GetDefaultCharacterTypeByCharacterLimitType(self.CharacterLimitType)
local tempCharacterType = self:GetTeamCharacterType()
if tempCharacterType and not (tempCharacterType == XCharacterConfigs.CharacterType.Normal and lockGouzaoti
or tempCharacterType == XCharacterConfigs.CharacterType.Isomer and lockShougezhe) then
characterType = tempCharacterType
end
self.PanelCharacterTypeBtns:SelectIndex(TabBtnIndexConvert[characterType])
end
function XUiAssignRoomCharacter:TrySelectCharacterType(index)
local characterType = CharacterTypeConvert[index]
if characterType == XCharacterConfigs.CharacterType.Isomer and not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.Isomer) then return end
local characterLimitType = self.CharacterLimitType
if characterLimitType == XFubenConfigs.CharacterLimitType.Normal then
if characterType == XCharacterConfigs.CharacterType.Isomer then
XUiManager.TipText("TeamSelectCharacterTypeLimitTipNormal")
return
end
elseif characterLimitType == XFubenConfigs.CharacterLimitType.Isomer then
if characterType == XCharacterConfigs.CharacterType.Normal then
XUiManager.TipText("TeamSelectCharacterTypeLimitTipIsomer")
return
end
-- elseif characterLimitType == XFubenConfigs.CharacterLimitType.IsomerDebuff then
-- if characterType == XCharacterConfigs.CharacterType.Isomer then
-- local buffDes = XFubenConfigs.GetBuffDes(self.LimitBuffId)
-- local content = CSXTextManagerGetText("TeamSelectCharacterTypeLimitTipIsomerDebuff", buffDes)
-- local sureCallBack = function()
-- self:OnSelectCharacterType(index)
-- end
-- local closeCallback = function()
-- self.PanelCharacterTypeBtns:SelectIndex(TabBtnIndexConvert[XCharacterConfigs.CharacterType.Normal])
-- end
-- XUiManager.DialogTip(nil, content, XUiManager.DialogType.Normal, closeCallback, sureCallBack)
-- return
-- end
-- elseif characterLimitType == XFubenConfigs.CharacterLimitType.NormalDebuff then
-- if characterType == XCharacterConfigs.CharacterType.Normal then
-- local buffDes = XFubenConfigs.GetBuffDes(self.LimitBuffId)
-- local content = CSXTextManagerGetText("TeamSelectCharacterTypeLimitTipNormalDebuff", buffDes)
-- local sureCallBack = function()
-- self:OnSelectCharacterType(index)
-- end
-- local closeCallback = function()
-- self.PanelCharacterTypeBtns:SelectIndex(TabBtnIndexConvert[XCharacterConfigs.CharacterType.Isomer])
-- end
-- XUiManager.DialogTip(nil, content, XUiManager.DialogType.Normal, closeCallback, sureCallBack)
-- return
-- end
end
self:OnSelectCharacterType(index)
end
function XUiAssignRoomCharacter:OnSelectCharacterType(index)
if self.SelectTabBtnIndex == index then return end
self.SelectTabBtnIndex = index
XDataCenter.RoomCharFilterTipsManager.Reset()
local characterType = CharacterTypeConvert[index]
local tmpTeamIdDic = {}
for _, id in pairs(self.TeamCharIdMap) do
tmpTeamIdDic[id] = true
end
local charlist = XDataCenter.CharacterManager.GetAssignCharacterListInTeam(characterType, tmpTeamIdDic)
local teamCharIdMap = self.TeamCharIdMap
local teamSelectPos = self.TeamSelectPos
local selectId = teamCharIdMap[teamSelectPos]
table.sort(charlist,self.SortFunction[XRoomCharFilterTipsConfigs.EnumSortTag.Default])
self:RefreshCharacterTypeTips()
self:UpdateCharacterList(charlist, function(charDic)
if not selectId or selectId == 0
or not self.CharacterGrids[selectId]
or characterType ~= XCharacterConfigs.GetCharacterType(selectId)
or not charDic[selectId]
then
selectId = charlist[1].Id
end
self:SelectCharacter(selectId)
for _, id in pairs(teamCharIdMap) do
if id > 0 then
local grid = self.CharacterGrids[id]
if grid then
grid:SetInTeam(true)
end
end
end
end)
end
function XUiAssignRoomCharacter:IsInTeam(charId)
local tmpTeamIdDic = {}
for _, id in pairs(self.TeamCharIdMap) do
tmpTeamIdDic[id] = true
end
return tmpTeamIdDic[charId]
end
function XUiAssignRoomCharacter:CenterToGrid(grid)
-- local normalizedPosition
-- local count = self.SViewCharacterList.content.transform.childCount
-- local index = grid.Transform:GetSiblingIndex()
-- if index > count / 2 then
-- normalizedPosition = (index + 1) / count
-- else
-- normalizedPosition = (index - 1) / count
-- end
-- self.SViewCharacterList.verticalNormalizedPosition = math.max(0, math.min(1, (1 - normalizedPosition)))
end
function XUiAssignRoomCharacter:SelectCharacter(id)
local grid = self.CharacterGrids[id]
if grid then
self:CenterToGrid(grid)
end
local character = grid and grid.Character
self:UpdateInfo(character)
end
function XUiAssignRoomCharacter:SetPanelEmptyList(isEmpty)
self.BtnQuitTeam.gameObject:SetActiveEx(false)
self.BtnJoinTeam.gameObject:SetActiveEx(false)
self.BtnConsciousness.gameObject:SetActiveEx(not isEmpty)
self.BtnFashion.gameObject:SetActiveEx(not isEmpty)
self.BtnWeapon.gameObject:SetActiveEx(not isEmpty)
self.BtnPartner.gameObject:SetActiveEx(not isEmpty)
self.PanelRoleContent.gameObject:SetActiveEx(not isEmpty)
self.PanelRoleModel.gameObject:SetActiveEx(not isEmpty)
self.PanelEmptyList.gameObject:SetActiveEx(isEmpty)
end
function XUiAssignRoomCharacter:UpdateCharacterList(charList, cb)
if not next(charList) then
self:SetPanelEmptyList(true)
return
end
self:SetPanelEmptyList(false)
for _, item in pairs(self.CharacterGrids) do
item:Reset()
end
self.CharacterGrids = {}
local baseItem = self.GridCharacter
local count = #charList
local charDic = {}
for i = 1, count do
local char = charList[i]
local grid = self.GridIndex[i]
charDic[char.Id] = char
if not grid then
local item = CS.UnityEngine.Object.Instantiate(baseItem)
grid = XUiGridCharacter.New(item, self, char, function(character)
self:UpdateInfo(character)
end)
grid.GameObject.name = char.Id
grid.Transform:SetParent(self.PanelRoleContent, false)
self.GridIndex[i] = grid
else
grid.GameObject.name = char.Id
end
self.CharacterGrids[char.Id] = grid
grid:UpdateGrid(char)
grid.GameObject:SetActiveEx(true)
grid.Transform:SetAsLastSibling()
end
if cb then
cb(charDic)
end
end
function XUiAssignRoomCharacter:UpdateInfo(character)
if character then
self.CurCharacter = character
end
if not self.CurCharacter then return end
if self.CurCharacterGrid then
self.CurCharacterGrid:SetSelect(false)
end
self.CurCharacterGrid = self.CharacterGrids[self.CurCharacter.Id]
self.CurCharacterGrid:UpdateGrid()
self.CurCharacterGrid:SetSelect(true)
self:UpdateTeamBtn()
self:UpdateRoleModel()
end
function XUiAssignRoomCharacter:UpdateTeamBtn()
if not (self.TeamCharIdMap and next(self.TeamCharIdMap)) then
return
end
self.BtnQuitTeam.gameObject:SetActiveEx(false)
self.BtnJoinTeam.gameObject:SetActiveEx(false)
-- 等待模型加载后设置按钮状态
local isInTeam = self.TeamOrderCharIdMap[self.CurCharacter.Id]
local isCanQuit = self.CanQuitCharIdMap[self.CurCharacter.Id]
self.IsShowQuitTeamBtn = isInTeam and isCanQuit
self.IsShowJoinTeamBtn = not isInTeam or not isCanQuit
end
function XUiAssignRoomCharacter:UpdateRoleModel()
local characterId = self.CurCharacter and self.CurCharacter.Id
if not characterId then return end
local targetPanelRole = self.PanelRoleModel
local targetUiName = self.Name
local func = function()
self.BtnJoinTeam.gameObject:SetActiveEx(self.IsShowJoinTeamBtn)
self.BtnQuitTeam.gameObject:SetActiveEx(self.IsShowQuitTeamBtn)
end
local charaterFunc = function(model)
if not model then
return
end
self.PanelDrag.Target = model.transform
if self.SelectTabBtnIndex == TabBtnIndex.Normal then
self.ImgEffectHuanren.gameObject:SetActiveEx(true)
elseif self.SelectTabBtnIndex == TabBtnIndex.Isomer then
self.ImgEffectHuanren1.gameObject:SetActiveEx(true)
end
end
self.ImgEffectHuanren.gameObject:SetActiveEx(false)
self.ImgEffectHuanren1.gameObject:SetActiveEx(false)
self.RoleModelPanel:UpdateCharacterModel(characterId, targetPanelRole, targetUiName, charaterFunc, func)
end
function XUiAssignRoomCharacter:InitComponent()
local root = self.UiModelGo.transform
self.PanelRoleModel = root:FindTransform("PanelRoleModel")
self.ImgEffectHuanren = root:FindTransform("ImgEffectHuanren")
self.ImgEffectHuanren1 = root:FindTransform("ImgEffectHuanren1")
self.RoleModelPanel = XUiPanelRoleModel.New(self.PanelRoleModel, self.Name, nil, true)
self.AssetPanel = XUiPanelAsset.New(self, self.PanelAsset, XDataCenter.ItemManager.ItemId.FreeGem, XDataCenter.ItemManager.ItemId.ActionPoint, XDataCenter.ItemManager.ItemId.Coin)
self.GridCharacter.gameObject:SetActiveEx(false)
self:RegisterClickEvent(self.BtnBack, self.OnBtnBackClick)
self:RegisterClickEvent(self.BtnJoinTeam, self.OnBtnJoinTeamClick)
self:RegisterClickEvent(self.BtnConsciousness, self.OnBtnConsciousnessClick)
self:RegisterClickEvent(self.BtnQuitTeam, self.OnBtnQuitTeamClick)
self:RegisterClickEvent(self.BtnFashion, self.OnBtnFashionClick)
self:RegisterClickEvent(self.BtnWeapon, self.OnBtnWeaponClick)
self:RegisterClickEvent(self.BtnMainUi, self.OnBtnMainUiClick)
self:RegisterClickEvent(self.BtnPartner, self.OnBtnPartnerClick)
self.BtnFilter.CallBack = function()
self:OnBtnFilterClick()
end
end
function XUiAssignRoomCharacter:OnBtnWeaponClick()
XLuaUiManager.Open("UiEquipReplaceNew", self.CurCharacter.Id, nil, true)
end
function XUiAssignRoomCharacter:OnBtnConsciousnessClick()
XLuaUiManager.Open("UiEquipAwarenessReplace", self.CurCharacter.Id, nil, true)
end
function XUiAssignRoomCharacter:OnBtnMainUiClick()
XLuaUiManager.RunMain()
end
function XUiAssignRoomCharacter:OnBtnPartnerClick()
XDataCenter.PartnerManager.GoPartnerCarry(self.CurCharacter.Id, false)
end
function XUiAssignRoomCharacter:OnBtnBackClick()
if self.TeamResultCb then
self.TeamResultCb(self.TeamCharIdMap)
end
self:Close()
end
function XUiAssignRoomCharacter:OnBtnJoinTeamClick()
local selectId = self.CurCharacter.Id
local joinFunc = function(isReset)
local newTeamCharIdMap = self:GetNewTeamCharIdMap()
-- 修改的角色id
local fromCharacterId = newTeamCharIdMap[self.TeamSelectPos]
-- 将要下队
if not fromCharacterId or fromCharacterId == 0 then
self:OnJoinTeam(isReset)
return
end
local oldOrder = self.TeamOrderCharIdMap[fromCharacterId]
-- 不在其他梯队
if not oldOrder then
self:OnJoinTeam(isReset)
return
end
local newOrder = self.CurTeamOrder
local title = CS.XTextManager.GetText("AssignDeployTipTitle")
local characterName = XCharacterConfigs.GetCharacterName(fromCharacterId)
local oldTeamName = CS.XTextManager.GetText("AssignTeamTitle", oldOrder) -- 作战梯队1
local newTeamName = CS.XTextManager.GetText("AssignTeamTitle", newOrder)
local content = CS.XTextManager.GetText("AssignDeployTipContent", characterName, oldTeamName, newTeamName)
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, function()
self:OnJoinTeam(isReset)
end)
end
-- 角色类型不一致拦截
local inTeamCharacterType = self:GetTeamCharacterType()
if inTeamCharacterType then
local characterType = selectId and selectId ~= 0 and XCharacterConfigs.GetCharacterType(selectId)
if characterType and characterType ~= inTeamCharacterType then
local content = CSXTextManagerGetText("TeamCharacterTypeNotSame")
local sureCallBack = function()
local isReset = true
joinFunc(isReset)
end
XUiManager.DialogTip(nil, content, XUiManager.DialogType.Normal, nil, sureCallBack)
return
end
end
joinFunc()
end
function XUiAssignRoomCharacter:GetNewTeamCharIdMap()
local newTeamCharIdMap = XTool.Clone(self.TeamCharIdMap)
local fromCharacterId = self.CurCharacter.Id
local toCharacterId = newTeamCharIdMap[self.TeamSelectPos] or 0
-- 换人
for pos, id in pairs(self.TeamCharIdMap) do
if id == fromCharacterId then
newTeamCharIdMap[pos] = toCharacterId
break
end
end
newTeamCharIdMap[self.TeamSelectPos] = fromCharacterId
return newTeamCharIdMap
end
function XUiAssignRoomCharacter:OnJoinTeam(isReset)
self.TeamCharIdMap = self:GetNewTeamCharIdMap()
if isReset then
self:ResetTeamData()
end
if self.TeamResultCb then
self.TeamResultCb(self.TeamCharIdMap)
end
self:Close()
end
function XUiAssignRoomCharacter:OnBtnQuitTeamClick()
local count = 0
for _, v in pairs(self.TeamCharIdMap) do
if v > 0 then
count = count + 1
end
end
local id = self.CurCharacter.Id
for k, v in pairs(self.TeamCharIdMap) do
if v == id then
self.TeamCharIdMap[k] = 0
break
end
end
if self.TeamResultCb then
self.TeamResultCb(self.TeamCharIdMap)
end
self:Close()
end
function XUiAssignRoomCharacter:OnBtnFashionClick()
XLuaUiManager.Open("UiFashion", self.CurCharacter.Id)
end
function XUiAssignRoomCharacter:OnBtnFilterClick()
local characterType = CharacterTypeConvert[self.SelectTabBtnIndex]
XLuaUiManager.Open("UiRoomCharacterFilterTips",
self,
XRoomCharFilterTipsConfigs.EnumFilterType.Assign,
XRoomCharFilterTipsConfigs.EnumSortType.Assign,
characterType)
end
function XUiAssignRoomCharacter:GetTeamCharacterType()
local teamId = self.TeamId
return XDataCenter.FubenAssignManager.GetTeamCharacterType(teamId)
end
function XUiAssignRoomCharacter:Filter(selectTagGroupDic, sortTagId, isThereFilterDataCb)
local judgeCb = function(groupId, tagValue, character)
local detailConfig = XCharacterConfigs.GetCharDetailTemplate(character.Id)
local compareValue
if groupId == XRoomCharFilterTipsConfigs.EnumFilterTagGroup.Career then
compareValue = detailConfig.Career
if compareValue == tagValue then
-- 当前角色满足该标签
return true
end
elseif groupId == XRoomCharFilterTipsConfigs.EnumFilterTagGroup.Element then
compareValue = detailConfig.ObtainElementList
for _, element in pairs(compareValue) do
if element == tagValue then
-- 当前角色满足该标签
return true
end
end
else
XLog.Error(string.format("XUiBfrtRoomCharacter:Filter函数错误没有处理排序组%s的逻辑", groupId))
return
end
end
local allChar = XDataCenter.CharacterManager.GetOwnCharacterList(CharacterTypeConvert[self.SelectTabBtnIndex])
XDataCenter.RoomCharFilterTipsManager.Filter(self.TagCacheDic, selectTagGroupDic, allChar, judgeCb,
function(filteredData)
self:FilterRefresh(filteredData, sortTagId)
end,
isThereFilterDataCb)
end
function XUiAssignRoomCharacter:FilterRefresh(filteredData, sortTagId)
if self.SortFunction[sortTagId] then
table.sort(filteredData, self.SortFunction[sortTagId])
else
XLog.Error(string.format("XUiBfrtRoomCharacter:FilterRefresh函数错误没有定义标签%s的排序函数", sortTagId))
return
end
local characterType = CharacterTypeConvert[self.SelectTabBtnIndex]
local teamCharIdMap = self.TeamCharIdMap
local teamSelectPos = self.TeamSelectPos
local selectId = teamCharIdMap[teamSelectPos]
self:RefreshCharacterTypeTips()
self:UpdateCharacterList(filteredData, function(charDic)
if not selectId or selectId == 0
or not self.CharacterGrids[selectId]
or characterType ~= XCharacterConfigs.GetCharacterType(selectId)
or not charDic[selectId]
then
selectId = filteredData[1].Id
end
self:SelectCharacter(selectId)
for _, id in pairs(teamCharIdMap) do
if id > 0 then
local grid = self.CharacterGrids[id]
if grid then
grid:SetInTeam(true)
end
end
end
end)
end