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

(mostly done, minor formatting left (commas in numbes, decimal places, zero currency replacement))
(rename the SMW properties "Recipe XP", "Recipe KP", and "Recipe duration" to "Activity XP", "Activity KP", and "Activity duration" so they can generate the same fields as Template:Profession info)
 
(2 intermediate revisions by the same user not shown)
Line 17: Line 17:
'?Uses item.Uses item #- = reagents',
'?Uses item.Uses item #- = reagents',
'?Value = sell',
'?Value = sell',
'?Recipe XP = brewXP',
'?Activity XP = brewXP',
'?Uses item.Recipe XP = prepXP',
'?Uses item.Activity XP = prepXP',
'?Recipe KP = brewKP',
'?Activity KP = brewKP',
'?Uses item.Recipe KP = prepKP',
'?Uses item.Activity KP = prepKP',
'?Recipe duration = brewDuration',
'?Activity duration = brewDuration',
'?Uses item.Recipe duration = prepDuration',
'?Uses item.Activity duration = prepDuration',
'sort = Profession Level A'
'sort = Profession Level A'
}
}
Line 113: Line 113:
-- XP/KP strings, if the requisite data isnt there then display "unknown"
-- XP/KP strings, if the requisite data isnt there then display "unknown"
if item.hasXP then
if item.hasXP then
item.xp = tostring(item.xp) -- format to include commas
--item.xp = lang:formatNum(item.xp) -- format to include commas
item.XP = item.XP -- format to include commas
else
else
item.XP = 'Unknown'
item.XP = 'Unknown'
Line 119: Line 120:
if item.hasKP then
if item.hasKP then
item.KP = tostring(item.KP) .. '%' -- want 1 decimal place
item.KP = item.KP .. '%' -- want 1 decimal place
else
else
item.KP = 'Unknown'
item.KP = 'Unknown'
Line 125: Line 126:
if item.hasXP and item.hasDuration then
if item.hasXP and item.hasDuration then
item.XPPerHour = tostring(item.XPPerHour) -- format to include commas
item.XPPerHour = item.XPPerHour -- format to include commas
else
else
item.XPPerHour = 'Unknown'
item.XPPerHour = 'Unknown'
Line 131: Line 132:
if item.hasKP and item.hasDuration then
if item.hasKP and item.hasDuration then
item.KPPerHour = tostring(item.KPPerHour) -- want 2 decimal places
item.KPPerHour = item.KPPerHour -- want 2 decimal places
else
else
item.KPPerHour = 'Unknown'
item.KPPerHour = 'Unknown'
Line 148: Line 149:
:tag('tr')
:tag('tr')
:tag('th')
:tag('th')
:wikitext('Level')
:wikitext('[[File:Alchemist small icon.png|15px]] Level')
:done()
:done()
:tag('th')
:tag('th')
Line 180: Line 181:
:tag('th')
:tag('th')
:attr{ colspan = '10' }
:attr{ colspan = '10' }
:wikitext('Profit/XP')
:wikitext('Coins/XP')
:done()
:tag('th')
:wikitext('KP')
:done()
:tag('th')
:wikitext('KP/hr')
:done()
:done()
--:tag('th')
-- :wikitext('KP')
--:done()
--:tag('th')
-- :wikitext('KP/hr')
--:done()
:done()
:done()
Line 202: Line 203:
:tag('tr')
:tag('tr')
:tag('td')
:tag('td')
:css{ ['text-align'] = 'center' }
:wikitext('[[File:Alchemist small icon.png|15px]] ' .. item.lvl)
:wikitext(item.lvl)
:done()
:done()
:tag('td')
:tag('td')
Line 215: Line 217:
:wikitext(currency_cell(item.profitPerHour,item.hasProfit and item.hasDuration))
:wikitext(currency_cell(item.profitPerHour,item.hasProfit and item.hasDuration))
:tag('td')
:tag('td')
:wikitext(item.XP,item.hasXP)
:wikitext(item.XP)
:done()
:done()
:tag('td')
:tag('td')
Line 221: Line 223:
:done()
:done()
:wikitext(currency_cell(item.profitPerXP,item.hasXP and item.hasProfit))
:wikitext(currency_cell(item.profitPerXP,item.hasXP and item.hasProfit))
:tag('td')
--:tag('td')
:wikitext(item.KP)
-- :wikitext(item.KP)
:done()
--:done()
:tag('td')
--:tag('td')
:wikitext(item.KPPerHour)
-- :wikitext(item.KPPerHour)
:done()
--:done()
:done()
:done()

