Module:AlchemistPassiveList

From Brighter Shores Wiki
Revision as of 21:31, 1 December 2024 by Alsang (talk | contribs) (remove vestigal reference to KP that aren't use any more, add some commenting for how it calculates input price)
Jump to navigation Jump to search
Module documentation
This documentation is transcluded from Module:AlchemistPassiveList/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:AlchemistPassiveList/doc. [edit]
Module:AlchemistPassiveList's function main is invoked by Template:AlchemistPassiveList.
Module:AlchemistPassiveList requires Module:Currency.
Module:AlchemistPassiveList requires Module:Mw.html extension.
Module:AlchemistPassiveList requires Module:Paramtest.

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


local p = {}

-- non dynamic module, no inputs
function p.main()
	
	-- returns almost every parameter needed for the row, except buy values for reagents
	local query = {
		'[[Uses facility::Passive Potion Station]] OR [[Variant of::Ebsworth Work]]',
		'?Profession Level A = lvl',
		'? #- = name',
		'?Uses item #- = reagents',
		'?Value #- = sell',
		'?Activity coins = coins',
		'?Activity XP = XP',
		'?Activity duration = duration',
		'?Variant of #- = variant',
		'sort = Profession Level A'
	}
	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, no tags needed
local function currency_cell(amount)
	return currency._cell(amount, { html = 'yes' })
end

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

    -- iterate through potions
    for i, item in ipairs(results) do
    	
    	--  potions have reagents, but passive ebsworth work does not
    	if item.variant=='Ebsworth Work' then
    		
    		-- if it is ebsworth work, sub in different fields for the buy and sell values
    		item.buy = 0
    		item.sell = item.coins
    	else
    	    -- iterate through reagents, adding buy price to running total (individuals not needed)
    	    -- potions always follow the same format, where the reagents are one level down
    	    -- if copying this code for another profession, will need to change how you identify the inputs.
    		-- starting value 20 is for bottle
    		item.buy = 20
    		for j, reagent in ipairs(item.reagents) do
    		
    			--shamelessley lifted from Module:Products
    			local shopPriceQuery = '[[:+]][[Sold item::' .. reagent .. ']]|?Shop buy price|mainlabel=' .. reagent
            	local shopPriceResult = mw.smw.ask(shopPriceQuery) or {}
            	local shopPrice = 0

            	if shopPriceResult[1] and shopPriceResult[1]["Shop buy price"] then
            	    shopPrice = tonumber(shopPriceResult[1]["Shop buy price"]) or 0
            	end
    		
            	item.buy = item.buy + shopPrice
    		end
    	end
    	
    	-- sanitise data, set to 0 if its not there
    	local lvl = item.lvl or '?'
    	local buy = item.buy or 0
    	local sell = item.sell or 0
    	local XP = item.XP or 0
    	local duration = item.duration or 0
    	
    	-- flags for if data values should be shown
    	item.hasLvl = param.has_content(item.lvl)
    	item.hasBuy = param.has_content(item.buy)
    	item.hasSell = param.has_content(item.sell)
    	item.hasProfit = item.hasBuy and item.hasSell
    	item.hasXP = param.has_content(item.XP)
    	item.hasDuration = param.has_content(item.duration)
    	
    	-- direct values
    	if item.variant=='Ebsworth Work' then
    		item.profit = sell - buy 
    	else
    		item.profit = (sell - buy)*0.005 -- passive potions all have quantity 0.005 per action
    	end
    	
    	item.XP = XP 
   		if item.XP==0 then
			item.profitPerXP = 0
		else
    		item.profitPerXP = math.floor(item.profit / (item.XP) * 100) / 100
   		end
	
    	-- passive activities have no downtime
    	item.duration = duration
    	if item.duration == 0 then
    		item.potionPerHour = 0
    	else
    		item.potionPerHour = 1 / (item.duration) * 3600
    	end
    	
    	-- properties per hour
    	item.XPPerHour = math.floor(item.XP * item.potionPerHour)
    	item.profitPerHour = math.floor(item.profit * item.potionPerHour)
    	
	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:Alchemist small icon.png|15px]]  Level')
			:done()
			:tag('th')
				:wikitext('Potion or Activity')
			:done()
			:tag('th')
				:wikitext('Reagents (plus bottle)')
			: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')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Profit/hr')
			:done()
			:tag('th')
				:wikitext('XP')
			:done()
			:tag('th')
				:wikitext('XP/hr')
			:done()
			:tag('th')
				:attr{ colspan = '10' }
				:wikitext('Coins/XP')
			:done()
		:done()
		
	
	
	for i,item in ipairs(results) do
		
		-- if its not ebsworth work, need a list of reagents
		local reagentCell = ''
		if not(item.variant=='Ebsworth Work') then
			-- need to generate the text for the reagent cell before starting the row	
			for j, reagent in ipairs(item.reagents) do
				reagentCell = reagentCell .. '[[File:' .. reagent .. '.png|30px|link=' .. reagent .. ']] [[' .. reagent .. ']]<br>'
			end
		end
		
	out
		:tag('tr')
		
			:tag('td')
				:IF(item.hasBuy)
					:css{ ['text-align'] = 'center' }
					:wikitext(item.lvl)
				:ELSE()
					:addClass('table-bg-grey')
					:css{ ['text-align'] = 'center' }
					:wikitext('unknown')
				:END()
			:done()
			
			:tag('td')
				:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]')
			:done()
			
			:IF(not(item.variant=='Ebsworth Work'))
				:tag('td')
					:wikitext(reagentCell)
				:done()
				
				:IF(item.hasBuy)
					:node(currency_cell(item.buy))
				:ELSE()
					:tag('td')
						:addClass('table-bg-grey')
						:attr{ colspan = '10' }
						:css{ ['text-align'] = 'center' }
						:wikitext('unknown')
					:done()
				:END()
				
				:IF(item.hasSell)
					-- I cannot for the life of me figure out why, 
					-- but if I put item.sell directly into this function it claims it has value nil
					-- it works for other functions to display it directly
					-- so here is the workaround I guess
					:node(currency_cell(item.buy+200*item.profit))
					--:node(currency_cell(item.sell))
				:ELSE()
					:tag('td')
						:addClass('table-bg-grey')
						:attr{ colspan = '10' }
						:css{ ['text-align'] = 'center' }
						:wikitext('unknown')
					:done()
				:END()
			:ELSE()
				:tag('td')
					:addClass('table-na')
					:attr{ colspan = '21' }
					:wikitext('N/A')
				:done()
			:END()
			
			:IF(item.hasProfit)
				:node(currency_cell(item.profit))
			:ELSE()
				:tag('td')
					:addClass('table-bg-grey')
					:attr{ colspan = '10' }
					:css{ ['text-align'] = 'center' }
					:wikitext('unknown')
				:done()
			:END()
			
			:IF(item.hasProfit and item.hasDuration)
				:node(currency_cell(item.profitPerHour))
			:ELSE()
				:tag('td')
					:addClass('table-bg-grey')
					:attr{ colspan = '10' }
					:css{ ['text-align'] = 'center' }
					:wikitext('unknown')
				:done()
			:END()
			
			:tag('td')
				:IF(item.hasXP)
					:wikitext(item.XP)
				:ELSE()
					:addClass('table-bg-grey')
					:css{ ['text-align'] = 'center' }
					:wikitext('unknown')
				:END()
			:done()
			
			:tag('td')
				:IF(item.hasXP and item.hasDuration)
					:wikitext(lang:formatNum(tonumber(item.XPPerHour)))
				:ELSE()
					:addClass('table-bg-grey')
					:css{ ['text-align'] = 'center' }
					:wikitext('unknown')
				:END()
			:done()
			
			:IF(item.hasXP and item.hasProfit)
				:node(currency_cell(item.profitPerXP))
			:ELSE()
				:tag('td')
					:addClass('table-bg-grey')
					:attr{ colspan = '10' }
					:css{ ['text-align'] = 'center' }
					:wikitext('unknown')
				:done()
			:END()
			
		:done()
		
	end
	
	return out
end

return p