Module:AlchemistList: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
m (currency_cell now returns a node) |
(Makes use of the Infobox Recipe function to automatically find subrecipes and determine the list of raw ingredients, previously it did this manually. Reformatted the output to look more similar to the Products table.) |
||
Line 1: | Line 1: | ||
require('strict') |
require('strict') |
||
require('Module:Mw.html extension') |
require('Module:Mw.html extension') |
||
local recipe = require('Module:Infobox Recipe') -- to make use of its extensive material searching function |
|||
local param = require( 'Module:Paramtest' ) |
local param = require( 'Module:Paramtest' ) |
||
local currency = require('Module:Currency') |
local currency = require('Module:Currency') |
||
Line 9: | Line 10: | ||
-- non dynamic module, no inputs |
-- non dynamic module, no inputs |
||
function p.main() |
function p.main() |
||
-- returns |
-- returns only directly needed parameter needed for the row, |
||
-- 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', |
||
'? |
'?Recipe JSON = recipeJSON', |
||
⚫ | |||
⚫ | |||
'?Value = sell', |
'?Value = sell', |
||
' |
'sort = Profession Level A', |
||
'limit = 500' |
|||
'?Uses item.Activity XP = prepXP', |
|||
⚫ | |||
'?Uses item.Activity KP = prepKP', |
|||
⚫ | |||
'?Uses item.Activity duration = prepDuration', |
|||
'sort = Profession Level A' |
|||
} |
} |
||
local results = mw.smw.ask(query) |
local results = mw.smw.ask(query) |
||
Line 30: | Line 28: | ||
return p.displayTable(results) |
return p.displayTable(results) |
||
--for debugging |
|||
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>' |
|||
end |
end |
||
Line 52: | Line 53: | ||
-- iterate through potions |
-- iterate through potions |
||
for _, item in ipairs(results) do |
for _, item in ipairs(results) do |
||
-- recipe in a workable format |
|||
local unpackJSON = mw.text.jsonDecode(item.recipeJSON) |
|||
item.outputQuantity = unpackJSON.output[1].quantity |
|||
-- call the module:infobox recipe to extensively search for |
|||
--in case of single reagent potions, make table of 1 element |
|||
-- all raw materials (to add to prices) |
|||
if type(item.reagents) ~= 'table' then |
|||
-- all intermediate materials (for intermediate XP and duration) |
|||
⚫ | |||
local Materials = recipe._getTrueRawMaterials(unpackJSON.materials) |
|||
if next(Materials) ~= nil then |
|||
⚫ | |||
item.intermediates = Materials.intermediateMaterials |
|||
end |
end |
||
-- iterate through reagents, adding buy price to running total (individuals not needed) |
-- iterate through reagents, adding buy price to running total (individuals not needed) |
||
⚫ | |||
-- starting value 20 is for bottle |
|||
⚫ | |||
for _, reagent in ipairs(item.reagents) do |
for _, reagent in ipairs(item.reagents) do |
||
--shamelessley lifted from Module:Products |
--shamelessley lifted from Module:Products |
||
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent .. ']]|?Shop buy price|mainlabel=' .. reagent |
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent.name .. ']]|?Shop buy price|mainlabel=' .. reagent.name |
||
local shopPriceResult = mw.smw.ask(shopPriceQuery) or {} |
local shopPriceResult = mw.smw.ask(shopPriceQuery) or {} |
||
local shopPrice = 0 |
local shopPrice = 0 |
||
Line 70: | Line 78: | ||
if shopPriceResult[1] and shopPriceResult[1]["Shop buy price"] then |
if shopPriceResult[1] and shopPriceResult[1]["Shop buy price"] then |
||
shopPrice = tonumber(shopPriceResult[1]["Shop buy price"]) or 0 |
shopPrice = tonumber(shopPriceResult[1]["Shop buy price"]) or 0 |
||
else |
|||
item.buy = nil |
|||
end |
end |
||
item.buy = item.buy + shopPrice |
item.buy = item.buy and item.buy + shopPrice * reagent.quantity |
||
end |
end |
||
-- iterate through intermediaries to add to XP and duration parameters |
|||
for _, intermediate in ipairs(item.intermediates) do |
|||
-- look up activity XP and add it to running total |
|||
local XPQuery = '[[Recipe output::' .. intermediate.name .. ']]|?Activity XP|mainlabel=' .. intermediate.name |
|||
local XPResult = mw.smw.ask(XPQuery) or {} |
|||
local XPIncrease = 0 |
|||
if XPResult[1] and XPResult[1]["Activity XP"] then |
|||
XPIncrease = tonumber(XPResult[1]["Activity XP"]) or 0 |
|||
else |
|||
XPIncrease = nil |
|||
end |
|||
-- need to look up both the amount of the item used in this recipe and created in its own recipe to know how much of this xp to use |
|||
local QTYused = intermediate.quantity |
|||
local QTYQuery = '[[Recipe output::' .. intermediate.name .. ']]|?Recipe JSON|mainlabel=' .. intermediate.name |
|||
local QTYResult = mw.smw.ask(QTYQuery) or {} |
|||
local QTYmade = 0 |
|||
if QTYResult[1] and QTYResult[1]["Recipe JSON"] then |
|||
QTYmade = mw.text.jsonDecode(QTYResult[1]["Recipe JSON"]) or {} |
|||
end |
|||
QTYmade = QTYmade.output[1].quantity |
|||
item.XP = item.XP and XPIncrease and item.XP + XPIncrease * QTYused / QTYmade; |
|||
-- look up activity duration and add it to running total |
|||
local durationQuery = '[[Recipe output::' .. intermediate.name .. ']]|?Activity duration|mainlabel=' .. intermediate.name |
|||
local durationResult = mw.smw.ask(durationQuery) or {} |
|||
local durationIncrease = 0 |
|||
if durationResult[1] and durationResult[1]["Activity duration"] then |
|||
durationIncrease = tonumber(durationResult[1]["Activity duration"]) or 0 |
|||
else |
|||
durationIncrease = nil |
|||
end |
|||
item.duration = item.duration and durationIncrease and item.duration + durationIncrease * intermediate.quantity |
|||
end |
|||
-- direct values |
-- direct values |
||
⚫ | |||
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.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 84: | Line 133: | ||
local batchSize = 12 |
local batchSize = 12 |
||
local downtime = 40 |
local downtime = 40 |
||
item.duration = item. |
item.duration = item.duration and item.duration + downtime/batchSize |
||
item.potionPerHour = item.duration and 1 / item.duration * 3600 |
item.potionPerHour = item.duration and 1 / item.duration * 3600 |
||
-- properties per hour |
-- properties per hour |
||
item.XPPerHour = item.XP and item.potionPerHour and math.floor(item.XP * item.potionPerHour) |
item.XPPerHour = item.XP and item.potionPerHour and math.floor(item.XP * item.potionPerHour) |
||
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) |
item.profitPerHour = item.profit and item.potionPerHour and math.floor(item.profit * item.potionPerHour) |
||
end |
end |
||
Line 105: | Line 153: | ||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
:attr{ colspan = '3' } |
|||
:wikitext('Potion') |
:wikitext('Potion') |
||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
:wikitext('Reagents |
:wikitext('Reagents') |
||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
Line 155: | Line 204: | ||
:tag('td') |
:tag('td') |
||
:css{ ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' } |
|||
⚫ | |||
:attr{ ['data-sort-value'] = item.name } |
|||
:wikitext(item.outputQuantity .. ' ×') |
|||
:done() |
|||
:tag('td') |
|||
:addClass('plinkt-image no-border') |
|||
:css{ ['border-left'] = '0', ['padding-left'] = '0' } |
|||
⚫ | |||
:done() |
|||
:tag('td') |
|||
:addClass('plinkt-link no-border') |
|||
:wikitext('[[' .. item.name .. ']]') |
|||
:done() |
:done() |
||
local reagentCell = row:tag('td') |
local reagentCell = row:tag('td') |
||
for |
for i, _ in ipairs(item.reagents) do |
||
reagentCell:wikitext('[[File:' .. |
reagentCell:wikitext(item.reagents[i].quantity .. '× [[File:' .. item.reagents[i].name .. '.png|18px|link=' .. item.reagents[i].name .. ']]' .. '[[' .. item.reagents[i].name .. ']]<br>') |
||
end |
end |
||
row |
row |
||
:node(currency_cell(item.buy)) |
:node(currency_cell(item.buy)) |