--- 占领副本管理器 XFubenAssignManagerCreator = function() local XFubenAssignManager = {} -- 协议 local METHOD_NAME = { AssignGetDataRequest = "AssignGetDataRequest", AssignSetTeamRequest = "AssignSetTeamRequest", AssignSetCharacterRequest = "AssignSetCharacterRequest", AssignGetRewardRequest = "AssignGetRewardRequest", } -- 常量 XFubenAssignManager.MaxSelectConditionNum = 4 XFubenAssignManager.SelectConditionColor = {[true] = CS.UnityEngine.Color.black, [false] = CS.UnityEngine.Color.gray } XFubenAssignManager.MemberColor = { "FF1111FF", -- red "4F99FFFF", -- blue "F9CB35FF", -- yellow } XFubenAssignManager.FomationAnimFinishDelay = 400 -- 特效显示时间 XFubenAssignManager.FormationState = { Effect = 1, Reset = 2 } local CHARACTERTYPE_ALL = 0 local SKILLTYPE_BITS = 1000 local KeyAccountEnterAssign = "Assign" -- ui操作所缓存的数据 XFubenAssignManager.SelectChapterId = nil XFubenAssignManager.SelectGroupId = nil XFubenAssignManager.SelectCharacterId = nil XFubenAssignManager.OccupyFirstSelectTeamId = nil XFubenAssignManager.OccupyFirstSelectOrder = nil XFubenAssignManager.OccupySecondSelectTeamId = nil XFubenAssignManager.OccupySecondSelectOrder = nil XFubenAssignManager.CAPTIAN_MEMBER_INDEX = 1 -- 队长位置 XFubenAssignManager.FIRSTFIGHT_MEMBER_INDEX = 1 -- 首发位置 local MEMBER_MAX_COUNT = 3 -- 队伍最大成员数 local ChapterIdList = nil local ChapterDataDict = nil -- 章节 local GroupDataDict = nil -- 关卡组 local TeamDataDict = nil -- 队伍 ------ 战斗接口用的数据 local FinishFightCb = nil local CloseLoadingCb = nil -- local MEMBER_INDEX_BY_ORDER = {[1] = 2, [2] = 1, [3] = 3} -- 面板上显示的位置(order) = 队伍中实际中的位置(index) local MEMBER_ORDER_BY_INDEX = {[1] = 2, [2] = 1, [3] = 3 } -- 队伍中实际中的位置(index) = 面板上显示的位置(order) local GroupIdByStageId = nil -- {[stageId] = groupId, ...} local FollowGroupDict = nil -- {[前置组id] = {后置组id, ...}, ...} function XFubenAssignManager.Init() end function XFubenAssignManager.ClearData() XFubenAssignManager.SelectChapterId = nil XFubenAssignManager.SelectGroupId = nil XFubenAssignManager.SelectCharacterId = nil XFubenAssignManager.OccupyFirstSelectTeamId = nil XFubenAssignManager.OccupyFirstSelectOrder = nil XFubenAssignManager.OccupySecondSelectTeamId = nil XFubenAssignManager.OccupySecondSelectOrder = nil ChapterIdList = nil ChapterDataDict = nil -- 章节 GroupDataDict = nil -- 关卡组 TeamDataDict = nil -- 队伍 FollowGroupDict = nil end ----------- 章节数据 begin----------- local ChapterData = XClass(nil, "ChapterData") function ChapterData:Ctor(id) self.Id = id self.CharacterId = nil -- 驻守角色 self.Rewarded = false -- 已领奖 self.IsPassByServer = nil -- 服务器已通关标记 end function ChapterData:GetCfg() return XFubenAssignConfigs.GetChapterTemplateById(self.Id) end function ChapterData:GetId() return self.Id end function ChapterData:GetName() return self:GetCfg().ChapterName end function ChapterData:GetDesc() return self:GetCfg().ChapterEn end function ChapterData:GetOrderId() return self:GetCfg().OrderId end function ChapterData:GetIcon() return self:GetCfg().Cover end function ChapterData:GetSkillPlusId() return self:GetCfg().SkillPlusId end function ChapterData:GetAssignCondition() return self:GetCfg().AssignCondition end function ChapterData:GetSelectCharCondition() return self:GetCfg().SelectCharCondition end function ChapterData:GetRewardId() return self:GetCfg().RewardId end function ChapterData:GetGroupId() return self:GetCfg().GroupId end -- 获得所有加成效果的key function ChapterData:GetBuffKeys() if not self.BuffKeys then self.BuffKeys = {} local buffConfigId = self:GetSkillPlusId() if buffConfigId and buffConfigId ~= 0 then local plusConfig = XCharacterConfigs.GetSkillTypePlusTemplate(buffConfigId) if plusConfig then local key local isAllMember = (#plusConfig.CharacterType == #XCharacterConfigs.GetAllCharacterCareerIds()) if isAllMember then local characterType = CHARACTERTYPE_ALL for _, skillType in ipairs(plusConfig.SkillType) do key = characterType * SKILLTYPE_BITS + skillType table.insert(self.BuffKeys, key) end else for _, characterType in ipairs(plusConfig.CharacterType) do for _, skillType in ipairs(plusConfig.SkillType) do key = characterType * SKILLTYPE_BITS + skillType table.insert(self.BuffKeys, key) end end end end end self.BuffKeys = XFubenAssignManager.SortKeys(self.BuffKeys) end return self.BuffKeys end function ChapterData:GetBuffDescList() return XFubenAssignManager.GetBuffDescListByKeys(self:GetBuffKeys()) end function ChapterData:IsCharConditionMatch(characterId) local isMatch = true local conditions = self:GetSelectCharCondition() for _, conditionId in ipairs(conditions) do if not (XConditionManager.CheckCondition(conditionId, characterId)) then isMatch = false break end end return isMatch end function ChapterData:GetProgressStr() local groupNum = #self:GetGroupId() return math.floor((self:GetPassNum() / groupNum) * 100) .. "%" end function ChapterData:GetCharacterBodyIcon() return XDataCenter.CharacterManager.GetCharHalfBodyImage(self.CharacterId) end function ChapterData:IsRewarded() return self.Rewarded end function ChapterData:CanReward() return (self:IsPass() and not self:IsRewarded()) end function ChapterData:IsUnlock() for _, groupId in ipairs(self:GetGroupId()) do local groupData = XFubenAssignManager.GetGroupDataById(groupId) if groupData and groupData:IsUnlock() then return true end end return false end function ChapterData:CanAssign() return self:IsPass() and self:IsMatchAssignCondition() end -- server api function ChapterData:SetRewarded(state) self.Rewarded = state end function ChapterData:GetPassNum() local passNum = 0 for _, groupId in ipairs(self:GetGroupId()) do local groupData = XFubenAssignManager.GetGroupDataById(groupId) if groupData and groupData:IsPass() then passNum = passNum + 1 end end return passNum end function ChapterData:SetIsPassByServer(value) self.IsPassByServer = value end function ChapterData:IsPass() if self.IsPassByServer then return true end local groupNum = #self:GetGroupId() return (self:GetPassNum() >= groupNum) end function ChapterData:IsMatchAssignCondition() for _, conditionId in ipairs(self:GetAssignCondition()) do if not (XConditionManager.CheckCondition(conditionId)) then return false end end return true end function ChapterData:SetCharacterId(characterId) self.CharacterId = characterId end function ChapterData:IsOccupy() return (self.CharacterId and self.CharacterId ~= 0) end function ChapterData:GetCharacterId() return self.CharacterId end function ChapterData:GetOccupyCharacterIcon() return XDataCenter.CharacterManager.GetCharBigRoundnessNotItemHeadIcon(self:GetCharacterId()) end function ChapterData:GetOccupyCharacterName() return XCharacterConfigs.GetCharacterFullNameStr(self:GetCharacterId()) end -- 是否当前进度章节 function XFubenAssignManager.IsCurrentChapter(chapterId) local passNum = XFubenAssignManager.GetAllChapterPassNum() local targetIndex = 0 for i, id in ipairs(XFubenAssignManager.GetChapterIdList()) do if chapterId == id then targetIndex = i break end end if targetIndex == 0 then XLog.Debug("XFubenAssignManager.IsCurrentChapter参数传入了无效的chapterId: " .. tostring(chapterId)) end return (targetIndex == passNum + 1) end function XFubenAssignManager.GetAllChapterPassNum() local passNum = 0 for _, chapterId in ipairs(XFubenAssignManager.GetChapterIdList()) do local chapterData = XFubenAssignManager.GetChapterDataById(chapterId) if chapterData:IsPass() then passNum = passNum + 1 end end return passNum end function XFubenAssignManager.GetCharacterOccupyChapterId(characterId) if characterId and characterId ~= 0 then for _, chapterId in ipairs(XFubenAssignManager.GetChapterIdList()) do local chapterData = XFubenAssignManager.GetChapterDataById(chapterId) if chapterData:GetCharacterId() == characterId then return chapterId end end end return nil end function XFubenAssignManager.GetChapterIdList() if not ChapterIdList then ChapterIdList = {} for id, _ in pairs(XFubenAssignConfigs.GetChapterTemplates()) do table.insert(ChapterIdList, id) end table.sort(ChapterIdList, function(a, b) return a < b end) end return ChapterIdList end function XFubenAssignManager.GetUnlockChapterIdList() local idList = {} local data for _, id in ipairs(XFubenAssignManager.GetChapterIdList()) do data = XFubenAssignManager.GetChapterDataById(id) if data:IsUnlock() then table.insert(idList, id) end end return idList end -- 角色是否已在占领 function XFubenAssignManager.CheckCharacterInOccupy(characterId) local chapterData for _, id in ipairs(XFubenAssignManager.GetChapterIdList()) do chapterData = XFubenAssignManager.GetChapterDataById(id) if chapterData:GetCharacterId() == characterId then return true end end return false end function XFubenAssignManager.GetChapterDataById(id) if not id then XLog.Error("XFubenAssignManager.GetChapterDataById函数参数id不能为空" .. tostring(id)) return end if not ChapterDataDict then ChapterDataDict = {} end if not ChapterDataDict[id] then ChapterDataDict[id] = ChapterData.New(id) end return ChapterDataDict[id] end function XFubenAssignManager.GetCurrentChapterData() local idList = XFubenAssignManager.GetChapterIdList() for _, chapterId in ipairs(idList) do local chapterData = XFubenAssignManager.GetChapterDataById(chapterId) if not chapterData:IsPass() then return chapterData end end return XFubenAssignManager.GetChapterDataById(idList[#idList]) end function XFubenAssignManager.GetChapterProgressTxt() local chapterData = XFubenAssignManager.GetCurrentChapterData() return CS.XTextManager.GetText("AssignChapterProgressTxt", chapterData:GetDesc()) end ----------- 章节数据 end----------- ----------- 关卡组数据 begin----------- local GroupData = XClass(nil, "GroupData") function GroupData:Ctor(id) self.Id = id self.FightCount = 0 self.GroupRebootCount = 0 self.IsPerfect = false end function GroupData:GetCfg() return XFubenAssignConfigs.GetGroupTemplateById(self.Id) end function GroupData:GetId() return self.Id end function GroupData:GetPreGroupId() return self:GetCfg().PreGroupId end -- function GroupData:GetMaxFightCount() return self:GetCfg().ChallengeNum end function GroupData:GetTeamInfoId() return self:GetCfg().TeamInfoId end function GroupData:GetBaseStageId() return self:GetCfg().BaseStage end function GroupData:GetStageId() return self:GetCfg().StageId end function GroupData:GetName() return self:GetCfg().Name end function GroupData:GetIcon() return self:GetCfg().Icon end function GroupData:IsUnlock() if self:GetFightCount() > 0 then return true end local preGroupId = self:GetPreGroupId() return ((not preGroupId or preGroupId == 0) or XFubenAssignManager.GetGroupDataById(preGroupId):IsPass()) end -- 刷新关卡解锁信息 function GroupData:SyncStageInfo(isPass) local isUnlock = self:IsUnlock() for _, stageId in ipairs(self:GetStageId()) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) stageInfo.Unlock = isUnlock if isPass ~= nil then stageInfo.Passed = isPass end end local baseStageId = self:GetBaseStageId() local baseStageInfo = XDataCenter.FubenManager.GetStageInfo(baseStageId) baseStageInfo.Unlock = isUnlock if isPass ~= nil then baseStageInfo.Passed = isPass end if isUnlock then XFubenAssignManager.UnlockFollowGroupStage(self:GetId()) end end -- server api function GroupData:SetFightCount(count) count = count or 0 local oldCount = self.FightCount self.FightCount = count if (not oldCount or oldCount == 0) and (count > 0) then -- 新解锁 self:SyncStageInfo(true) end end function GroupData:GetFightCount() -- do return 1 end -- for testing return self.FightCount end function GroupData:SetIsPerfect(isPerfect) self.IsPerfect = isPerfect end function GroupData:GetIsPerfect() return self.IsPerfect end function GroupData:SetGroupRebootCountAdd( rebootCount ) self.GroupRebootCount = self.GroupRebootCount + rebootCount end function GroupData:GetGroupRebootCount() return self.GroupRebootCount end function GroupData:ResetGroupRebootCount() self.GroupRebootCount = 0 end function GroupData:IsPass() if self:GetFightCount() > 0 then return true end return false -- -- 根据StageInfo来 来源于XFubenManager.InitFubenData -- local stageInfo = XDataCenter.FubenManager.GetStageInfo(self:GetBaseStageId()) -- return (stageInfo and stageInfo.Passed) end function XFubenAssignManager.GetGroupDataById(id) if not GroupDataDict then GroupDataDict = {} end if not GroupDataDict[id] then GroupDataDict[id] = GroupData.New(id) end return GroupDataDict[id] end ----------- 关卡组数据 end----------- ----------- 队伍数据 begin----------- ------- 队员数据 local MemberData = XClass(nil, "MemberData") function MemberData:Ctor(index) self.Index = index -- 队伍位置 self.CharacterId = nil end function MemberData:GetIndex() return self.Index end function MemberData:GetCharacterId() return self.CharacterId or 0 end function MemberData:HasCharacter() return (self.CharacterId and self.CharacterId ~= 0) end function MemberData:SetCharacterId(characterId) self.CharacterId = characterId end function MemberData:GetCharacterAbility() return self:HasCharacter() and XDataCenter.CharacterManager.GetCharacterAbilityById(self.CharacterId) or 0 end function MemberData:GetCharacterSkillInfo() return self:HasCharacter() and XDataCenter.CharacterManager.GetCaptainSkillInfo(self.CharacterId) or nil end function MemberData:GetCharacterType() return self:HasCharacter() and XCharacterConfigs.GetCharacterType(self.CharacterId) end -------队伍数据 local TeamData = XClass(nil, "TeamData") function TeamData:Ctor(id) self.Id = id self.MemberList = nil self.LeaderIndex = nil self.FirstFightIndex = nil end function TeamData:GetCfg() return XFubenAssignConfigs.GetTeamInfoTemplateById(self.Id) end function TeamData:GetId() return self.Id end function TeamData:GetBuffId() return self:GetCfg().BuffId end function TeamData:GetNeedCharacter() return self:GetCfg().NeedCharacter end function TeamData:GetRequireAbility() return self:GetCfg().RequireAbility end function TeamData:GetCondition() return self:GetCfg().Condition end function TeamData:GetDesc() return self:GetCfg().Desc end function TeamData:CheckIsInTeam(characterId) for _, member in ipairs(self:GetMemberList() or {}) do local id = member:GetCharacterId() if id > 0 and id == characterId then return true end end return false end function TeamData:GetMemberList() if not self.MemberList then self.MemberList = {} local count = self:GetNeedCharacter() for i = 1, count do self.MemberList[i] = MemberData.New(i) -- 队伍位置 end if count > 1 then -- 若是多人队伍则队长居中, 即队员索引为{2, 1, 3} self.MemberList[1], self.MemberList[2] = self.MemberList[2], self.MemberList[1] end end return self.MemberList end function TeamData:ClearMemberList() if not self.MemberList then return end for _, memberData in pairs(self.MemberList) do memberData:SetCharacterId(0) end end function TeamData:GetCharacterType() if not self.MemberList then return end for _, memberData in pairs(self.MemberList) do if memberData:HasCharacter() then return memberData:GetCharacterType() end end end function TeamData:GetMember(index) for _, member in ipairs(self:GetMemberList()) do if member:GetIndex() == index then return member end end XLog.Error("TeamData:GetMember函数无效参数index: " .. tostring(index)) return nil end function TeamData:SetLeaderIndex(index) self.LeaderIndex = index end function TeamData:GetLeaderIndex() return self.LeaderIndex or XFubenAssignManager.CAPTIAN_MEMBER_INDEX end function TeamData:SetFirstFightIndex(index) self.FirstFightIndex = index end ---========================================== --- 得到队伍首发位 --- 当首发位不为空时,直接返回首发位 --- 不然查看队长位是否为空,不为空则返回队长位 ---(因为服务器在之前只有队长位,后面区分了队长位与首发位,存在有队长位数据,没有首发位数据的情况) --- 如果队长位也为空,则返回默认首发位 ---@return number ---========================================== function TeamData:GetFirstFightIndex() return self.FirstFightIndex or self.LeaderIndex or XFubenAssignManager.FIRSTFIGHT_MEMBER_INDEX end function TeamData:GetLeaderSkillDesc() local memberData = self:GetMember(self:GetLeaderIndex()) if memberData then local captianSkillInfo = memberData:GetCharacterSkillInfo() if captianSkillInfo then return captianSkillInfo.Level > 0 and captianSkillInfo.Intro or string.format("%s%s", captianSkillInfo.Intro, CS.XTextManager.GetText("CaptainSkillLock")) end end return "" end function TeamData:IsEnoughAbility() local memberList = self:GetMemberList() local need = self:GetRequireAbility() for _, member in pairs(memberList) do if member:GetCharacterAbility() > need then return true end end return false end function TeamData:SetMember(order, characterId) self:GetMemberList()[order]:SetCharacterId(characterId) end -- 获得角色在队伍中的排序 function TeamData:GetCharacterOrder(characterId) for order, v in pairs(self:GetMemberList()) do if v:GetCharacterId() == characterId then return order end end return nil end -- server api function TeamData:SetMemberList(characterIdList) if characterIdList then local memberList = self:GetMemberList() local memberCount = #memberList for index, v in pairs(memberList) do local order = XFubenAssignManager.GetMemberOrderByIndex(index, memberCount) v:SetCharacterId(characterIdList[order]) end else for _, v in pairs(self:GetMemberList()) do v:SetCharacterId(nil) end end end -- 角色是否已在队伍中 function XFubenAssignManager.CheckCharacterInTeam(characterId) for _, teamData in pairs(TeamDataDict) do if teamData:GetCharacterOrder(characterId) ~= nil then return true end end return false end -- 获取其他队伍的角色 function XFubenAssignManager.GetOtherTeamCharacters(groupId, srcTeamId) local otherTeamCharacters = {} for _, teamId in pairs(GroupDataDict[groupId]:GetTeamInfoId()) do if teamId ~= srcTeamId and TeamDataDict[teamId] then for i, member in ipairs(TeamDataDict[teamId]:GetMemberList()) do local characterId = member:GetCharacterId() if characterId and characterId ~= 0 then table.insert(otherTeamCharacters, { teamId, i, characterId }) end end end end return otherTeamCharacters end -- 获取某组里 角色对应的队伍编号 function XFubenAssignManager.GetCharacterTeamOderMapByGroup(groupId) local teamOrderMap = {} local teamIdMap = {} for i, teamId in pairs(GroupDataDict[groupId]:GetTeamInfoId()) do local teamData = XFubenAssignManager.GetTeamDataById(teamId) for _, memberData in ipairs(teamData:GetMemberList()) do if memberData:HasCharacter() then teamIdMap[memberData:GetCharacterId()] = teamId teamOrderMap[memberData:GetCharacterId()] = i end end end return teamIdMap, teamOrderMap end function XFubenAssignManager.SetTeamMember(teamId, targetOrder, characterId) local targetTeamData = XFubenAssignManager.GetTeamDataById(teamId) -- -- 检查所有队伍并清除该characterId -- local order = nil -- for k, teamData in pairs(TeamDataDict) do -- order = teamData:GetCharacterOrder(characterId) -- if order ~= nil then -- teamData:SetMember(order, nil) -- break -- end -- end targetTeamData:SetMember(targetOrder, characterId) end function XFubenAssignManager.GetTeamDataById(id) if not TeamDataDict then TeamDataDict = {} end if not TeamDataDict[id] then TeamDataDict[id] = TeamData.New(id) end return TeamDataDict[id] end function XFubenAssignManager.GetTeamCharacterType(teamId) local teamData = XFubenAssignManager.GetTeamDataById(teamId) return teamData:GetCharacterType() end function XFubenAssignManager.IsCharacterInTeamById(teamId, characterId) local teamData = XFubenAssignManager.GetTeamDataById(teamId) return teamData:GetCharacterOrder(characterId) ~= nil end function XFubenAssignManager.GetGroupMemberCount(groupId) local count = 0 for _, teamId in pairs(GroupDataDict[groupId]:GetTeamInfoId()) do for _, member in ipairs(XFubenAssignManager.GetTeamDataById(teamId):GetMemberList()) do if member:HasCharacter() then count = count + 1 end end end return count end -- 一键上阵 function XFubenAssignManager.AutoTeam(groupId) local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList() table.sort(ownCharacters, function(a, b) return a.Ability > b.Ability end) -- 保留当前角色 -- local curCharacters = XFubenAssignManager.GetOtherTeamCharacters(groupId, nil) local count = 1 local maxCount = #ownCharacters for _, teamId in pairs(GroupDataDict[groupId]:GetTeamInfoId()) do if count > maxCount then break end local teamData = XFubenAssignManager.GetTeamDataById(teamId) local needCount = teamData:GetNeedCharacter() for index = 1, needCount do local order = XFubenAssignManager.GetMemberOrderByIndex(index, needCount) local targetTeamData = XFubenAssignManager.GetTeamDataById(teamId) local stageId = teamId local characterLimitType = XFubenConfigs.GetStageCharacterLimitType(teamId) local defaultCharacterType = XDataCenter.FubenManager.GetDefaultCharacterTypeByCharacterLimitType(characterLimitType) local i for charIndex, char in ipairs(ownCharacters) do local charType = XCharacterConfigs.GetCharacterType(char.Id) if defaultCharacterType ~= XFubenConfigs.CharacterLimitType.All and defaultCharacterType ~= charType then goto CONTINUE end XFubenAssignManager.SetTeamMember(teamId, order, char.Id) i = charIndex break :: CONTINUE :: end if i then table.remove(ownCharacters, i) end end end end -- 是否满足关卡所需战力 function XFubenAssignManager.IsAbilityMatch(targetStageId, charIdList) local groupId = XFubenAssignManager.GetGroupIdByStageId(targetStageId) local groupData = XFubenAssignManager.GetGroupDataById(groupId) local isMatch = false local teamIdList = groupData:GetTeamInfoId() for i, stageId in pairs(groupData:GetStageId()) do if stageId == targetStageId then isMatch = true local teamId = teamIdList[i] local teamData = XFubenAssignManager.GetTeamDataById(teamId) for order = 1, teamData:GetNeedCharacter() do local characterId = charIdList[order] local character = XDataCenter.CharacterManager.GetCharacter(characterId) if character.Ability < teamData:GetRequireAbility() then isMatch = false break end end break end end return isMatch end ----------- 队伍数据 end----------- ----------- 战斗接口 begin----------- function XFubenAssignManager.SetCloseLoadingCb(cb) CloseLoadingCb = cb end function XFubenAssignManager.SetFinishFightCb(cb) FinishFightCb = cb end -- function XFubenAssignManager.GetMemberIndexByOrder(order) -- return MEMBER_INDEX_BY_ORDER[order] -- end function XFubenAssignManager.GetMemberOrderByIndex(index, maxCount) return maxCount > 1 and MEMBER_ORDER_BY_INDEX[index] or index end function XFubenAssignManager.GetGroupIdByStageId(stageId) if not GroupIdByStageId then GroupIdByStageId = {} local GroupTemplates = XFubenAssignConfigs.GetGroupTemplates() local groupData for groupId, _ in pairs(GroupTemplates) do groupData = XFubenAssignManager.GetGroupDataById(groupId) for _, id in ipairs(groupData:GetStageId()) do GroupIdByStageId[id] = groupId end end end return GroupIdByStageId[stageId] end function XFubenAssignManager.CheckIsGroupLastStage(stageId) local groupId = XFubenAssignManager.GetGroupIdByStageId(stageId) local groupData = XFubenAssignManager.GetGroupDataById(groupId) local stageIdList = groupData:GetStageId() return (stageIdList[#stageIdList] == stageId) end ------ 以下是在FubenManager注册的函数 function XFubenAssignManager.InitStageInfo() local stageType = XDataCenter.FubenManager.StageType.Assign local chapterData local groupData for _, chapterid in pairs(XFubenAssignManager.GetChapterIdList()) do chapterData = XFubenAssignManager.GetChapterDataById(chapterid) for _, groupId in pairs(chapterData:GetGroupId()) do groupData = XFubenAssignManager.GetGroupDataById(groupId) local isUnlock = groupData:IsUnlock() for _, stageId in ipairs(groupData:GetStageId()) do local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) stageInfo.IsOpen = true stageInfo.Type = stageType stageInfo.Unlock = isUnlock stageInfo.ChapterId = chapterid end local baseStageInfo = XDataCenter.FubenManager.GetStageInfo(groupData:GetBaseStageId()) baseStageInfo.IsOpen = true baseStageInfo.Type = stageType baseStageInfo.Unlock = isUnlock baseStageInfo.ChapterId = chapterid end end end function XFubenAssignManager.FinishFight(settle) local groupId = XFubenAssignManager.GetGroupIdByStageId(settle.StageId) local groupData = XFubenAssignManager.GetGroupDataById(groupId) if not groupData:GetIsPerfect() then if settle.IsWin then groupData:SetGroupRebootCountAdd(CS.XFight.Instance.FightReboot.RebootCount) else groupData:ResetGroupRebootCount() end end XDataCenter.FubenManager.FinishFight(settle) if FinishFightCb then FinishFightCb(settle.IsWin) end end function XFubenAssignManager.OpenFightLoading() return end function XFubenAssignManager.CloseFightLoading() if CloseLoadingCb then CloseLoadingCb() end end function XFubenAssignManager.ShowReward(winData) if XFubenAssignManager.CheckIsGroupLastStage(winData.StageId) then -- 本地挑战次数自增 local groupId = XFubenAssignManager.GetGroupIdByStageId(winData.StageId) local groupData = XFubenAssignManager.GetGroupDataById(groupId) groupData:SetFightCount(groupData:GetFightCount() + 1) if not groupData:GetIsPerfect() then if groupData:GetGroupRebootCount() <= 0 then groupData:SetIsPerfect(true) end groupData:ResetGroupRebootCount() end XEventManager.DispatchEvent(XEventId.EVENET_ASSIGN_CAN_REWARD) -- 刷新红点 XLuaUiManager.Open("UiAssignPostWarCount", winData) end end ----------- 战斗接口 end----------- -- 某角色某技能加成 function XFubenAssignManager.GetSkillLevel(characterId, skillId) local character = XDataCenter.CharacterManager.GetCharacter(characterId) if not character then return 0 end local keys, levels = XFubenAssignManager.GetBuffKeysAndLevels() local npcTemplate = XCharacterConfigs.GetNpcTemplate(character.NpcId) local tragetCharacterType = npcTemplate.Type local targetSkilType = XCharacterConfigs.GetSkillType(skillId) local level = nil for _, key in pairs(keys) do local skillType = key % SKILLTYPE_BITS local characterType = (key - skillType) / SKILLTYPE_BITS if (characterType == tragetCharacterType or characterType == CHARACTERTYPE_ALL) and skillType == targetSkilType then level = levels[key] end end return level or 0 end function XFubenAssignManager.GetSkillLevelByCharacterData(character, skillId, assignChapterRecords) local keys = {} local levels = {} for _, v in ipairs(assignChapterRecords) do local chapterData = ChapterData.New(v.ChapterId) chapterData:SetCharacterId(v.CharacterId) if chapterData:IsOccupy() then for _, key in ipairs(chapterData:GetBuffKeys()) do if not levels[key] then levels[key] = 1 table.insert(keys, key) else levels[key] = levels[key] + 1 end end end end local npcTemplate = XCharacterConfigs.GetNpcTemplate(character.NpcId) local tragetCharacterType = npcTemplate.Type local targetSkilType = XCharacterConfigs.GetSkillType(skillId) local level = nil for _, key in pairs(keys) do local skillType = key % SKILLTYPE_BITS local characterType = (key - skillType) / SKILLTYPE_BITS if (characterType == tragetCharacterType or characterType == CHARACTERTYPE_ALL) and skillType == targetSkilType then level = levels[key] end end return level or 0 end -- 参数keys: {角色类型*1000+技能类型, ...} -- 参数levels: {[key] = level, ...} function XFubenAssignManager.GetBuffDescListByKeys(keys, levels) local descList = {} local GetCareerName = XCharacterConfigs.GetCareerName local GetSkillTypeName = XCharacterConfigs.GetSkillTypeName local GetText = CS.XTextManager.GetText for _, key in ipairs(keys) do local skillType = key % SKILLTYPE_BITS local characterType = (key - skillType) / SKILLTYPE_BITS local level = levels and levels[key] or 1 local memberTypeName = characterType == CHARACTERTYPE_ALL and "" or GetCareerName(characterType) local str = GetText("AssignSkillPlus", memberTypeName, GetSkillTypeName(skillType), level) -- 全体{0}成员{1}等级+{2} table.insert(descList, str) end return descList end function XFubenAssignManager.GetBuffKeysAndLevels() local keys = {} local levels = {} for _, id in ipairs(XFubenAssignManager.GetChapterIdList()) do local chapterData = XFubenAssignManager.GetChapterDataById(id) if chapterData:IsOccupy() then for _, key in ipairs(chapterData:GetBuffKeys()) do if not levels[key] then levels[key] = 1 table.insert(keys, key) else levels[key] = levels[key] + 1 end end end end return keys, levels end function XFubenAssignManager.SortKeys(keys) table.sort(keys, function(a, b) local skillTypeA = a % SKILLTYPE_BITS local characterTypeA = (a - skillTypeA) / SKILLTYPE_BITS local skillTypeB = b % SKILLTYPE_BITS local characterTypeB = (b - skillTypeB) / SKILLTYPE_BITS if skillTypeA ~= skillTypeB then return skillTypeA < skillTypeB end return characterTypeA < characterTypeB end) return keys end function XFubenAssignManager.GetAllBuffList() local keys, levels = XFubenAssignManager.GetBuffKeysAndLevels() keys = XFubenAssignManager.SortKeys(keys) return XFubenAssignManager.GetBuffDescListByKeys(keys, levels) end function XFubenAssignManager.TryGetFightTeamCharList(groupId) local groupData = XFubenAssignManager.GetGroupDataById(groupId) local teamList = {} local captainPosList = {} local firstFightPosList = {} local teamIdList = groupData:GetTeamInfoId() local allTeamHasMember = (#teamIdList > 0) for i, teamId in ipairs(teamIdList) do teamList[i] = {} local count = 0 local teamData = XFubenAssignManager.GetTeamDataById(teamId) captainPosList[i] = teamData:GetLeaderIndex() firstFightPosList[i] = teamData:GetFirstFightIndex() local memberList = teamData:GetMemberList() for _, memberData in ipairs(memberList) do local characterId = memberData:GetCharacterId() or 0 teamList[i][memberData:GetIndex()] = characterId if characterId ~= 0 then count = count + 1 end end if count < #memberList then allTeamHasMember = false end end return allTeamHasMember, teamList, captainPosList, firstFightPosList end -- 刷新后面关卡的解锁信息 function XFubenAssignManager.UnlockFollowGroupStage(preGroupId) local followGroupIdList = XFubenAssignManager.GetFollowGroupIdList(preGroupId) if not followGroupIdList then -- XLog.Debug(" 没有后置关卡id列表:" .. tostring(preGroupId)) return end for _, followGroupId in ipairs(followGroupIdList) do local followGroupData = XFubenAssignManager.GetGroupDataById(followGroupId) followGroupData:SyncStageInfo() end end -- 获得后置关卡组 function XFubenAssignManager.GetFollowGroupIdList(preGroupId) if not FollowGroupDict then XFubenAssignManager.InitFollowGroupDict() end local ids = FollowGroupDict[preGroupId] -- if not ids then -- XLog.Debug("前置关卡id无效:" .. tostring(preGroupId)) -- end return ids end -- 初始化关卡组后置数据 function XFubenAssignManager.InitFollowGroupDict() if not FollowGroupDict then FollowGroupDict = {} local GroupTemplates = XFubenAssignConfigs.GetGroupTemplates() local groupData for groupId, _ in pairs(GroupTemplates) do groupData = XFubenAssignManager.GetGroupDataById(groupId) local preGroupId = groupData:GetPreGroupId() if not FollowGroupDict[preGroupId] then FollowGroupDict[preGroupId] = {} end table.insert(FollowGroupDict[preGroupId], groupId) end end end -- Login登录后端初始化数据接口 function XFubenAssignManager.InitServerData(chapterRecords) XFubenAssignManager.UpdateChapterRecords(chapterRecords) XFubenAssignManager.InitFollowGroupDict() -- 有数据代表已经通关 local chapterData for _, v in pairs(chapterRecords) do chapterData = XFubenAssignManager.GetChapterDataById(v.ChapterId) chapterData:SetIsPassByServer(true) end XEventManager.DispatchEvent(XEventId.EVENET_ASSIGN_CAN_REWARD) -- 刷新红点 end function XFubenAssignManager.UpdateChapterRecords(chapterRecords) if not chapterRecords then return end for _, v in pairs(chapterRecords) do local chapterData = XFubenAssignManager.GetChapterDataById(v.ChapterId) chapterData:SetCharacterId(v.CharacterId) chapterData:SetRewarded(v.IsGetReward) end end function XFubenAssignManager.IsRedPoint() for _, chapterId in ipairs(XFubenAssignManager.GetChapterIdList()) do local chapterData = XFubenAssignManager.GetChapterDataById(chapterId) if chapterData:CanReward() then return true end end return false end function XFubenAssignManager.GetCharacterListInTeam(inTeamIdMap, charType) local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList(charType) -- 排序 未编队>已编队 等级>品质>优先级 local weights = {} -- 编队[1位] + 等级[3位] + 品质[1位] + 优先级[5位] local GetCharacterPriority = XCharacterConfigs.GetCharacterPriority for _, character in ipairs(ownCharacters) do local teamOrder = inTeamIdMap[character.Id] local stateOrder = teamOrder and (9 - teamOrder) or 9 local priority = GetCharacterPriority(character.Id) local weightOrder = stateOrder * 1000000000 local weightLevel = character.Level * 1000000 local weightQuality = character.Quality * 100000 local weightPriority = priority weights[character.Id] = weightOrder + weightLevel + weightQuality + weightPriority end table.sort(ownCharacters, function(a, b) return weights[a.Id] > weights[b.Id] end) return ownCharacters end -- 是否满足关卡所需战力 function XFubenAssignManager.IsStagePass(stageId) local groupId = XFubenAssignManager.GetGroupIdByStageId(stageId) local groupData = XFubenAssignManager.GetGroupDataById(groupId) return groupData:IsPass() end function XFubenAssignManager.GetAccountEnterKey() return KeyAccountEnterAssign .. XPlayer.Id end -----------------协议---------- function XFubenAssignManager.AssignGetDataRequest(cb) -- if cb then cb() return end -- for testing XNetwork.Call(METHOD_NAME.AssignGetDataRequest, nil, function(res) local info = res.AssignInfo local chapterRecords = info.ChapterRecords -- 章节占领角色 XFubenAssignManager.UpdateChapterRecords(chapterRecords) local groupRecords = info.GroupRecords -- 关卡组挑战次数 for _, v in ipairs(groupRecords) do local groupData = XFubenAssignManager.GetGroupDataById(v.GroupId) groupData:SetFightCount(v.Count) groupData:SetIsPerfect(v.IsPerfect) end XEventManager.DispatchEvent(XEventId.EVENET_ASSIGN_CAN_REWARD) -- 刷新红点 local groupTeamRecords = info.GroupTeamRecords -- 编队记录 for _, v in ipairs(groupTeamRecords) do local groupData = XFubenAssignManager.GetGroupDataById(v.GroupId) local teamCount = #v.TeamInfoList local posCount = v.CaptainPosList and #v.CaptainPosList or 0 local firstFightCount = v.FirstFightPosList and #v.FirstFightPosList or 0 for i, teamId in ipairs(groupData:GetTeamInfoId()) do local teamData = XFubenAssignManager.GetTeamDataById(teamId) local charaterIds = (i <= teamCount) and v.TeamInfoList[i] or nil local captainPos = (i <= posCount) and v.CaptainPosList[i] or XFubenAssignManager.CAPTIAN_MEMBER_INDEX local firstFightPos = (i <= firstFightCount) and v.FirstFightPosList[i] or XFubenAssignManager.FIRSTFIGHT_MEMBER_INDEX teamData:SetMemberList(charaterIds) teamData:SetLeaderIndex(captainPos) teamData:SetFirstFightIndex(firstFightPos) end end if cb then cb() end end) end function XFubenAssignManager.AssignSetTeamRequest(GroupId, TeamList, captainPosList, firstFightPosList, cb) -- if cb then cb() return end -- for testing XNetwork.Call(METHOD_NAME.AssignSetTeamRequest, { GroupId = GroupId, TeamList = TeamList, CaptainPosList = captainPosList, FirstFightPosList = firstFightPosList }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end if cb then cb() end end) end function XFubenAssignManager.AssignSetCharacterRequest(ChapterId, CharacterId, cb) -- if cb then cb() return end -- for testing XNetwork.Call(METHOD_NAME.AssignSetCharacterRequest, { ChapterId = ChapterId, CharacterId = CharacterId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end XEventManager.DispatchEvent(XEventId.EVENT_REFRESH_CHRACTER_ABLIITY) -- 重新计算角色战力 if cb then cb() end end) end function XFubenAssignManager.AssignGetRewardRequest(ChapterId, cb) -- if cb then cb() return end -- for testing XNetwork.Call(METHOD_NAME.AssignGetRewardRequest, { ChapterId = ChapterId }, function(res) if res.Code ~= XCode.Success then XUiManager.TipCode(res.Code) return end local chapterData = XFubenAssignManager.GetChapterDataById(ChapterId) chapterData:SetRewarded(true) XUiManager.OpenUiObtain(res.RewardList or {}) if cb then cb() end end) end function XFubenAssignManager.GetSkillPlusIdList() local list = {} for _, chapterId in ipairs(XFubenAssignManager.GetChapterIdList()) do local chapterData = XFubenAssignManager.GetChapterDataById(chapterId) if chapterData:IsOccupy() then table.insert(list, chapterData:GetSkillPlusId()) end end return list end function XFubenAssignManager.GetSkillPlusIdListOther(assignChapterRecords) local list = {} if assignChapterRecords == nil then return list end for _, v in ipairs(assignChapterRecords) do local chapterData = ChapterData.New(v.ChapterId) chapterData:SetCharacterId(v.CharacterId) if chapterData:IsOccupy() then table.insert(list, chapterData:GetSkillPlusId()) end end return list end ------------------------------- XFubenAssignManager.Init() return XFubenAssignManager end