Module:Calculator/ETA

From Melvor Idle
Revision as of 12:34, 13 March 2024 by Ricewind (talk | contribs)

Documentation for this module may be created at Module:Calculator/ETA/doc

local p = {}

local MEXP = require('Module:Experience')
local number = require('Module:Number')

local function formatTime(timeInHundredths)
	local timespan = number.actionTimeToTimeSpan(timeInHundredths)

	if timespan.days == 0 then
		return string.format("%02dh %02dm %02ds", timespan.hours, timespan.minutes, timespan.seconds)
	else
		return string.format("%d days %02dh %02dm %02ds", timespan.days, timespan.hours, timespan.minutes, timespan.seconds)
	end
end

local function addTableRow(tbl, c1, c2)
	tbl:tag("tr")
		:tag("th"):wikitext(c1)
		:tag("td"):wikitext(c2)
	
	return tbl
end

local function 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")

	addTableRow(tbl, "Current Experience", number.formatnum(currentExp))
	addTableRow(tbl, "Target Level", targetLvl)
	addTableRow(tbl, "Target Experience", number.formatnum(targetExp))
	addTableRow(tbl, "Experience Remaining", number.formatnum(expRemaining))
	addTableRow(tbl, "Actions Left", number.formatnum(actionsToTarget))
	addTableRow(tbl, "Time Left", 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 = number.parseNumber(args.currentExp)
	local currentLvl = number.toNumberOrDefault(args.currentLvl, 0)

	local targetLvl = number.toNumberOrError(args.targetLvl)
	local actionExp = number.toNumberOrError(args.actionExp)
	local actionTime = number.toNumberOrError(args.actionTime)

	-- Check Exp param for validity first, then Lvl
	if(currentExp == 0) then
		currentExp = MEXP.expForLevel(currentLvl)
	end
	
	return calc(currentExp, targetLvl, actionExp, actionTime)
end

return p