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) |
||
Line 28: | Line 32: | ||
return p.displayTable(results) |
return p.displayTable(results) |
||
--for debugging |
|||
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>' |
|||
end |
end |
||
Line 38: | Line 39: | ||
local function currency_cell(amount) |
local function currency_cell(amount) |
||
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' } |
||
:wikitext("''unknown''") |
:wikitext("''unknown''") |
||
:done() |
:done()) |
||
end |
end |
||
return currency._cell(amount, { html = 'yes' }) |
return currency._cell(amount, { html = 'yes' }) |
||
Line 51: | Line 52: | ||
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 97: | ||
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 111: | ||
-- 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 119: | ||
: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 151: | ||
:done() |
:done() |
||
: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 |
|||
local unknown_value_cell = mw.html.create('td') |
local unknown_value_cell = mw.html.create('td') |
||
Line 129: | Line 166: | ||
:wikitext("''unknown''") |
:wikitext("''unknown''") |
||
out |
|||
for i, item in ipairs(results) do |
|||
:tag('tr') |
|||
:IF(item.lvl) |
:IF(item.lvl) |
||
:tag('td') |
:tag('td') |
||
Line 141: | Line 178: | ||
:tag('td') |
:tag('td') |
||
:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]') |
|||
: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(reagentCell) |
|||
: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(currency_cell(item.buy)) |
|||
local materialCell = row:tag('td') |
|||
:wikitext(currency_cell(item.sell)) |
|||
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.profit)) |
|||
end |
|||
:wikitext(currency_cell(item.profitPerHour)) |
|||
row |
|||
:node(currency_cell(item.buy)) |
|||
:node(currency_cell(item.sell)) |
|||
:node(currency_cell(item.profit)) |
|||
:node(currency_cell(item.profitPerHour)) |
|||
:IF(item.XP) |
:IF(item.XP) |
||
Line 183: | Line 209: | ||
:END() |
:END() |
||
: |
:wikitext(currency_cell(item.profitPerXP)) |
||
:done() |
:done() |
||
end |
end |
||