134 lines
4.6 KiB
Lua
134 lines
4.6 KiB
Lua
local AchievementUtils = {}
|
|
|
|
function AchievementUtils.loadAchievementData(loadNoObtain)
|
|
loadNoObtain = loadNoObtain == true
|
|
|
|
local dataSource = {}
|
|
local dataMap = {}
|
|
local groupId2CategoryIndexMap = {}
|
|
local groupId2GroupIndexMap = {}
|
|
local categoryTable = Tables.achievementTypeTable
|
|
for id, categoryData in pairs(categoryTable) do
|
|
local categoryInfo = {
|
|
categoryData = categoryData,
|
|
groupInfos = {},
|
|
}
|
|
for i, groupData in pairs(categoryData.achievementGroupData) do
|
|
local groupInfo = {
|
|
groupData = groupData,
|
|
achievements = {}
|
|
}
|
|
table.insert(categoryInfo.groupInfos, groupInfo)
|
|
end
|
|
table.insert(dataSource, categoryInfo)
|
|
end
|
|
table.sort(dataSource, function(lhs, rhs)
|
|
return lhs.categoryData.categoryPriority < rhs.categoryData.categoryPriority
|
|
end)
|
|
for i = 1, #dataSource do
|
|
local categoryInfo = dataSource[i]
|
|
categoryInfo.haveSub = #categoryInfo.groupInfos > 1
|
|
for j, groupInfo in ipairs(categoryInfo.groupInfos) do
|
|
groupId2CategoryIndexMap[groupInfo.groupData.groupId] = i
|
|
groupId2GroupIndexMap[groupInfo.groupData.groupId] = j
|
|
end
|
|
end
|
|
|
|
|
|
local achievementTable = Tables.achievementTable
|
|
local achievementPlayerData = GameInstance.player.achievementSystem.achievementData;
|
|
for achievementId, achievementData in pairs(achievementTable) do
|
|
local groupId = achievementData.groupId
|
|
local categoryIndex = groupId2CategoryIndexMap[groupId]
|
|
local categoryInfo = dataSource[categoryIndex]
|
|
if categoryInfo ~= nil then
|
|
local groupIndex = groupId2GroupIndexMap[groupId]
|
|
local groupInfo = categoryInfo.groupInfos[groupIndex]
|
|
if groupInfo ~= nil then
|
|
local suc, achievementPlayerInfo = achievementPlayerData.achievementInfos:TryGetValue(achievementId)
|
|
local ok, achievementTimeInfo = achievementPlayerData.achievementTimeInfos:TryGetValue(achievementId)
|
|
if loadNoObtain or (suc and achievementPlayerInfo.level >= achievementData.initLevel) then
|
|
local achievementInfo = {
|
|
achievementData = achievementData,
|
|
achievementPlayerInfo = achievementPlayerInfo,
|
|
achievementTimeInfo = achievementTimeInfo,
|
|
sortId = achievementData.order,
|
|
}
|
|
table.insert(groupInfo.achievements, achievementInfo)
|
|
dataMap[achievementId] = achievementInfo
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return dataSource, dataMap
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function AchievementUtils.filterAchievementData(dataSource, filterFunc)
|
|
local categoryFilteredData = {}
|
|
local filteredAchievementMap = {}
|
|
for i, categoryInfo in ipairs(dataSource) do
|
|
local filteredGroups = {}
|
|
local showNoObtain = categoryInfo.categoryData.noObtainCanView
|
|
for j, groupInfo in ipairs(categoryInfo.groupInfos) do
|
|
local filteredInfos = {}
|
|
for k, achievementInfo in ipairs(groupInfo.achievements) do
|
|
local include = filterFunc(achievementInfo, filteredInfos, showNoObtain)
|
|
if include then
|
|
filteredAchievementMap[achievementInfo.achievementData.achieveId] = {
|
|
categoryIndex = #categoryFilteredData + 1,
|
|
groupIndex = #filteredGroups + 1,
|
|
}
|
|
end
|
|
end
|
|
if #filteredInfos ~= 0 then
|
|
table.sort(filteredInfos, Utils.genSortFunction({"sortId"}, true))
|
|
for filteredInfoIndex, filteredInfo in ipairs(filteredInfos) do
|
|
filteredAchievementMap[filteredInfo.achievementData.achieveId].achievementIndex = filteredInfoIndex
|
|
end
|
|
local filteredGroup = {
|
|
data = groupInfo.groupData,
|
|
filteredInfos = filteredInfos,
|
|
}
|
|
table.insert(filteredGroups, filteredGroup)
|
|
end
|
|
end
|
|
if #filteredGroups ~= 0 then
|
|
local filteredCategory = {
|
|
data = categoryInfo.categoryData,
|
|
haveSub = categoryInfo.haveSub,
|
|
filteredGroups = filteredGroups,
|
|
}
|
|
table.insert(categoryFilteredData, filteredCategory)
|
|
end
|
|
end
|
|
return categoryFilteredData, filteredAchievementMap
|
|
end
|
|
|
|
|
|
_G.AchievementUtils = AchievementUtils
|
|
return AchievementUtils |