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
(not saved progress in a while)
 
(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)
(6 intermediate revisions by the same user not shown)
Line 1:
require('Module:Mw.html extension')
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')
 
 
local p = {}
 
Line 8 ⟶ 13:
'[[Category:Potions]]',
'[[Uses facility::Standard Potion Station||Potent Potion Station]]',
'[[Uses item.Uses item::Brown Kelp]]', -- restrict for testing
'?Profession Level A = lvl',
'? #- = name',
'?Uses item.Uses item #- = reagents',
'?Value = sell',
'?RecipeActivity XP = brewXP',
'?Uses item.RecipeActivity XP = prepXP',
'?RecipeActivity KP = brewKP',
'?Uses item.RecipeActivity KP = prepKP',
'?RecipeActivity duration = brewDuration',
'?Uses item.RecipeActivity duration = prepDuration',
'sort = Profession Level A'
}
local results = mw.smw.ask(query)
local results = p.calculateValuesformatResults(results)
 
--return p.displayTable(results)
return '<pre>' ..mw.text.jsonEncode(results, mw.text.JSON_PRETTY).. '</pre>'
end
 
-- makes the html for the cells containing currency directly, no tags needed
-- any values not directly returned by the query
-- flag is for if the number should not be known, replaces with zero
function p.calculateValues(results)
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
Line 46 ⟶ 60:
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 {}
Line 58 ⟶ 73:
end
item.profit = item.sell - item.buy
item.XP = item.brewXP + item.prepXP
item.KP = item.brewKP + item.prepKP
item.profitPerXP = item.profit / item.XP
-- sanitise data, set to 0 if its not there
-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 potions
item.durationlocal lvl = item.prepDuration + item.brewDurationlvl +or 40/12'?'
item.XPPerHourlocal buy = item.XP / item.durationbuy *or 36000
item.KPPerHourlocal sell = item.KP / item.duration * 3600sell /or 1000
item.profitPerHourlocal brewXP = item.profit / item.durationbrewXP *or 36000
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
 
Line 76 ⟶ 144:
-- make the table
function p.displayTable(results)
local currency = require('Module:Currency').parse
local out = {}
table.insert(out, '{| class="wikitable sortable"')
local headerRow = {}
table.insert(headerRow, '! Level')
table.insert(headerRow, '!! Potion')
table.insert(headerRow, '!! Reagents (plus bottle)')
table.insert(headerRow, '!! colspan="10" | Buy Value')
table.insert(headerRow, '!! colspan="10" | Sell Value')
table.insert(headerRow, '!! colspan="10" | Profit Value')
table.insert(headerRow, '!! XP')
table.insert(headerRow, '!! KP')
table.insert(headerRow, '!! colspan="10" | Profit/XP')
table.insert(headerRow, '!! XP/hr')
table.insert(headerRow, '!! KP/hr')
table.insert(headerRow, '!! colspan="10" | Profit/hr')
table.insert(out, table.concat(headerRow, ' '))
table.insert(headerRow, '|-')
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
table.insert(out, '|}')
return table.concat(out, '\n')
end
 
960

edits