Editing Module:Sandbox/User:Alsang/PotionList
Jump to navigation
Jump to search
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', |
||
'? |
'?Recipe XP = brewXP', |
||
'?Uses item. |
'?Uses item.Recipe XP = prepXP', |
||
'? |
'?Recipe KP = brewKP', |
||
'?Uses item. |
'?Uses item.Recipe KP = prepKP', |
||
'? |
'?Recipe duration = brewDuration', |
||
'?Uses item. |
'?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. |
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 |
|||
item.duration = item.prepDuration + item.brewDuration + 40/12 |
|||
item.XPPerHour = item.XP / item.duration * 3600 |
|||
item.KPPerHour = item.KP / item.duration * 3600 / 100 |
|||
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 |
||