elderscrolls-addon-achievem.../AchievementInfoApplication.lua

196 lines
6.8 KiB
Lua

--[[
AchievementInfo
@author Asto, @Astarax
]]
-- Do the magic
function AchievementInfo.onAchievementUpdated(_, achId)
local output = ""
-- addOn enabled?
if AchievementInfo.settingGet("genEnabled") == false then
if AchievementInfo.settingGet("devDebug") == false then
return
else
output = output .. "DEBUG (AddOn Disabled): "
end
end
--
local categoryId = AchievementInfo.getCorrectAchievementCategoryId(achId)
-- ignore unwanted achievements ...
if categoryId == false then
if AchievementInfo.settingGet("devDebug") == false then
return
else
output = output .. "DEBUG (Not Next): "
end
end
--
-- achievement category enabled?
if categoryId ~= false and AchievementInfo.settingGet("cat"..categoryId) == false then
if AchievementInfo.settingGet("devDebug") == false then
return
else
output = output .. "DEBUG (Category Off): "
end
end
--
-- okay continue with the message
local detailOutput = {}
local detailOutputCount = 1
local percentageCmpSum = 0
local percentageReqSum = 0
local percentageStep = false
local percentageStepSize = AchievementInfo.settingGet("genShowUpdateSteps")
local link = GetAchievementLink(achId, LINK_STYLE_BRACKET)
local catName = "/"
if categoryId ~= false then
catName = GetAchievementCategoryInfo(categoryId)
end
output = output .. "" .. link .. " (" .. catName .. ")"
local numCriteria = GetAchievementNumCriteria(achId)
for i = 1, numCriteria, 1 do
local description, numCompleted, numRequired = GetAchievementCriterion(achId, i)
local tmpOutput = ""
if i > 1 and AchievementInfo.settingGet("genOnePerLine") == false then
tmpOutput = tmpOutput .. ", "
end
tmpOutput = tmpOutput .. zo_strformat("<<1>>", description) .. " "
tmpOutput = tmpOutput .. AchievementInfo.calcCriteriaColor(numCompleted, numRequired) .. numCompleted .. "|r"
tmpOutput = tmpOutput .. AchievementInfo.clrDefault .. "/" .. "|r"
tmpOutput = tmpOutput .. AchievementInfo.clrCriteriaComplete .. numRequired .. "|r"
tmpOutput = tmpOutput .. AchievementInfo.clrDefault
if AchievementInfo.settingGet("genShowOpenDetailsOnly") == true then
if numCompleted ~= numRequired then
detailOutput[detailOutputCount] = tmpOutput
detailOutputCount = detailOutputCount + 1
end
else
detailOutput[detailOutputCount] = tmpOutput
detailOutputCount = detailOutputCount + 1
end
-- show the achievement on every special achievement because it's a rare event
if numRequired == 1 and numCompleted == 1 then
percentageStep = true
-- collect the numbers to calculate the correct percentage
else
percentageReqSum = percentageReqSum + numRequired
percentageCmpSum = percentageCmpSum + numCompleted
end
end
if percentageStep == false then
-- show at percent value
local percentage = 100 / percentageReqSum * percentageCmpSum
local percentageNext = 100 / percentageReqSum * (percentageCmpSum + 1)
-- if percentage of percentageStepSize is hit or the value is next to it and the next value will be higher
if --[[percentage > 0 and]] percentage % percentageStepSize == 0 or (percentage % percentageStepSize > percentageNext % percentageStepSize and percentageNext % percentageStepSize ~= 0) then
percentageStep = true
-- show if this is the first numCompleted value
elseif percentageCmpSum == 1 then
percentageStep = true
end
end
-- show details?
local detailsCount = AchievementInfo.tableLength(detailOutput)
if AchievementInfo.settingGet("genShowDetails") == true and detailsCount > 0 and AchievementInfo.settingGet("genOnePerLine") == false then
output = output .. " - "
for i = 1, detailsCount, 1 do
output = output .. detailOutput[i]
end
else
output = output .. "."
end
--
-- output on every step OR when its a defined percentage step
if AchievementInfo.settingGet("genShowEveryUpdate") == false and percentageStep == false then
if AchievementInfo.settingGet("devDebug") == false then
return
else
output = "DEBUG (" .. AchievementInfo.settingGet("genShowUpdateSteps") .. "% Rule): " .. output
end
end
--
--
if percentageReqSum == percentageCmpSum then
output = LANG.Completed .. ": " .. output
else
output = LANG.Updated .. ": " .. output
end
--
AchievementInfo.echo(output)
-- output the details line by line - start @2 because the normal output happend before (achievement name)
if AchievementInfo.settingGet("genShowDetails") == true and AchievementInfo.settingGet("genOnePerLine") == true then
for i = 1, AchievementInfo.tableLength(detailOutput), 1 do
AchievementInfo.echo(detailOutput[i])
end
end
end
-- Check if the category of an achievement is valid (reverse check)
function AchievementInfo.checkForValidCategory(achId)
local categoryTopLevelIndex, categoryIndex, achievementIndex = GetCategoryInfoFromAchievementId(achId)
local reverseAchievementId = GetAchievementId(categoryTopLevelIndex, categoryIndex, achievementIndex)
if achId == reverseAchievementId then
return true
end
return false
end
-- Get the correct achievement category
function AchievementInfo.getCorrectAchievementCategoryId(achId)
local previousAchievementId = GetPreviousAchievementInLine(achId)
if AchievementInfo.checkForValidCategory(achId) == false and previousAchievementId ~= 0 then
return AchievementInfo.getCorrectAchievementCategoryId(previousAchievementId)
elseif AchievementInfo.checkForValidCategory(achId) then
return GetCategoryInfoFromAchievementId(achId)
else
return false
end
end
-- Calculates the percentage of the achievement completition to define the color
function AchievementInfo.calcCriteriaColor(completed, required)
local percentage = 100 / required * completed
if completed == required then
return AchievementInfo.clrCriteriaComplete
elseif percentage <= 33 then
return AchievementInfo.clrCriteriaFar
elseif percentage <= 66 then
return AchievementInfo.clrCriteriaMedi
else
return AchievementInfo.clrCriteriaClose
end
end