Editing Module:AlchemistList
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('strict') |
|||
require('Module:Mw.html extension') |
require('Module:Mw.html extension') |
||
local |
local param = require('Module:Paramtest') |
||
local param = require( 'Module:Paramtest' ) |
|||
local currency = require('Module:Currency') |
local currency = require('Module:Currency') |
||
local lang = mw.getContentLanguage() |
local lang = mw.getContentLanguage() |
||
local p = {} |
local p = {} |
||
Line 10: | Line 9: | ||
-- non dynamic module, no inputs |
-- non dynamic module, no inputs |
||
function p.main() |
function p.main() |
||
-- returns only directly needed parameter needed for the row, |
|||
-- returns almost every parameter needed for the row, except buy values for reagents |
|||
-- other parameters are determined by subqueries of chained pages |
|||
local query = { |
local query = { |
||
'[[Category:Potions]]', |
|||
'[[Uses facility::Standard Potion Station||Potent Potion Station]]', |
'[[Uses facility::Standard Potion Station||Potent Potion Station]]', |
||
'?Profession Level A = lvl', |
'?Profession Level A = lvl', |
||
'? #- = name', |
'? #- = name', |
||
'? |
'?Uses item.Uses item #- = reagents', |
||
'?Activity XP = XP', |
|||
'?Activity duration = duration', |
|||
'?Value = sell', |
'?Value = sell', |
||
' |
'?Activity XP = brewXP', |
||
'?Uses item.Activity XP = prepXP', |
|||
'limit = 500' |
|||
'?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) |
local results = mw.smw.ask(query) |
||
Line 28: | Line 31: | ||
return p.displayTable(results) |
return p.displayTable(results) |
||
--for debugging |
|||
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>' |
|||
end |
end |
||
Line 36: | Line 36: | ||
-- makes the html for the cells containing currency directly |
-- makes the html for the cells containing currency directly |
||
-- Replaces nil with an "unknown" cell |
-- Replaces nil with an "unknown" cell |
||
local function currency_cell(amount) |
local function currency_cell(amount, rowspan) |
||
rowspan = rowspan or 1 |
|||
if rowspan <= 1 then rowspan = nil end |
|||
if not amount then |
if not amount then |
||
return mw.html.create('td') |
return tostring(mw.html.create('td') |
||
:addClass('table-bg-gray') |
:addClass('table-bg-gray') |
||
:css{ ['text-align'] = 'center' } |
:css{ ['text-align'] = 'center' } |
||
:attr{ colspan = '10' } |
:attr{ colspan = '10', rowspan = rowspan } |
||
:wikitext("''unknown''") |
:wikitext("''unknown''") |
||
:done() |
:done()) |
||
end |
end |
||
return currency._cell(amount, { html = 'yes' }) |
return currency._cell(amount, { html = 'yes', rowspan = rowspan }) |
||
end |
end |
||
Line 51: | Line 53: | ||
function p.formatResults(results) |
function p.formatResults(results) |
||
-- iterate through |
-- iterate through potions |
||
for |
for i, item in ipairs(results) do |
||
--in case of single reagent potions, make table of 1 element |
|||
-- New module for recipe searching |
|||
if type(item.reagents) ~= 'table' then |
|||
local fullRecipe = search.main(item.name) |
|||
item. |
item.reagents = {item.reagents} |
||
end |
|||
item.outputQuantity = fullRecipe.output[1].quantity |
|||
item.buy = fullRecipe.buyPrice |
|||
-- iterate through reagents, adding buy price to running total (individuals not needed) |
|||
item.XP = fullRecipe.xp |
|||
-- starting value 20 is for bottle |
|||
item.duration = fullRecipe.duration |
|||
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 |
-- direct values |
||
item.sell = item.sell and item.outputQuantity and item.sell * item.outputQuantity |
|||
item.profit = item.sell and item.buy and item.sell - item.buy |
item.profit = item.sell and item.buy and item.sell - item.buy |
||
item.XP = item.brewXP and item.prepXP and item.brewXP + item.prepXP |
|||
item.KP = item.brewKP and item.prepKP and item.brewKP + item.prepKP |
|||
item.profitPerXP = item.profit and item.XP and math.floor(item.profit / item.XP * 100) / 100 |
item.profitPerXP = item.profit and item.XP and math.floor(item.profit / item.XP * 100) / 100 |
||
Line 70: | Line 98: | ||
local batchSize = 12 |
local batchSize = 12 |
||
local downtime = 40 |
local downtime = 40 |
||
item.duration = item. |
item.duration = item.prepDuration and item.brewDuration and item.prepDuration + item.brewDuration + downtime/batchSize |
||
item. |
item.potionPerHour = item.duration and 1 / item.duration * 3600 |
||
-- properties per hour |
-- properties per hour |
||
item.XPPerHour = item.XP and item. |
item.XPPerHour = item.XP and item.potionPerHour and math.floor(item.XP * item.potionPerHour) |
||
item. |
item.KPPerHour = item.KP and item.potionPerHour and math.floor(item.KP * item.potionPerHour) / 100 |
||
item.profitPerHour = item.profit and item.potionPerHour and math.floor(item.profit * item.potionPerHour) |
|||
end |
end |
||
Line 83: | Line 112: | ||
-- make the table |
-- make the table |
||
function p.displayTable(results) |
function p.displayTable(results) |
||
local out = mw.html.create('table') |
local out = mw.html.create('table') |
||
:addClass('wikitable sortable') |
:addClass('wikitable sortable') |
||
Line 90: | Line 120: | ||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
: |
:wikitext('Potion') |
||
:wikitext('Product') |
|||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
: |
:attr{ colspan = '2' } |
||
:wikitext('Reagents (plus bottle)') |
|||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
Line 124: | Line 154: | ||
:done() |
:done() |
||
for i,item in ipairs(results) do |
|||
local unknown_value_cell = mw.html.create('td') |
|||
local rowspan = #item.reagents |
|||
:addClass('table-bg-gray') |
|||
local function createReagentCell(i) |
|||
:css{ ['text-align'] = 'center' } |
|||
local reagent = item.reagents[i] |
|||
:wikitext("''unknown''") |
|||
local bottom_padding |
|||
local top_padding |
|||
if i ~= 1 then top_padding = '0' end |
|||
if i ~= rowspan then bottom_padding = '0' end |
|||
return tostring(mw.html.create('td') |
|||
for i, item in ipairs(results) do |
|||
:addClass('plinkt-image no-border') |
|||
local row = out:tag('tr') |
|||
:css{ |
|||
['border-top'] = top_padding, |
|||
['padding-top'] = top_padding, |
|||
['border-bottom'] = bottom_padding, |
|||
['padding-bottom'] = bottom_padding |
|||
} |
|||
:tag('span') |
|||
:addClass('inventory-image') |
|||
:wikitext(('[[File:%s.png|x30px|link=%s]]'):format(reagent, reagent)) |
|||
:done() |
|||
:done()) .. tostring(mw.html.create('td') |
|||
:addClass('plinkt-link no-border') |
|||
:css{ |
|||
['border-top'] = top_padding, |
|||
['padding-top'] = top_padding, |
|||
['border-bottom'] = bottom_padding, |
|||
['padding-bottom'] = bottom_padding |
|||
} |
|||
:wikitext(('[[%s]]'):format(reagent)) |
|||
:done()) |
|||
end |
|||
local unknown_value_cell = mw.html.create('td') |
|||
:addClass('table-bg-gray') |
|||
:css{ ['text-align'] = 'center' } |
|||
:attr{ rowspan = rowspan } |
|||
:wikitext("''unknown''") |
|||
out:tag('tr') |
|||
:IF(item.lvl) |
:IF(item.lvl) |
||
:tag('td') |
:tag('td') |
||
:css{ ['text-align'] = 'center' } |
:css{ ['text-align'] = 'center' } |
||
:attr{ rowspan = rowspan } |
|||
:wikitext(item.lvl) |
:wikitext(item.lvl) |
||
:done() |
:done() |
||
Line 141: | Line 205: | ||
:tag('td') |
:tag('td') |
||
:attr{ rowspan = rowspan } |
|||
:css{ ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' } |
|||
: |
:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]') |
||
:wikitext(item.outputQuantity .. ' ×') |
|||
:done() |
|||
:tag('td') |
|||
:addClass('plinkt-image no-border') |
|||
:css{ ['border-left'] = '0', ['padding-left'] = '0' } |
|||
:wikitext('[[File:' .. item.name .. '.png|link=' .. item.name .. '|30px]]') |
|||
:done() |
|||
:tag('td') |
|||
:addClass('plinkt-link no-border') |
|||
:wikitext('[[' .. item.name .. ']]') |
|||
:done() |
:done() |
||
:wikitext(createReagentCell(1)) |
|||
local materialCell = row:tag('td') |
|||
:wikitext(currency_cell(item.buy, rowspan)) |
|||
for i, _ in ipairs(item.materials) do |
|||
materialCell:wikitext(item.materials[i].quantity .. '× [[File:' .. item.materials[i].name .. '.png|18px|link=' .. item.materials[i].name .. ']] [[' .. item.materials[i].name .. ']]<br>') |
|||
:wikitext(currency_cell(item.sell, rowspan)) |
|||
end |
|||
:wikitext(currency_cell(item.profit, rowspan)) |
|||
row |
|||
:node(currency_cell(item.buy)) |
|||
: |
:wikitext(currency_cell(item.profitPerHour, rowspan)) |
||
:node(currency_cell(item.profit)) |
|||
:node(currency_cell(item.profitPerHour)) |
|||
:IF(item.XP) |
:IF(item.XP) |
||
:tag('td') |
:tag('td') |
||
:attr{ rowspan = rowspan } |
|||
:wikitext(item.XP and lang:formatNum(tonumber(item.XP))) |
:wikitext(item.XP and lang:formatNum(tonumber(item.XP))) |
||
:done() |
:done() |
||
Line 177: | Line 230: | ||
:IF(item.XPPerHour) |
:IF(item.XPPerHour) |
||
:tag('td') |
:tag('td') |
||
:attr{ rowspan = rowspan } |
|||
:wikitext(item.XPPerHour and lang:formatNum(tonumber(item.XPPerHour))) |
:wikitext(item.XPPerHour and lang:formatNum(tonumber(item.XPPerHour))) |
||
:done() |
:done() |
||
Line 183: | Line 237: | ||
:END() |
:END() |
||
: |
:wikitext(currency_cell(item.profitPerXP, rowspan)) |
||
:done() |
:done() |
||
for i = 2, rowspan do |
|||
out:tag('tr') |
|||
:wikitext(createReagentCell(i)) |
|||
:done() |
|||
end |
|||
end |
end |
||