Module:WoodcutterPassiveList: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
(switch to sorting after the SMW query)
(offload much of the search, screen, and format functions to the new ProfessionList module, so they work the same for all tables)
Line 1: Line 1:
require('strict')
require('strict')
require('Module:Mw.html extension')
require('Module:Mw.html extension')
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()
local lang = mw.getContentLanguage()
local plist = require('Module:ProfessionList')
local rts = require('Module:RecipeTreeSearch')


local p = {}
local p = {}
Line 10: Line 10:
function p.main()
function p.main()
local queryString = '[[Category:Woodcutter]] AND [[Category:Pages with activities]]'
-- returns only directly needed parameter needed for the row,
-- other parameters are determined by subqueries of chained pages
-- Woodcutter cannot sort by any parameter, as Branches use Profession B but Split Wood uses profession A
local query = {
'[[Variant of::~*Tree||~Split Wood for*]]',
'? #- = name',
'?Image #- = Image',
'?Activity JSON = activityJSON',
'?Activity coins = coins',
'limit = 500'
}
local results = mw.smw.ask(query)
local function screenFunction(item)
results = p.screenResults(results)
return item.passive
end
local results = plist.generate_recipe_table(queryString,screenFunction)


results = p.formatResults(results)
results = p.formatResults(results)
Line 34: Line 27:
end
end


-- do calculations and determine strings to go in cells
-- makes the html for the cells containing currency directly
function p.formatResults(results)
-- 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


--simple check for nil results
-- goes through a list of results and culls the ones which are not needed for this table
if results==nil or results[1]==nil then
function p.screenResults(results)
return nil
local resultsScreened = {}
-- iterate through products
for _, item in ipairs(results) do
-- if theres only one activity, wrap in table
if type(item.activityJSON)=='string' then
item.activityJSON = { item.activityJSON }
end
for j,json in ipairs(item.activityJSON) do
if string.find(json,'Branches') or string.find(json,'Split') then
local activityJSON = mw.text.jsonDecode(json)
item.XP = activityJSON.xp
item.lvl = activityJSON.level
item.duration = activityJSON.duration and tonumber(activityJSON.duration)
item.product = activityJSON.output[1].name
item.activityJSON = json
table.insert(resultsScreened,item)
end
end
end
end
-- sort the results by recipe level
table.sort(resultsScreened, function(item1, item2)
local lvl1 = item1.lvl
local lvl2 = item2.lvl
if (lvl1 == nil) ~= (lvl2 == nil) then --one of two are empty
return lvl2 == nil -- true if lvl2 is nil but not lvl1, false if lvl1 is nil but not lvl2
end
if lvl1 == nil then
return false -- Both empty, equivalent
end
return lvl1 < lvl2 -- normal comparison
end)

return resultsScreened

end

-- do calculations and determine strings to go in cells
function p.formatResults(results)
-- iterate through products
-- iterate through products
Line 100: Line 39:
item.givesCoins = string.find(item.product,'Split')
item.givesCoins = string.find(item.product,'Split')
if item.givesCoins then
item.profit = item.coins and tonumber(item.coins)
else
item.profit = item.sellPrice*0.005
end


-- profit from selling the items
if not item.givesCoins then
-- protection against missing parameters
item.product = item.product or ''
-- query is: there is a shop object page that has this item AND has buy price cannot be "N/A"
local query = mw.smw.ask('[[Sold item::' .. item.product .. ']][[Shop sell price::!~N/A]]|?Shop sell price=data|mainlabel=-')
if type(query)=='table' then
-- price is returned as a number
item.coins = tonumber(query[1].data)*0.005 or 0
else
-- will return nil if the item is not in a shop, or if it is in a shop but can only be sold to the shop
item.coins = 0
end
end
-- no downtime for passives
-- no downtime for passives
item.productPerHour = item.duration and 1 / item.duration * 3600
item.productPerHour = item.duration and 1 / item.duration * 3600


-- properties per hour
-- properties per hour
item.XPPerHour = item.XP and item.productPerHour and math.floor(item.XP * item.productPerHour)
item.xpPerHour = item.xp and item.productPerHour and math.floor(item.xp * item.productPerHour)
item.coinsPerHour = item.coins and item.productPerHour and math.floor(item.coins * item.productPerHour)
item.coinsPerHour = item.profit and item.productPerHour and math.floor(item.profit * item.productPerHour)
end
end


