Editing Module:AlchemistPassiveList
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 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 9: | 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 = { |
||
'[[Uses facility::Passive Potion Station]] OR [[Variant of::Ebsworth Work]]', |
'[[Uses facility::Passive Potion Station]] OR [[Variant of::Ebsworth Work]]', |
||
'?Variant of #- = variant', |
|||
'?Profession Level A = lvl', |
'?Profession Level A = lvl', |
||
'? #- = name', |
'? #- = name', |
||
'? |
'?Uses item #- = reagents', |
||
'?Value #- = sell', |
|||
'?Activity coins = coins', |
|||
'?Activity XP = XP', |
'?Activity XP = XP', |
||
'?Activity duration = duration', |
'?Activity duration = duration', |
||
'? |
'?Variant of #- = variant', |
||
'sort = Profession Level A' |
|||
'?Activity coins = coins', |
|||
'sort = Profession Level A', |
|||
'limit = 500' |
|||
} |
} |
||
local results = mw.smw.ask(query) |
local results = mw.smw.ask(query) |
||
-- criterion for if an entry is a recipe, or a passive activity |
|||
for _, item in ipairs(results) do |
|||
item.passiveActivity = item.variant=='Ebsworth Work' |
|||
end |
|||
results = p.formatResults(results) |
results = p.formatResults(results) |
||
Line 40: | Line 35: | ||
end |
end |
||
-- makes the html for the cells containing currency directly |
-- makes the html for the cells containing currency directly, no tags needed |
||
-- 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 57: | Line 43: | ||
function p.formatResults(results) |
function p.formatResults(results) |
||
-- iterate through potions |
|||
for i, item in ipairs(results) do |
|||
-- potions have reagents, but passive ebsworth work does not |
|||
-- recipe in a workable format |
|||
if item.variant=='Ebsworth Work' then |
|||
-- if it is ebsworth work, sub in different fields for the buy and sell values |
|||
-- some fields are easy to work out |
|||
item.outputQuantity = 1 |
|||
item.materials = {} |
|||
item.intermediates = {} |
|||
item.buy = 0 |
item.buy = 0 |
||
item.sell = item.coins |
|||
else |
else |
||
-- iterate through reagents, adding buy price to running total (individuals not needed) |
|||
-- starting value 20 is for bottle |
|||
item.buy = 20 |
|||
for j, reagent in ipairs(item.reagents) do |
|||
--shamelessley lifted from Module:Products |
|||
local unpackJSON = mw.text.jsonDecode(item.recipeJSON) |
|||
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent .. ']]|?Shop buy price|mainlabel=' .. reagent |
|||
item.outputQuantity = unpackJSON.output[1].quantity |
|||
local shopPriceResult = mw.smw.ask(shopPriceQuery) or {} |
|||
local shopPrice = 0 |
|||
-- SECTION REMOVED |
|||
-- do not need to extensively search for subrecipes, as passive recipe |
|||
-- passive recipes only ever have one step |
|||
item.materials = unpackJSON.materials |
|||
-- iterate through materials, adding buy price to running total (individuals not needed) |
|||
item.buy = 0 |
|||
for _, material in ipairs(item.materials) do |
|||
--shamelessley lifted from Module:Products |
|||
local shopPriceQuery = '[[:+]][[Sold item::' .. material.name .. ']]|?Shop buy price|mainlabel=' .. material.name |
|||
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 |
|||
else |
|||
item.buy = nil |
|||
end |
|||
item.buy = item.buy and item.buy + shopPrice * material.quantity |
|||
end |
|||
end |
|||
-- 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.profitPerXP = item.profit and item.XP and math.floor(item.profit / item.XP * 100) / 100 |
|||
if shopPriceResult[1] and shopPriceResult[1]["Shop buy price"] then |
|||
-- products made in 200 lots of 0.005, no downtime for passive activities |
|||
shopPrice = tonumber(shopPriceResult[1]["Shop buy price"]) or 0 |
|||
local batchSize = 200 |
|||
end |
|||
local downtime = 0 |
|||
item.duration = item.duration and item.duration + downtime/batchSize |
|||
item.buy = item.buy + shopPrice |
|||
item.productPerHour = item.duration and 1 / item.duration * 3600 |
|||
end |
|||
end |
|||
-- properties per hour |
|||
item.XPPerHour = item.XP and item.productPerHour and math.floor(item.XP * item.productPerHour) |
|||
-- sanitise data, set to 0 if its not there |
|||
item.profitPerHour = item.profit and item.productPerHour and math.floor(item.profit * item.productPerHour) |
|||
local lvl = item.lvl or '?' |
|||
local buy = item.buy or 0 |
|||
local sell = item.sell or 0 |
|||
local XP = item.XP or 0 |
|||
local KP = item.KP or 0 |
|||
local duration = item.duration or 0 |
|||
-- 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.XP) |
|||
item.hasDuration = param.has_content(item.duration) |
|||
-- direct values |
|||
if item.variant=='Ebsworth Work' then |
|||
item.profit = sell - buy |
|||
else |
|||
item.profit = (sell - buy)*0.005 -- passive potions all have quantity 0.005 per action |
|||
end |
|||
item.XP = XP |
|||
if item.XP==0 then |
|||
item.profitPerXP = 0 |
|||
else |
|||
item.profitPerXP = math.floor(item.profit / (item.XP) * 100) / 100 |
|||
end |
|||
-- passive activities have no downtime |
|||
item.duration = duration |
|||
if item.duration == 0 then |
|||
item.potionPerHour = 0 |
|||
else |
|||
item.potionPerHour = 1 / (item.duration) * 3600 |
|||
end |
|||
-- properties per hour |
|||
item.XPPerHour = math.floor(item.XP * item.potionPerHour) |
|||
item.profitPerHour = math.floor(item.profit * item.potionPerHour) |
|||
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 130: | Line 128: | ||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
:wikitext('Potion or Activity') |
|||
:attr{ colspan = '3' } |
|||
:wikitext('Product') |
|||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
:wikitext(' |
:wikitext('Reagents (plus bottle)') |
||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
Line 163: | Line 160: | ||
:done() |
:done() |
||
:done() |
:done() |
||
local unknown_value_cell = mw.html.create('td') |
|||
:addClass('table-bg-gray') |
|||
for i,item in ipairs(results) do |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext("''unknown''") |
|||
-- if its not ebsworth work, need a list of reagents |
|||
local reagentCell = '' |
|||
for i, item in ipairs(results) do |
|||
if not(item.variant=='Ebsworth Work') then |
|||
local row = out:tag('tr') |
|||
-- need to generate the text for the reagent cell before starting the row |
|||
:IF(item.lvl) |
|||
for j, reagent in ipairs(item.reagents) do |
|||
:tag('td') |
|||
reagentCell = reagentCell .. '[[File:' .. reagent .. '.png|30px|link=' .. reagent .. ']] [[' .. reagent .. ']]<br>' |
|||
end |
|||
end |
|||
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() |
|||
: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() |
||
:IF(not(item.passiveActivity)) |
|||
local materialCell = row:tag('td') |
|||
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)) |
|||
:ELSE() |
|||
:tag('td') |
:tag('td') |
||
:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]') |
|||
:addClass('table-na') |
|||
:attr{ colspan = '21' } |
|||
:wikitext('N/A') |
|||
:done() |
:done() |
||
:END() |
|||
:IF(not(item.variant=='Ebsworth Work')) |
|||
:node(currency_cell(item.profit)) |
|||
:node(currency_cell(item.profitPerHour)) |
|||
:IF(item.XP) |
|||
:tag('td') |
:tag('td') |
||
:wikitext( |
:wikitext(reagentCell) |
||
:done() |
:done() |
||
:IF(item.hasBuy) |
|||
:node(currency_cell(item.buy)) |
|||
:ELSE() |
|||
:tag('td') |
|||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
|||
:END() |
|||
:IF(item.hasSell) |
|||
-- I cannot for the life of me figure out why, |
|||
-- but if I put item.sell directly into this function it claims it has value nil |
|||
-- it works for other functions to display it directly |
|||
-- so here is the workaround I guess |
|||
:node(currency_cell(item.buy+200*item.profit)) |
|||
--:node(currency_cell(item.sell)) |
|||
:ELSE() |
|||
:tag('td') |
|||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
|||
:END() |
|||
:ELSE() |
:ELSE() |
||
: |
:tag('td') |
||
:addClass('table-na') |
|||
:attr{ colspan = '21' } |
|||
:wikitext('N/A') |
|||
:done() |
|||
:END() |
:END() |
||
:IF(item. |
:IF(item.hasProfit) |
||
:node(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) |
|||
:node(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(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) |
|||
:node(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 |