Module:Calculator/ETA: Difference between revisions

From Melvor Idle
m (Don't show days if daycount = 0)
No edit summary
 
(10 intermediate revisions by the same user not shown)
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 TimeSpan = require('Module:TimeSpan')


function p._formatTime(timeInHundredths)
local function formatTime(seconds)
    local sec = math.floor(timeInHundredths / 100)
local timespan = TimeSpan.fromSeconds(seconds)
    local min = math.floor(timeInHundredths / 60000)
return timespan:toStringLong()
    local hrs = math.floor(timeInHundredths / 3600000)
end
    local days = math.floor(timeInHundredths / (3600000 * 24))


local formatString = "%d days %02dh %02dm %02ds"
local function addTableRow(tbl, c1, c2)
if days == 0 then
tbl:tag("tr")
formatString = "%02dh %02dm %02ds"
:tag("th"):wikitext(c1)
end
:tag("td"):wikitext(c2)
    return string.format(formatString, days, hrs % 24, min % 60, sec % 60)
return tbl
end
end


function p._calc(currentExp, targetLvl, expPerAction, actionTime)
local function calc(currentExp, targetLvl, expPerAction, actionTime)
-- ActionTime is represented in hundreds of a second.
local actionsPerHour = math.floor(3600 / actionTime)
-- 1.6 seconds = 160
local actionsPerHour = math.floor(360000 / actionTime)
local targetExp = MEXP.expForLevel(targetLvl)
local targetExp = MEXP.expForLevel(targetLvl)
local expRemaining = math.max(targetExp - currentExp, 0)
local expRemaining = math.max(targetExp - currentExp, 0)
local expPerHour = math.floor(3600 / actionTime * expPerAction)
local actionsToTarget = math.ceil(expRemaining / expPerAction)
local actionsToTarget = math.ceil(expRemaining / expPerAction)
Line 31: Line 30:
         :addClass("wikitable sticky-header text-align-right align-left-1")
         :addClass("wikitable sticky-header text-align-right align-left-1")


    tbl:tag("tr")
addTableRow(tbl, "Current Experience", number.formatnum(currentExp))
        :tag("th"):wikitext("Current Experience")
addTableRow(tbl, "Target Level", targetLvl)
        :tag("th"):wikitext("Target Level")
addTableRow(tbl, "Target Experience", number.formatnum(targetExp))
        :tag("th"):wikitext("Target Experience")
addTableRow(tbl, "Experience Remaining", number.formatnum(expRemaining))
        :tag("th"):wikitext("Experience Remaining")
addTableRow(tbl, "Experience Per Hour", number.formatnum(expPerHour))
        :tag("th"):wikitext("Actions Left")
addTableRow(tbl, "Actions Left", number.formatnum(actionsToTarget))
        :tag("th"):wikitext("Time Left")
addTableRow(tbl, "Time Left", formatTime(timeToTarget))
 
    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)
     return tostring(tbl)
Line 57: Line 48:
local args = frame:getParent().args
local args = frame:getParent().args
local currentExp = shared.toNumberOrDefault(args.currentExp, 0)
local currentExp = number.parseNumber(args.currentExp)
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
Line 69: Line 60:
end
end
return p._calc(currentExp, targetLvl, actionExp, actionTime)
return calc(currentExp, targetLvl, actionExp, actionTime)
end
end


return p
return p

Latest revision as of 21:23, 13 April 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 TimeSpan = require('Module:TimeSpan')

local function formatTime(seconds)
	local timespan = TimeSpan.fromSeconds(seconds)
	return timespan:toStringLong()
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)
	local actionsPerHour = math.floor(3600 / actionTime)
	local targetExp = MEXP.expForLevel(targetLvl)
	local expRemaining = math.max(targetExp - currentExp, 0)
	local expPerHour = math.floor(3600 / actionTime * expPerAction)
	
	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, "Experience Per Hour", number.formatnum(expPerHour))
	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