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 search = require('Module:RecipeTreeSearch') |
|||
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() |
||
require("Module:Mw.html extension") |
|||
local p = {} |
local p = {} |
||
Line 10: | Line 10: | ||
-- 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) |
||
results = p.formatResults(results) |
results = p.formatResults(results) |
||
return p.displayTable(results) |
return p.displayTable(results) |
||
--for debugging |
|||
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>' |
|||
end |
end |
||
-- makes the html for the cells containing currency directly |
-- 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 |
|||
-- Replaces nil with an "unknown" cell |
|||
local function currency_cell(amount) |
local function currency_cell(amount) |
||
if not amount then |
|||
return mw.html.create('td') |
|||
:addClass('table-bg-gray') |
|||
:css{ ['text-align'] = 'center' } |
|||
:attr{ colspan = '10' } |
|||
:wikitext("''unknown''") |
|||
:done() |
|||
end |
|||
return currency._cell(amount, { html = 'yes' }) |
return currency._cell(amount, { html = 'yes' }) |
||
end |
end |
||
Line 51: | Line 44: | ||
function p.formatResults(results) |
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 |
|||
-- 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 |
|||
-- direct values |
|||
item.sell = item.sell and item.outputQuantity and item.sell * item.outputQuantity |
|||
--shamelessley lifted from Module:Products |
|||
item.profit = item.sell and item.buy and item.sell - item.buy |
|||
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent .. ']]|?Shop buy price|mainlabel=' .. reagent |
|||
item.profitPerXP = item.profit and item.XP and math.floor(item.profit / item.XP * 100) / 100 |
|||
local shopPriceResult = mw.smw.ask(shopPriceQuery) or {} |
|||
local shopPrice = 0 |
|||
if shopPriceResult[1] and shopPriceResult[1]["Shop buy price"] then |
|||
-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 potions |
|||
shopPrice = tonumber(shopPriceResult[1]["Shop buy price"]) or 0 |
|||
local batchSize = 12 |
|||
end |
|||
local downtime = 40 |
|||
item.duration = item.duration and item.duration + downtime/batchSize |
|||
item.buy = item.buy + shopPrice |
|||
item.productPerHour = item.duration and 1 / item.duration * 3600 |
|||
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 |
|||
-- properties per hour |
|||
local batchSize = 12 |
|||
item.XPPerHour = item.XP and item.productPerHour and math.floor(item.XP * item.productPerHour) |
|||
local downtime = 40 |
|||
item.profitPerHour = item.profit and item.productPerHour and math.floor(item.profit * item.productPerHour) |
|||
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 |
end |
||
return results |
|||
end |
end |
||
-- 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') |
||
:tag('tr') |
:tag('tr') |
||
Line 90: | Line 122: | ||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
: |
:wikitext('Potion') |
||
:wikitext('Product') |
|||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
:wikitext(' |
:wikitext('Reagents (plus bottle)') |
||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
Line 123: | Line 154: | ||
:done() |
:done() |
||
:done() |
:done() |
||
local unknown_value_cell = mw.html.create('td') |
|||
for i,item in ipairs(results) do |
|||
:addClass('table-bg-gray') |
|||
:css{ ['text-align'] = 'center' } |
|||
-- need to generate the text for the reagent cell before starting the row |
|||
:wikitext("''unknown''") |
|||
local reagentCell = '' |
|||
for j, reagent in ipairs(item.reagents) do |
|||
reagentCell = reagentCell .. '[[File:' .. reagent .. '.png|30px|link=' .. reagent .. ']] [[' .. reagent .. ']]<br>' |
|||
local row = out:tag('tr') |
|||
end |
|||
:IF(item.lvl) |
|||
:tag('td') |
|||
out |
|||
:tag('tr') |
|||
:tag('td') |
|||
:IF(item.hasBuy) |
|||
:css{ ['text-align'] = 'center' } |
:css{ ['text-align'] = 'center' } |
||
:wikitext(item.lvl) |
:wikitext(item.lvl) |
||
: |
:ELSE() |
||
:addClass('table-bg-grey') |
|||
:ELSE() |
|||
:css{ ['text-align'] = 'center' } |
|||
:node(unknown_value_cell) |
|||
: |
:wikitext('unknown') |
||
:END() |
|||
:tag('td') |
|||
:css{ ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' } |
|||
:attr{ ['data-sort-value'] = item.name } |
|||
:wikitext(item.outputQuantity .. ' ×') |
|||
:done() |
:done() |
||
:tag('td') |
:tag('td') |
||
:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]') |
|||
:addClass('plinkt-image no-border') |
|||
:css{ ['border-left'] = '0', ['padding-left'] = '0' } |
|||
:wikitext('[[File:' .. item.name .. '.png|link=' .. item.name .. '|30px]]') |
|||
:done() |
:done() |
||
:tag('td') |
:tag('td') |
||
:wikitext(reagentCell) |
|||
:addClass('plinkt-link no-border') |
|||
:wikitext('[[' .. item.name .. ']]') |
|||
:done() |
:done() |
||
:IF(item.hasBuy) |
|||
local materialCell = row:tag('td') |
|||
:wikitext(currency_cell(item.buy)) |
|||
:ELSE() |
|||
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>') |
|||
end |
|||
row |
|||
:node(currency_cell(item.buy)) |
|||
:node(currency_cell(item.sell)) |
|||
:node(currency_cell(item.profit)) |
|||
:node(currency_cell(item.profitPerHour)) |
|||
:IF(item.XP) |
|||
:tag('td') |
:tag('td') |
||
:addClass('table-bg-grey') |
|||
:wikitext(item.XP and lang:formatNum(tonumber(item.XP))) |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
:done() |
||
:END() |
|||
:IF(item.hasSell) |
|||
:wikitext(currency_cell(item.sell)) |
|||
:ELSE() |
:ELSE() |
||
: |
:tag('td') |
||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
|||
:END() |
:END() |
||
:IF(item. |
:IF(item.hasProfit) |
||
:wikitext(currency_cell(item.profit)) |
|||
:ELSE() |
|||
:tag('td') |
:tag('td') |
||
:addClass('table-bg-grey') |
|||
:wikitext(item.XPPerHour and lang:formatNum(tonumber(item.XPPerHour))) |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
:done() |
||
:END() |
|||
:IF(item.hasProfit and item.hasDuration) |
|||
:wikitext(currency_cell(item.profitPerHour)) |
|||
:ELSE() |
:ELSE() |
||
: |
:tag('td') |
||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
|||
:END() |
:END() |
||
:tag('td') |
|||
:node(currency_cell(item.profitPerXP)) |
|||
: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() |
:done() |
||
end |
end |
||
return out |
return out |
||
end |
end |