Line 132: Line 58:
-- make the table
-- make the table
function p.displayTable(results)
function p.displayTable(results)
--simple check for nil results
if results==nil or results[1]==nil then
return nil
end
local out = mw.html.create('table')
local out = mw.html.create('table')
:addClass('wikitable sortable')
:addClass('wikitable sortable')
Line 160: Line 92:
:done()
:done()
: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
for i, item in ipairs(results) do
Line 170: Line 97:
--level
--level
:IF(item.lvl)
:IF(item.level)
:tag('td')
:tag('td')
:css{ ['text-align'] = 'center' }
:css{ ['text-align'] = 'center' }
:wikitext(item.lvl)
:wikitext(item.level)
:done()
:done()
:ELSE()
:ELSE()
:node(plist.unknown_value_edit_cell(item.pageName,1))
:node(unknown_value_cell)
:END()
:END()
-- activity
-- activity
:node(plist.two_column_image_text(item.pageName,item.pageImage,item.product,item.product))
:tag('td')
:css{ ['border-right'] = '0', ['text-align'] = 'right' }
:addClass('plinkt-link no-border')
:attr{ ['data-sort-value'] = item.name }
:wikitext(' [[' .. item.Image .. '|link=' .. item.name .. '|30x30px]]')
:done()
:tag('td')
:addClass('plinkt-link no-border')
:wikitext('[[' .. item.name .. ']]')
:done()
-- products (coins or items)
-- products (coins or items)
:IF(item.givesCoins)
:IF(item.givesCoins)
:IF(item.coins)
:IF(item.profit)
:tag('td')
:tag('td')
:css{ ['border-right'] = '0', ['text-align'] = 'right' }
:css{ ['border-right'] = '0', ['text-align'] = 'right' }
:addClass('plinkt-link no-border')
:addClass('plinkt-link no-border')
:attr{ ['data-sort-value'] = item.product }
:attr{ ['data-sort-value'] = item.product }
:wikitext(item.coins)
:wikitext(item.profit)
:done()
:done()
:ELSE()
:ELSE()
:node(unknown_value_cell)
:node(plist.unknown_value_edit_cell(item.pageName,1))
:END()
:END()
:tag('td')
:tag('td')
Line 213: Line 131:
:done()
:done()
:ELSE()
:ELSE()
:node(plist.three_column_image_text(item.product,0.005,'File:'..item.product..'.png',item.product,item.product))
:tag('td')
:css{ ['border-right'] = '0', ['text-align'] = 'right' }
:addClass('plinkt-link no-border')
:attr{ ['data-sort-value'] = item.product }
:wikitext('0.005 &times; ')
:done()
:tag('td')
:css{ ['border-right'] = '0', ['text-align'] = 'center' }
:addClass('plinkt-link no-border')
:wikitext('[[File:' .. item.product .. '.png|link=' .. item.product .. '|30x30px]]')
:done()
:tag('td')
:addClass('plinkt-link no-border')
:wikitext('[[' .. item.product .. ']]')
:done()
:END()
:END()
Line 244: Line 148:
-- profit per hour (coins)
-- profit per hour (coins)
:node(currency_cell(item.coinsPerHour))
:node(plist.currency_cell(item.coinsPerHour))


-- XP
-- XP
:IF(item.XP)
:IF(item.xp)
:tag('td')
:tag('td')
:wikitext(item.XP and lang:formatNum(tonumber(item.XP)))
:wikitext(item.xp and lang:formatNum(tonumber(item.xp)))
:done()
:done()
:ELSE()
:ELSE()
:node(plist.unknown_value_edit_cell(item.pageName,1))
:node(unknown_value_cell)
:END()
:END()
-- XP per hour
-- XP per hour
:IF(item.XPPerHour)
:IF(item.xpPerHour)
:tag('td')
:tag('td')
:wikitext(item.XPPerHour and lang:formatNum(tonumber(item.XPPerHour)))
:wikitext(item.xpPerHour and lang:formatNum(tonumber(item.xpPerHour)))
:done()
:done()
:ELSE()
:ELSE()
:node(unknown_value_cell)
:node(plist.unknown_value_cell(1))
:END()
:END()



