Module:Sandbox/User:Alsang/PotionList: Difference between revisions
(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) |
(remove vestigial KP per hour calcs, add in thousands separator 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 35: | Line 37: | ||
-- makes the html for the cells containing currency directly, no tags needed |
-- 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 |
-- flag is for if the number should not be known, replaces with zero |
||
local function currency_cell(amount |
local function currency_cell(amount) |
||
return currency._cell(amount, { html = 'yes' }) |
|||
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 103: | Line 99: | ||
-- 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 110: | Line 107: | ||
item.hasDuration = param.has_content(item.brewDuration) and param.has_content(item.prepDuration) |
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 |
end |
||
Line 183: | Line 153: | ||
:wikitext('Coins/XP') |
:wikitext('Coins/XP') |
||
:done() |
:done() |
||
--:tag('th') |
|||
-- :wikitext('KP') |
|||
--:done() |
|||
--:tag('th') |
|||
-- :wikitext('KP/hr') |
|||
--:done() |
|||
:done() |
:done() |
||
Line 202: | Line 166: | ||
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() |
||
:tag('td') |
:tag('td') |
||
:wikitext(reagentCell) |
:wikitext(reagentCell) |
||
:done() |
:done() |
||
:wikitext(currency_cell(item.buy,item.hasBuy)) |
|||
: |
:IF(item.hasBuy) |
||
:wikitext(currency_cell(item. |
:wikitext(currency_cell(item.buy)) |
||
:ELSE() |
|||
:wikitext(currency_cell(item.profitPerHour,item.hasProfit and item.hasDuration)) |
|||
:tag('td') |
|||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
|||
:END() |
|||
:IF(item.hasSell) |
|||
:wikitext(currency_cell(item.sell)) |
|||
:ELSE() |
|||
:tag('td') |
|||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
: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') |
||
: |
:IF(item.hasXP) |
||
:wikitext(lang:formatNum(tonumber(item.XP))) |
|||
:ELSE() |
|||
:addClass('table-bg-grey') |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:END() |
|||
:done() |
:done() |
||
:tag('td') |
: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() |
:done() |
||
:wikitext(currency_cell(item.profitPerXP,item.hasXP and item.hasProfit)) |
|||
:IF(item.hasXP and item.hasProfit) |
|||
--:tag('td') |
|||
:wikitext(currency_cell(item.profitPerXP)) |
|||
:ELSE() |
|||
:tag('td') |
|||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
--:done() |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
|||
:END() |
|||
:done() |
:done() |
||
Latest revision as of 00:20, 28 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 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 = {
'[[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)
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
--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.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.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)
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()
: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')
: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()
: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)
:wikitext(currency_cell(item.sell))
:ELSE()
:tag('td')
:addClass('table-bg-grey')
:attr{ colspan = '10' }
:css{ ['text-align'] = 'center' }
:wikitext('unknown')
: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(lang:formatNum(tonumber(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