Module:Calculator/ItemEconomy: Difference between revisions

From Melvor Idle
No edit summary
m (Chance extra item amounts to 1 by default instead of 0)
 
(5 intermediate revisions by the same user not shown)
Line 49: Line 49:
end
end


local function calculateFactor(a, b)
local function createTable(target, calcAmount, useRoW, ecoType, multiplier)
    local highest = math.max(a, b)
    local lowest = math.min(a, b)
 
    if lowest == 0 then
    lowest = 1
    end
 
    local factor = highest / lowest
    return string.format("x%.2f", factor)
end
 
local function createTable(userAmount, calcAmount, useRoW, ecoType, multiplier)
local RoWYN = useRoW and "Yes" or "No"
local RoWYN = useRoW and "Yes" or "No"
Line 68: Line 56:
if ecoType == ECOIN then
if ecoType == ECOIN then
addTableRow(tbl, "Desired Output", number.formatnum(userAmount))
addTableRow(tbl, "Desired Output", number.formatnum(target))
addTableRow(tbl, "Estimated Input", number.formatnum(calcAmount))
addTableRow(tbl, "Estimated Input", number.formatnum(calcAmount))
else
else
addTableRow(tbl, "Starting Items", number.formatnum(userAmount))
addTableRow(tbl, "Starting Items", number.formatnum(target))
addTableRow(tbl, "Estimated Output", number.formatnum(calcAmount))
addTableRow(tbl, "Estimated Output", number.formatnum(calcAmount))
end
end
addTableRow(tbl, "Economy Factor", calculateFactor(userAmount, calcAmount))
addTableRow(tbl, "Economy Factor", string.format("x%.2f", multiplier))
addTableRow(tbl, "[[Ring of Wealth]] benefits", RoWYN)
addTableRow(tbl, "[[Ring of Wealth]] benefits", RoWYN)
Line 87: Line 75:


function p._main(args)
function p._main(args)
local target = args.targetAmount or 0
local target = number.toNumberOrDefault(args.targetAmount, 0)
local economyType = parseEconomy(args.economyType)
local economyType = parseEconomy(args.economyType)


Line 97: Line 85:
itemEconomy.duplicationChance = number.toNumberOrDefault(args.duplicationChance, 0)
itemEconomy.duplicationChance = number.toNumberOrDefault(args.duplicationChance, 0)
itemEconomy.extraItemChance = number.toNumberOrDefault(args.extraItemChance, 0)
itemEconomy.extraItemChance = number.toNumberOrDefault(args.extraItemChance, 0)
itemEconomy.extraItemAmount = number.toNumberOrDefault(args.extraItemAmount, 0)
itemEconomy.extraItemAmount = number.toNumberOrDefault(args.extraItemAmount, 1)
itemEconomy.flatExtraItems = number.toNumberOrDefault(args.flatExtraItems, 0)
itemEconomy.flatExtraItems = number.toNumberOrDefault(args.flatExtraItems, 0)
itemEconomy.extraBaseItemChance = number.toNumberOrDefault(args.extraBaseItemChance, 0)
itemEconomy.extraBaseItemChance = number.toNumberOrDefault(args.extraBaseItemChance, 0)
itemEconomy.extraBaseItems = number.toNumberOrDefault(args.extraBaseItems, 0)
itemEconomy.extraBaseItems = number.toNumberOrDefault(args.extraBaseItems, 1)


local result = 0
local result = 0
Line 111: Line 99:
end
end


local tbl = createTable(target, result, row, economyType)
local multiplier = eco.estimatedOutputMultiplier(itemEconomy)
local tbl = createTable(target, result, row, economyType, multiplier)
          
          
     return tostring(tbl)
     return tostring(tbl)

Latest revision as of 00:07, 19 March 2024

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

local p = {}

local number = require('Module:Number')
local eco = require("Module:ItemEconomy")

ECOIN = "INPUT"
ECOOUT = "OUTPUT"

local function parseEconomy(eco)
	if eco == nil then
		return ECOOUT
	end
	
	if eco:upper() == ECOIN then
        return ECOIN
    elseif eco:upper() == ECOOUT then
        return ECOOUT
    end
    
    return ECOOUT
end

--
-- Returns the estimated output items and TRUE/FALSE if the Ring of Wealth has a benefit.
--
local function calculateOutput(target, itemEconomy)
	local estimatedOutput = eco.estimatedOutput(target, itemEconomy)
	local useRoW = eco.ringOfWealthHasEffect(itemEconomy)
	
	return math.floor(estimatedOutput), useRoW
end

--
-- Returns the estimated input items and TRUE/FALSE if the Ring of Wealth has a benefit.
--
local function calculateInput(target, itemEconomy)
	local estimatedInput = eco.estimatedInput(target, itemEconomy)
	local useRoW = eco.ringOfWealthHasEffect(itemEconomy)

	return math.ceil(estimatedInput), useRoW
end

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

local function createTable(target, calcAmount, useRoW, ecoType, multiplier)
	local RoWYN = useRoW and "Yes" or "No"
	
	local tbl = mw.html.create("table")
		:addClass("wikitable sticky-header text-align-right align-left-1")
		
	if ecoType == ECOIN then
		addTableRow(tbl, "Desired Output", number.formatnum(target))
		addTableRow(tbl, "Estimated Input", number.formatnum(calcAmount))
	else
		addTableRow(tbl, "Starting Items", number.formatnum(target))
		addTableRow(tbl, "Estimated Output", number.formatnum(calcAmount))
	end
	
	addTableRow(tbl, "Economy Factor", string.format("x%.2f", multiplier))
	addTableRow(tbl, "[[Ring of Wealth]] benefits", RoWYN)
	
	return tbl
end

function p.main(frame)
	local args = frame:getParent().args
	return p._main(args)
end

function p._main(args)
	local target = number.toNumberOrDefault(args.targetAmount, 0)
	local economyType = parseEconomy(args.economyType)

	-- Create and fill ItemEconomy object.
	local itemEconomy = eco.ItemEconomy:new()
	itemEconomy.inputsPerAction =		number.toNumberOrDefault(args.inputsPerAction, 1)
	itemEconomy.outputsPerAction =		number.toNumberOrDefault(args.outputsPerAction, 1)
	itemEconomy.preservationChance =	number.toNumberOrDefault(args.preservationChance, 0)
	itemEconomy.duplicationChance = 	number.toNumberOrDefault(args.duplicationChance, 0)
	itemEconomy.extraItemChance =		number.toNumberOrDefault(args.extraItemChance, 0)
	itemEconomy.extraItemAmount =		number.toNumberOrDefault(args.extraItemAmount, 1)
	itemEconomy.flatExtraItems =		number.toNumberOrDefault(args.flatExtraItems, 0)
	itemEconomy.extraBaseItemChance =	number.toNumberOrDefault(args.extraBaseItemChance, 0)
	itemEconomy.extraBaseItems =		number.toNumberOrDefault(args.extraBaseItems, 1)

	local result = 0
	local row = false
	
	if economyType == ECOOUT then
		result, row = calculateOutput(target, itemEconomy)
	else
		result, row = calculateInput(target, itemEconomy)
	end

	local multiplier = eco.estimatedOutputMultiplier(itemEconomy)
	local tbl = createTable(target, result, row, economyType, multiplier)
        
    return tostring(tbl)
end

return p