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

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
(allow both passive potions and ebsworth work to appear on the same table)
(thousand sepatating commas)
 
(2 intermediate revisions 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 15: Line 17:
'? #- = name',
'? #- = name',
'?Uses item #- = reagents',
'?Uses item #- = reagents',
'?Value = sell',
'?Value #- = sell',
'?Activity coins = coins',
'?Activity coins = coins',
'?Activity XP = XP',
'?Activity XP = XP',
Line 28: Line 30:
return p.displayTable(results)
return p.displayTable(results)
--for debugging
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'


Line 33: Line 36:


-- makes the html for the cells containing currency directly, no tags needed
-- makes the html for the cells containing currency directly, no tags needed
local function currency_cell(amount)
-- flag is for if the number should not be known, replaces with zero
return currency._cell(amount, { html = 'yes' })
local function currency_cell(amount,flag)
local a = {}
if flag then
a = currency._cell(amount, { html = 'yes' })
else
a = currency._cell(0, { html = 'yes' }) -- replace this with blank, if I can figure out how to
end
return a
end
end


Line 84: Line 80:
-- flags for if data values should be shown
-- flags for if data values should be shown
item.hasLvl = param.has_content(item.lvl)
item.hasBuy = param.has_content(item.buy)
item.hasBuy = param.has_content(item.buy)
item.hasSell = param.has_content(item.sell)
item.hasSell = param.has_content(item.sell)
Line 94: Line 91:
item.profit = sell - buy
item.profit = sell - buy
else
else
item.profit = (sell - buy )*0.005 -- passive potions all have quantity 0.005 per action
item.profit = (sell - buy)*0.005 -- passive potions all have quantity 0.005 per action
end
end
Line 116: Line 113:
item.profitPerHour = math.floor(item.profit * item.potionPerHour)
item.profitPerHour = math.floor(item.profit * item.potionPerHour)
-- XP/KP strings, if the requisite data isnt there then display "unknown"
if item.hasXP then
item.XP = item.XP -- format to include commas
else
item.XP = 'Unknown'
end
if item.hasXP and item.hasDuration then
item.XPPerHour = item.XPPerHour -- format to include commas
else
item.XPPerHour = 'Unknown'
end
end
end


Line 184: Line 167:
-- if its not ebsworth work, need a list of reagents
-- if its not ebsworth work, need a list of reagents
local reagentCell = ''
local reagentCell = ''
if item.variant=='Ebsworth Work' then
if not(item.variant=='Ebsworth Work') then
reagentCell = 'N/A'
else
-- need to generate the text for the reagent cell before starting the row
-- need to generate the text for the reagent cell before starting the row
for j, reagent in ipairs(item.reagents) do
for j, reagent in ipairs(item.reagents) do
reagentCell = reagentCell .. '[[File:' .. reagent .. '.png|30px|link=' .. reagent .. ']] [[' .. reagent .. ']]<br>'
reagentCell = reagentCell .. '[[File:' .. reagent .. '.png|30px|link=' .. reagent .. ']] [[' .. reagent .. ']]<br>'
end
end
end
end
out
out
:tag('tr')
:tag('tr')
:tag('td')
:tag('td')
:IF(item.hasBuy)
:css{ ['text-align'] = 'center' }
:css{ ['text-align'] = 'center' }
:wikitext(item.lvl)
:wikitext(item.lvl)
:ELSE()
:addClass('table-bg-grey')
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:END()
:done()
:done()
:tag('td')
:tag('td')
:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]')
:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]')
:done()
: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')
:tag('td')
:wikitext(reagentCell)
:IF(item.hasXP)
:wikitext(item.XP)
:ELSE()
:addClass('table-bg-grey')
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:END()
:done()
:done()
:wikitext(currency_cell(item.buy,item.hasBuy))
:wikitext(currency_cell(item.sell,item.hasSell))
:wikitext(currency_cell(item.profit,item.hasProfit))
:wikitext(currency_cell(item.profitPerHour,item.hasProfit and item.hasDuration))
:tag('td')
:tag('td')
:wikitext(item.XP)
: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()
:done()
:tag('td')
:wikitext(item.XPPerHour)
:IF(item.hasXP and item.hasProfit)
:wikitext(currency_cell(item.profitPerXP))
:done()
:ELSE()
:wikitext(currency_cell(item.profitPerXP,item.hasXP and item.hasProfit))
:tag('td')
:addClass('table-bg-grey')
:attr{ colspan = '10' }
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
:done()
:END()
: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