Files
Endfield-Data/LuaScripts/Common/Utils/AchievementUtils.lua
2025-12-02 20:37:18 +07:00

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