Revision as of 01:16, 19 December 2024

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

require('strict')
require('Module:Mw.html extension')
local lang = mw.getContentLanguage()
local plist = require('Module:ProfessionList')
local rts = require('Module:RecipeTreeSearch')

local p = {}

-- non dynamic module, no inputs
function p.main()
	
	local queryString = '[[Category:Woodcutter]] AND [[Category:Pages with activities]]'
	
	local function screenFunction(item)
		return item.passive
	end
	
	local results = plist.generate_recipe_table(queryString,screenFunction)

	results = p.formatResults(results)

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

end

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

	--simple check for nil results
	if results==nil or results[1]==nil then
		return nil
	end
	
	-- iterate through products
	for _, item in ipairs(results) do
			
		item.givesCoins = string.find(item.product,'Split')
		if item.givesCoins then
			item.profit = item.coins and tonumber(item.coins)
		else
			item.profit = item.sellPrice*0.005
		end

		-- no downtime for passives
		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.coinsPerHour = item.profit and item.productPerHour and math.floor(item.profit * item.productPerHour)
	end

	return results
end

-- make the table
function p.displayTable(results)
	
	--simple check for nil results
	if results==nil or results[1]==nil then
		return nil
	end
	
	local out = mw.html.create('table')
		:addClass('wikitable sortable')
		:tag('tr')
			:tag('th')
				:wikitext('[[File:Woodcutter small icon.png|15px]]  Level')
			:done()
			:tag('th')
				:attr{ colspan = '2' }
				:wikitext('Woodcutter node')
			:done()
			:tag('th')
				:attr{ colspan = '3' }
				:wikitext('Product')
			:done()
			:tag('th')
				:wikitext('Quantity/hr')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Profit/hr')
			:done()
			:tag('th')
				:wikitext('XP')
			:done()
			:tag('th')
				:wikitext('XP/hr')
			:done()
		:done()

	for i, item in ipairs(results) do
		local row = out:tag('tr')
		
			--level
			:IF(item.level)
				:tag('td')
					:css{ ['text-align'] = 'center' }
					:wikitext(item.level)
				:done()
			:ELSE()
				:node(plist.unknown_value_edit_cell(item.pageName,1))
			:END()
			
			-- activity
			:node(plist.two_column_image_text(item.pageName,item.pageImage,item.product,item.product))
			
			-- products (coins or items)
			:IF(item.givesCoins)
				:IF(item.profit)
					:tag('td')
						:css{ ['border-right'] = '0', ['text-align'] = 'right' }
						:addClass('plinkt-link no-border')
						:attr{ ['data-sort-value'] = item.product }
						:wikitext(item.profit)
					:done()
				:ELSE()
					:node(plist.unknown_value_edit_cell(item.pageName,1))
				:END()
				:tag('td')
					:css{ ['border-right'] = '0', ['text-align'] = 'center' }
					:addClass('plinkt-link no-border')
					:wikitext('[[File:Copper coin.png|20x20px]]')
				:done()
				:tag('td')
					:addClass('plinkt-link no-border')
					:wikitext('Coins')
				:done()
			:ELSE()
				:node(plist.three_column_image_text(item.product,0.005,'File:'..item.product..'.png',item.product,item.product))
			:END()
			
			-- products per hour (items)
			:IF(item.givesCoins)
				:tag('td')
					:addClass('table-na')
					:wikitext('N/A')
				:done()
			:ELSE()
				:tag('td')
					:css{ ['text-align'] = 'right' }
					:wikitext('0.9 &times; [[File:' .. item.product .. '.png|link=' .. item.product .. '|30x30px]]')
				:done()
			:END()
			
			-- profit per hour (coins)
			:node(plist.currency_cell(item.coinsPerHour))

			-- XP
			:IF(item.xp)
				:tag('td')
					:wikitext(item.xp and lang:formatNum(tonumber(item.xp)))
				:done()
			:ELSE()
				:node(plist.unknown_value_edit_cell(item.pageName,1))
			:END()
			
			-- XP per hour
			:IF(item.xpPerHour)
				:tag('td')
					:wikitext(item.xpPerHour and lang:formatNum(tonumber(item.xpPerHour)))
				:done()
			:ELSE()
				:node(plist.unknown_value_cell(1))
			:END()

		:done()
	end

	return out
end

return p