Latest revision as of 19:12, 27 November 2024

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

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


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 = {
		'[[Category:Potions]]',
		'[[Uses facility::Standard Potion Station||Potent Potion Station]]',
		'?Profession Level A = lvl',
		'? #- = name',
		'?Uses item.Uses item #- = reagents',
		'?Value = sell',
		'?Activity XP = brewXP',
		'?Uses item.Activity XP = prepXP',
		'?Activity KP = brewKP',
		'?Uses item.Activity KP = prepKP',
		'?Activity duration = brewDuration',
		'?Uses item.Activity duration = prepDuration',
		'sort = Profession Level A'
	}
	local results = mw.smw.ask(query)
	
	results = p.formatResults(results)

	return p.displayTable(results)
	
end

-- makes the html for the cells containing currency directly, no tags needed
-- flag is for if the number should not be known, replaces with zero
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

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

    -- iterate through potions
    for i, item in ipairs(results) do
    	
    	--in case of single reagent potions, make table of 1 element
    	if type(item.reagents) ~= 'table' then
    		item.reagents = {item.reagents}
    	end
    	
    	-- 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
    	
    	
    	-- 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 brewXP = item.brewXP or 0
    	local prepXP = item.prepXP or 0
    	local brewKP = item.brewKP or 0
    	local prepKP = item.prepKP or 0
    	local brewDuration = item.brewDuration or 0
    	local prepDuration = item.prepDuration or 0
    	
    	-- direct values
    	item.profit = sell - buy 
   		item.XP = brewXP  + prepXP 
    	item.KP = brewKP + prepKP 
    	item.profitPerXP = math.floor(item.profit / item.XP * 100) / 100

    	-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 potions
    	local batchSize = 12
    	local downtime = 40
    	item.duration = prepDuration + brewDuration + downtime/batchSize
    	item.potionPerHour = 1 / item.duration * 3600
    	
    	-- properties per hour
    	item.XPPerHour = math.floor(item.XP * item.potionPerHour)
    	item.KPPerHour = math.floor(item.KP * item.potionPerHour) / 100
    	item.profitPerHour = math.floor(item.profit * item.potionPerHour)
    	
    	-- flags for if data values should be shown
    	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.brewXP) and param.has_content(item.prepXP)
    	item.hasKP = param.has_content(item.brewKP) and param.has_content(item.prepKP)
    	item.hasDuration = param.has_content(item.brewDuration) and param.has_content(item.prepDuration)
    	
		
		-- XP/KP strings, if the requisite data isnt there then display "unknown"
		if item.hasXP then 
			--item.xp = lang:formatNum(item.xp) -- format to include commas
			item.XP = item.XP -- format to include commas
		else
    		item.XP = 'Unknown'
		end
		
		if item.hasKP  then 
    		item.KP = item.KP .. '%' -- want 1 decimal place
    	else
    		item.KP = 'Unknown'
		end
		
		if item.hasXP and item.hasDuration then 
    		item.XPPerHour = item.XPPerHour -- format to include commas
    	else
    		item.XPPerHour = 'Unknown'
		end
		
		if item.hasKP and item.hasDuration then 
    		item.KPPerHour =  item.KPPerHour -- want 2 decimal places
    	else
    		item.KPPerHour = 'Unknown'
		end
		
	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')
			: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()
			--:tag('th')
			--	:wikitext('KP')
			--:done()
			--:tag('th')
			--	:wikitext('KP/hr')
			--:done()
		:done()
		
	
	for i,item in ipairs(results) do
		
		-- need to generate the text for the reagent cell before starting the row	
		local reagentCell = ''
		for j, reagent in ipairs(item.reagents) do
			reagentCell = reagentCell .. '[[File:' .. reagent .. '.png|30px|link=' .. reagent .. ']] [[' .. reagent .. ']]<br>'
		end
		
	out
		:tag('tr')
			:tag('td')
				:css{ ['text-align'] = 'center' }
				:wikitext(item.lvl)
			:done()
			:tag('td')
				:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]')
			:done()
			:tag('td')
				:wikitext(reagentCell)
			: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')
				:wikitext(item.XP)
			:done()
			:tag('td')
				:wikitext(item.XPPerHour)
			:done()
			:wikitext(currency_cell(item.profitPerXP,item.hasXP and item.hasProfit))
			--:tag('td')
			--	:wikitext(item.KP)
			--:done()
			--:tag('td')
			--	:wikitext(item.KPPerHour)
			--:done()
		:done()
		
	end
	
	return out
end

return p