Editing Module:Sandbox/User:Alsang/PotionList

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
require('Module:Mw.html extension')
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')


local p = {}
local p = {}


Line 13: Line 8:
'[[Category:Potions]]',
'[[Category:Potions]]',
'[[Uses facility::Standard Potion Station||Potent Potion Station]]',
'[[Uses facility::Standard Potion Station||Potent Potion Station]]',
'[[Uses item.Uses item::Brown Kelp]]', -- restrict for testing
'?Profession Level A = lvl',
'?Profession Level A = lvl',
'? #- = name',
'? #- = name',
'?Uses item.Uses item #- = reagents',
'?Uses item.Uses item #- = reagents',
'?Value = sell',
'?Value = sell',
'?Activity XP = brewXP',
'?Recipe XP = brewXP',
'?Uses item.Activity XP = prepXP',
'?Uses item.Recipe XP = prepXP',
'?Activity KP = brewKP',
'?Recipe KP = brewKP',
'?Uses item.Activity KP = prepKP',
'?Uses item.Recipe KP = prepKP',
'?Activity duration = brewDuration',
'?Recipe duration = brewDuration',
'?Uses item.Activity duration = prepDuration',
'?Uses item.Recipe duration = prepDuration',
'sort = Profession Level A'
'sort = Profession Level A'
}
}
local results = mw.smw.ask(query)
local results = mw.smw.ask(query)
results = p.formatResults(results)
local results = p.calculateValues(results)


return p.displayTable(results)
--return p.displayTable(results)
return '<pre>' ..mw.text.jsonEncode(results, mw.text.JSON_PRETTY).. '</pre>'
end
end


-- any values not directly returned by the query
-- makes the html for the cells containing currency directly, no tags needed
function p.calculateValues(results)
-- 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
-- iterate through potions
Line 60: Line 46:
item.buy = 20
item.buy = 20
for j, reagent in ipairs(item.reagents) do
for j, reagent in ipairs(item.reagents) do
--shamelessley lifted from Module:Products
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent .. ']]|?Shop buy price|mainlabel=' .. reagent
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent .. ']]|?Shop buy price|mainlabel=' .. reagent
local shopPriceResult = mw.smw.ask(shopPriceQuery) or {}
local shopPriceResult = mw.smw.ask(shopPriceQuery) or {}
Line 73: Line 58:
end
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
-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 potions
-- sanitise data, set to 0 if its not there
local lvl = item.lvl or '?'
item.duration = item.prepDuration + item.brewDuration + 40/12
local buy = item.buy or 0
item.XPPerHour = item.XP / item.duration * 3600
local sell = item.sell or 0
item.KPPerHour = item.KP / item.duration * 3600 / 100
local brewXP = item.brewXP or 0
item.profitPerHour = item.profit / item.duration * 3600
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
end


Line 144: Line 76:
-- make the table
-- make the table
function p.displayTable(results)
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
table.insert(out, '|}')
return out
return table.concat(out, '\n')
end
end


Please note that all contributions to Brighter Shores Wiki are considered to be released under the CC BY-NC-SA 3.0 (see Brighter Shores:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template