Module:CarpenterList: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
(remove the Pole special case for display XP, and instead make pole recipes themselves work properly)
(double up for poles, so each line is per log)
Line 61: Line 61:
item.XP = fullRecipe.xp
item.XP = fullRecipe.xp
item.duration = fullRecipe.duration
item.duration = fullRecipe.duration
-- poles will show as making 1 and using 0.5 log, which doesnt match the look of planks or staves
-- double them,
if item.name and string.find(item.name,'Pole') then
item.outputQuantity = item.outputQuantity and item.outputQuantity * 2
item.buy = item.buy and item.buy * 2
item.XP = item.XP and item.XP * 2
item.duration = item.duration and item.duration * 2
for j,jtem in ipairs(item.materials) do
jtem.quantity = jtem.quantity * 2
end
end
-- direct values
-- direct values
Line 68: Line 81:


-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 products
-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 products
-- (without doubling up for poles, was assuming 6 logs to 12 poles per bach)
local batchSize = 12
local batchSize = 12
local downtime = 60
local downtime = 60

Revision as of 12:55, 7 December 2024

Module documentation
This documentation is transcluded from Module:CarpenterList/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:CarpenterList/doc. [edit]
Module:CarpenterList's function main is invoked by Template:CarpenterList.
Module:CarpenterList requires Module:Currency.
Module:CarpenterList requires Module:Mw.html extension.
Module:CarpenterList requires Module:Paramtest.
Module:CarpenterList requires Module:RecipeTreeSearch.
Module:CarpenterList requires strict.

require('strict')
require('Module:Mw.html extension')
local search = require('Module:RecipeTreeSearch')
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()

local p = {}

-- non dynamic module, no inputs
function p.main()
	-- returns only directly needed parameter needed for the row,
	-- other parameters are determined by subqueries of chained pages
	local query = {
		'[[-Sold item.Sold by::Timber Merchant Shop]]',
		'?Profession Level A = lvl',
		'? #- = name',
		'?Recipe JSON = recipeJSON',
		'?Activity XP = finalXP',
		'?Activity duration = duration',
		'?Value = sell',
		'sort = Profession Level A',
		'limit = 500'
	}
	local results = mw.smw.ask(query)

	results = p.formatResults(results)

	return p.displayTable(results)
	
	--for debugging
	--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'

end

-- makes the html for the cells containing currency directly
-- Replaces nil with an "unknown" cell
local function currency_cell(amount)
	if not amount then
		return mw.html.create('td')
			:addClass('table-bg-gray')
			:css{ ['text-align'] = 'center' }
			:attr{ colspan = '10' }
			:wikitext("''unknown''")
		:done()
	end
	return currency._cell(amount, { html = 'yes' })
end

-- do calculations and determine strings to go in cells
function p.formatResults(results)

	-- iterate through products
	for _, item in ipairs(results) do
		
		-- New module for recipe searching
		local fullRecipe = search.main(item.name)
		item.materials = fullRecipe.materials
		item.outputQuantity = fullRecipe.output[1].quantity
		item.buy = fullRecipe.buyPrice
		item.XP = fullRecipe.xp
		item.duration = fullRecipe.duration
		
		-- poles will show as making 1 and using 0.5 log, which doesnt match the look of planks or staves
		-- double them, 
		if item.name and string.find(item.name,'Pole') then
			item.outputQuantity = item.outputQuantity and item.outputQuantity * 2
			item.buy = item.buy and item.buy * 2
			item.XP = item.XP and item.XP * 2
			item.duration = item.duration and item.duration * 2
			
			for j,jtem in ipairs(item.materials) do
				jtem.quantity = jtem.quantity * 2
			end
		end
		
		-- direct values
		item.sell = item.sell and item.outputQuantity and item.sell * item.outputQuantity
		item.profit = item.sell and item.buy and item.sell - item.buy
		item.profitPerXP = item.profit and item.XP and math.floor(item.profit / item.XP * 100) / 100

		-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 products
		-- (without doubling up for poles, was assuming 6 logs to 12 poles per bach)
		local batchSize = 12
		local downtime = 60
		item.duration = item.duration and item.duration + downtime/batchSize
		item.productPerHour = item.duration and 1 / item.duration * 3600

		-- properties per hour
		item.XPPerHour = item.XP and item.productPerHour and math.floor(item.XP * item.productPerHour)
		item.profitPerHour = item.profit and item.productPerHour and math.floor(item.profit * item.productPerHour)
	end

	return results
end

-- make the table
function p.displayTable(results)
	local out = mw.html.create('table')
		:addClass('wikitable sortable')
		:tag('tr')
			:tag('th')
				:wikitext('[[File:Carpenter small icon.png|15px]]  Level')
			:done()
			:tag('th')
				:attr{ colspan = '3' }
				:wikitext('Products')
			:done()
			:tag('th')
				:wikitext('Materials')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Buy Value')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Sell Value')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Profit (per log)')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Profit/hr')
			:done()
			:tag('th')
				:wikitext('XP (per log)')
			:done()
			:tag('th')
				:wikitext('XP/hr')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Coins/XP')
			:done()
		:done()

	local unknown_value_cell = mw.html.create('td')
		:addClass('table-bg-gray')
		:css{ ['text-align'] = 'center' }
		:wikitext("''unknown''")

	for i, item in ipairs(results) do
		local row = out:tag('tr')
			:IF(item.lvl)
				:tag('td')
					:css{ ['text-align'] = 'center' }
					:wikitext(item.lvl)
				:done()
			:ELSE()
				:node(unknown_value_cell)
			:END()

			:tag('td')
				:css{ ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' }
				:attr{ ['data-sort-value'] = item.name }
				:wikitext(item.outputQuantity .. ' &times;')
			:done()
			:tag('td')
				:addClass('plinkt-image no-border')
				:css{ ['border-left'] = '0', ['padding-left'] = '0' }
				:wikitext('[[File:' .. item.name .. '.png|link=' .. item.name .. '|30px]]')
			:done()
			:tag('td')
				:addClass('plinkt-link no-border')
				:wikitext('[[' .. item.name .. ']]')
			:done()

		local materialCell = row:tag('td')

		for i, _ in ipairs(item.materials) do
			materialCell:wikitext(item.materials[i].quantity .. '&times; [[File:' .. item.materials[i].name .. '.png|30px|link=' .. item.materials[i].name .. ']] [[' .. item.materials[i].name .. ']]<br>')
		end
		
		row
			:node(currency_cell(item.buy))
			:node(currency_cell(item.sell))
			:node(currency_cell(item.profit))
			:node(currency_cell(item.profitPerHour))

			:IF(item.XP)
				:tag('td')
					:wikitext(item.XP and lang:formatNum(tonumber(item.XP)))
				:done()
			:ELSE()
				:node(unknown_value_cell)
			:END()

			:IF(item.XPPerHour)
				:tag('td')
					:wikitext(item.XPPerHour and lang:formatNum(tonumber(item.XPPerHour)))
				:done()
			:ELSE()
				:node(unknown_value_cell)
			:END()

			:node(currency_cell(item.profitPerXP))

		:done()
	end

	return out
end

return p