Module:Sandbox/User:Alsang/PassivePotionList: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
(add it table classes to differentiate NA data from unknown data)
(thousand sepatating commas)
 
(One intermediate revision by the same user not shown)
Line 2: Line 2:
local param = require( 'Module:Paramtest' )
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()
require("Module:Mw.html extension")




Line 177: Line 179:
:tag('td')
:tag('td')
:IF(item.hasBuy)
:IF(item.hasBuy)
:css{ ['text-align'] = 'center' }
:wikitext(item.lvl)
:wikitext(item.lvl)
:ELSE()
:ELSE()
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:END()
:END()
Line 199: Line 203:
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:attr{ colspan = '10' }
:attr{ colspan = '10' }
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:done()
:done()
Line 214: Line 219:
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:attr{ colspan = '10' }
:attr{ colspan = '10' }
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:done()
:done()
Line 231: Line 237:
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:attr{ colspan = '10' }
:attr{ colspan = '10' }
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:done()
:done()
Line 241: Line 248:
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:attr{ colspan = '10' }
:attr{ colspan = '10' }
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:done()
:done()
Line 250: Line 258:
:ELSE()
:ELSE()
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:END()
:END()
Line 256: Line 265:
:tag('td')
:tag('td')
:IF(item.hasXP and item.hasDuration)
:IF(item.hasXP and item.hasDuration)
:wikitext(item.XPPerHour)
:wikitext(lang:formatNum(tonumber(item.XPPerHour)))
:ELSE()
:ELSE()
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:END()
:END()
Line 269: Line 279:
:addClass('table-bg-grey')
:addClass('table-bg-grey')
:attr{ colspan = '10' }
:attr{ colspan = '10' }
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:wikitext('unknown')
:done()
:done()

Latest revision as of 00:21, 28 November 2024

Documentation for this module may be created at Module:Sandbox/User:Alsang/PassivePotionList/doc

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)
    		-- 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 KP = item.KP 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)
					:wikitext(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
					:wikitext(currency_cell(item.buy+200*item.profit))
					--:wikitext(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)
				:wikitext(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)
				:wikitext(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)
				:wikitext(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