Module:FisherList: Difference between revisions

(miscalculating fish per hour from duration and respawn)
(change from calculating fish per hour to specifying fish per hour, so that people can write strategy guides and then import the numbers)
 
(3 intermediate revisions by 2 users not shown)
Line 3: Line 3:
local lang = mw.getContentLanguage()
local lang = mw.getContentLanguage()
local plist = require('Module:ProfessionList')
local plist = require('Module:ProfessionList')
local rts = require('Module:RecipeTreeSearch')
local purge = require('Module:Purge')._purge


local p = {}
local p = {}
Line 39: Line 39:


-- downtime is very important for gathering-type professions
-- downtime is very important for gathering-type professions
-- initial guesses
-- initial values to see if there's an error
item.downtime = 60
item.productPerHour = 1
item.productPerHourDropping = 1
-- these numbers are based roughly on how far the nodes are from a storage rift or shop or bank
-- these numbers from the strategy guides for each type of node
-- 20s per room to traverse
-- duration and relocation times arent used for fisher, only respawn time and number of nodes
if string.find(item.pageName,'Flounder') then
if string.find(item.pageName,'Flounder') then
item.productPerHour = 317
item.downtime = 80 -- flounder cannot be deposited, only sold
item.nodes = 6
item.productPerHourDropping = 464
elseif string.find(item.pageName,'Eel') then
elseif string.find(item.pageName,'Eel') then
item.downtime = 20
item.productPerHour = 407
item.nodes = 6
item.productPerHourDropping = 464
elseif string.find(item.pageName,'Pufferfish') then
elseif string.find(item.pageName,'Pufferfish') then
item.productPerHour = 407
item.downtime = 20 -- pufferfish cannot be deposited, only sold
item.nodes = 6
item.productPerHourDropping = 464
elseif string.find(item.pageName,'Gurnard') then
elseif string.find(item.pageName,'Gurnard') then
item.downtime = 120
item.productPerHour = 276
item.nodes = 6
item.productPerHourDropping = 464
elseif string.find(item.pageName,'Bass') then
elseif string.find(item.pageName,'Bass') then
item.downtime = 40
item.productPerHour = 258
item.nodes = 3
item.productPerHourDropping = 307
elseif string.find(item.pageName,'Ray') then
elseif string.find(item.pageName,'Ray') then
item.downtime = 100
item.productPerHour = 295
item.nodes = 6
item.productPerHourDropping = 464
elseif string.find(item.pageName,'Cod') then
elseif string.find(item.pageName,'Cod') then
item.downtime = 120
item.productPerHour = 238
item.nodes = 3
item.productPerHourDropping = 306
end
end


-- profitability
-- profitability
item.profit = item.sellPrice
item.profit = item.sellPrice
-- products per hour
item.batch = 24
item.durationEffective = item.duration and item.respawn and (item.duration + item.respawn) / item.nodes
item.productPerHour = item.durationEffective and math.floor(1 / (item.durationEffective + item.downtime / item.batch) * 3600)
item.productPerHourDropping = item.durationEffective and 1 / (item.durationEffective) * 3600


-- properties per hour
-- properties per hour
Line 96: Line 89:
local out = mw.html.create('table')
local out = mw.html.create('table')
:addClass('wikitable sortable')
:addClass('wikitable sortable')
:tag('caption')
:wikitext('This list is updated dynamically. '..purge())
:done()
:tag('tr')
:tag('tr')
:tag('th')
:tag('th')

Latest revision as of 19:25, 7 January 2025

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

require('strict')
require('Module:Mw.html extension')
local lang = mw.getContentLanguage()
local plist = require('Module:ProfessionList')
local purge = require('Module:Purge')._purge

local p = {}

-- non dynamic module, no inputs
function p.main()
	
	local queryString = '[[Category:Fisher]] AND [[Category:Pages with activities]]'
	
	local function screenFunction(item)
		return not 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

		-- downtime is very important for gathering-type professions
		-- initial values to see if there's an error
		item.productPerHour = 1 
		item.productPerHourDropping = 1 
		-- these numbers from the strategy guides for each type of node
		if string.find(item.pageName,'Flounder') then
			item.productPerHour = 317 
			item.productPerHourDropping = 464
		elseif string.find(item.pageName,'Eel') then
			item.productPerHour = 407
			item.productPerHourDropping = 464
		elseif string.find(item.pageName,'Pufferfish') then
			item.productPerHour = 407 
			item.productPerHourDropping = 464
		elseif string.find(item.pageName,'Gurnard') then
			item.productPerHour = 276
			item.productPerHourDropping = 464
		elseif string.find(item.pageName,'Bass') then
			item.productPerHour = 258
			item.productPerHourDropping = 307
		elseif string.find(item.pageName,'Ray') then
			item.productPerHour = 295
			item.productPerHourDropping = 464
		elseif string.find(item.pageName,'Cod') then
			item.productPerHour = 238
			item.productPerHourDropping = 306
		end 

		-- profitability
		item.profit = item.sellPrice

		-- properties per hour
		item.xpPerHour = item.xp and item.productPerHour and math.floor(item.xp * item.productPerHour)
		item.xpPerHourDropping = item.xp and item.productPerHourDropping and math.floor(item.xp * item.productPerHourDropping)
		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)
	
	--simple check for nil results
	if results ==nil or results[1] == nil then
		return 'No data found for table'
	end
	
	local out = mw.html.create('table')
		:addClass('wikitable sortable')
		:tag('caption')
			:wikitext('This list is updated dynamically. '..purge())
		:done()
		:tag('tr')
			:tag('th')
				:wikitext('[[File:Fisher small icon.png|15px]]  Level')
			:done()
			:tag('th')
				:attr{ colspan = '2' }
				:wikitext('Node')
			:done()
			:tag('th')
				:attr{ colspan = '2' }
				:wikitext('Tool')
			:done()
			:tag('th')
				:attr{ colspan = '2' }
				:wikitext('Fish')
			:done()
			:tag('th')
				:wikitext('Fish/hr')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Profit')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Profit/hr')
			:done()
			:tag('th')
				:wikitext('XP')
			:done()
			:tag('th')
				:wikitext('XP/hr')
			:done()
			:tag('th')
				:wikitext('XP/hr<br>(Discarding)')
			: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()
			
			-- gathering node
			:node(plist.two_column_image_text(item.pageName,item.pageImage,item.pageName,item.pageName))
			:node(plist.two_column_image_text(item.tool,'File:'..item.tool..' (grade 1).png',item.tool,item.tool))

			-- resource
			:IF(item.coop)
				:node(plist.two_column_image_text(item.product,'File:' .. item.product .. '.png',item.product .. ' (co-op)',item.product))
			:ELSE()
				:node(plist.two_column_image_text(item.product,'File:' .. item.product .. '.png',item.product,item.product))
			:END()
			
			-- resource/hr
			:IF(item.productPerHour)
				:tag('td')
					:wikitext(item.productPerHour and math.floor(tonumber(item.productPerHour)*10)/10)
				:done()
			:ELSE()
				:node(plist.unknown_value_edit_cell(item.pageName,1))
			:END()
		
			-- economics
			:node(plist.currency_cell(item.profit))
			:node(plist.currency_cell(item.profitPerHour))

			-- 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()
			
			-- XP per hour
			:IF(item.xpPerHourDropping)
				:tag('td')
					:wikitext(item.xpPerHourDropping and lang:formatNum(tonumber(item.xpPerHourDropping)))
				:done()
			:ELSE()
				:node(plist.unknown_value_cell(1))
			:END()

		:done()
	end

	return out
end

return p