Module:Calculator/ETA: Difference between revisions

From Melvor Idle
m (Use local functions)
m (Replace Shared module with Number module)
Line 2: Line 2:


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


local function formatTime(timeInHundredths)
local function formatTime(timeInHundredths)
Line 38: Line 38:
         :addClass("wikitable sticky-header text-align-right align-left-1")
         :addClass("wikitable sticky-header text-align-right align-left-1")


addTableRow(tbl, "Current Experience", shared.formatnum(currentExp))
addTableRow(tbl, "Current Experience", number.formatnum(currentExp))
addTableRow(tbl, "Target Level", targetLvl)
addTableRow(tbl, "Target Level", targetLvl)
addTableRow(tbl, "Target Experience", shared.formatnum(targetExp))
addTableRow(tbl, "Target Experience", number.formatnum(targetExp))
addTableRow(tbl, "Experience Remaining", shared.formatnum(expRemaining))
addTableRow(tbl, "Experience Remaining", number.formatnum(expRemaining))
addTableRow(tbl, "Actions Left", shared.formatnum(actionsToTarget))
addTableRow(tbl, "Actions Left", number.formatnum(actionsToTarget))
addTableRow(tbl, "Time Left", formatTime(timeToTarget))
addTableRow(tbl, "Time Left", formatTime(timeToTarget))


Line 55: Line 55:
local args = frame:getParent().args
local args = frame:getParent().args
local currentExp = shared.toNumberOrDefault(args.currentExp, 0)
local currentExp = number.toNumberOrDefault(args.currentExp, 0)
local currentLvl = shared.toNumberOrDefault(args.currentLvl, 0)
local currentLvl = number.toNumberOrDefault(args.currentLvl, 0)


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


-- Check Exp param for validity first, then Lvl
-- Check Exp param for validity first, then Lvl

Revision as of 22:14, 12 March 2024

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 sec = math.floor(timeInHundredths / 100)
    local min = math.floor(timeInHundredths / 60000)
    local hrs = math.floor(timeInHundredths / 360000)
    local days = math.floor(timeInHundredths / (360000 * 24))

	if days == 0 then
		return string.format("%02dh %02dm %02ds", hrs % 24, min % 60, sec % 60)
	else
		return string.format("%d days %02dh %02dm %02ds", days, hrs % 24, min % 60, sec % 60)
	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.toNumberOrDefault(args.currentExp, 0)
	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