Module:Calculator/ETA
From Melvor Idle
Documentation for this module may be created at Module:Calculator/ETA/doc
local p = {}
local MEXP = require('Module:Experience')
local shared = require('Module:Shared')
function p._formatTime(timeInHundredths)
local sec = math.floor(timeInHundredths / 100)
local min = math.floor(timeInHundredths / 60000)
local hrs = math.floor(timeInHundredths / 3600000)
local days = math.floor(timeInHundredths / (3600000 * 24))
local formatString = "%d days %02dh %02dm %02ds"
if days == 0 then
formatString = "%02dh %02dm %02ds"
end
return string.format(formatString, days, hrs % 24, min % 60, sec % 60)
end
function p._calc(currentExp, targetLvl, expPerAction, actionTime)
-- ActionTime is represented in hundreds of a second.
-- 1.6 seconds = 160
local actionsPerHour = math.floor(360000 / actionTime)
local targetExp = MEXP.expForLevel(targetLvl)
local expRemaining = math.max(targetExp - currentExp, 0)
local actionsToTarget = math.ceil(expRemaining / expPerAction)
local timeToTarget = actionsToTarget * actionTime
local tbl = mw.html.create("table")
:addClass("wikitable sticky-header text-align-right align-left-1")
tbl:tag("tr")
:tag("th"):wikitext("Current Experience")
:tag("th"):wikitext("Target Level")
:tag("th"):wikitext("Target Experience")
:tag("th"):wikitext("Experience Remaining")
:tag("th"):wikitext("Actions Left")
:tag("th"):wikitext("Time Left")
tbl:tag("tr")
:tag("td"):wikitext(shared.formatnum(currentExp))
:tag("td"):wikitext(targetLvl)
:tag("td"):wikitext(shared.formatnum(targetExp))
:tag("td"):wikitext(shared.formatnum(expRemaining))
:tag("td"):wikitext(shared.formatnum(actionsToTarget))
:tag("td"):wikitext(p._formatTime(timeToTarget))
return tostring(tbl)
end
function p.main(frame)
return p._main(frame)
end
function p._main(frame)
local args = frame:getParent().args
local currentExp = shared.toNumberOrDefault(args.currentExp, 0)
local currentLvl = shared.toNumberOrDefault(args.currentLvl, 0)
local targetLvl = shared.toNumberOrError(args.targetLvl)
local actionExp = shared.toNumberOrError(args.actionExp)
local actionTime = shared.toNumberOrError(args.actionTime)
-- Check Exp param for validity first, then Lvl
if(currentExp == 0) then
currentExp = MEXP.expForLevel(currentLvl)
end
return p._calc(currentExp, targetLvl, actionExp, actionTime)
end
return p