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 currency = require('Module:Currency') |
|||
local lang = mw.getContentLanguage() |
local lang = mw.getContentLanguage() |
||
require("Module:Mw.html extension") |
|||
local purge = require('Module:Purge')._purge |
|||
local p = {} |
local p = {} |
||
Line 10: | Line 11: | ||
function p.main() |
function p.main() |
||
-- returns almost every parameter needed for the row, except buy values for reagents |
|||
local queryString = '[[Category:Alchemist]] AND [[Category:Pages with recipes]] OR [[Category:Pages with activities]]' |
|||
local query = { |
|||
'[[Uses facility::Passive Potion Station]] OR [[Variant of::Ebsworth Work]]', |
|||
'?Profession Level A = lvl', |
|||
'? #- = name', |
|||
'?Uses item #- = reagents', |
|||
'?Value #- = sell', |
|||
'?Activity coins = coins', |
|||
'?Activity XP = XP', |
|||
'?Activity duration = duration', |
|||
'?Variant of #- = variant', |
|||
'sort = Profession Level A' |
|||
} |
|||
local results = mw.smw.ask(query) |
|||
local function screenFunction(item) |
|||
return item.passive |
|||
end |
|||
local results = plist.generate_recipe_table(queryString,screenFunction) |
|||
results = p.formatResults(results) |
results = p.formatResults(results) |
||
Line 25: | Line 33: | ||
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>' |
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>' |
||
end |
|||
-- makes the html for the cells containing currency directly, no tags needed |
|||
local function currency_cell(amount) |
|||
return currency._cell(amount, { html = 'yes' }) |
|||
end |
end |
||
-- do calculations and determine strings to go in cells |
-- do calculations and determine strings to go in cells |
||
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 |
|||
if item.variant=='Ebsworth Work' then |
|||
-- if it is ebsworth work, sub in different fields for the buy and sell values |
|||
item.buy = 0 |
|||
item.sell = item.coins |
|||
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 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 |
|||
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 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 |
|||
--simple check for nil results |
|||
item.duration = duration |
|||
if results ==nil or results[1] == nil then |
|||
if item.duration == 0 then |
|||
return nil |
|||
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 |
||
-- iterate through products |
|||
for _, item in ipairs(results) do |
|||
-- Ebsworth work |
|||
if item.type=='activity' then |
|||
item.profit = item.coins |
|||
end |
|||
-- profitability |
|||
item.profitPerXP = item.profit and item.xp and item.profit / item.xp |
|||
-- no downtime for passives |
|||
item.productPerHour = item.duration and 1 / item.duration * 3600 |
|||
return results |
|||
-- properties per hour |
|||
item.xpPerHour = item.xp and item.productPerHour and math.floor(item.xp * item.productPerHour) |
|||
item.profitPerHour = item.profit and item.productPerHour and math.floor(item.profit * item.productPerHour) |
|||
end |
|||
return results |
|||
end |
end |
||
Line 60: | Line 121: | ||
function p.displayTable(results) |
function p.displayTable(results) |
||
local out = mw.html.create('table') |
|||
--simple check for nil results |
|||
if results ==nil or results[1] == nil then |
|||
return 'No data found for table' |
|||
end |
|||
local out = mw.html.create('table') |
|||
:addClass('wikitable sortable') |
:addClass('wikitable sortable') |
||
:tag('caption') |
|||
:wikitext('This list is updated dynamically. '..purge()) |
|||
:done() |
|||
:tag('tr') |
:tag('tr') |
||
:tag('th') |
:tag('th') |
||
Line 75: | Line 128: | ||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
:wikitext('Potion or Activity') |
|||
:attr{ colspan = '3' } |
|||
:wikitext('Products') |
|||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
:wikitext(' |
:wikitext('Reagents (plus bottle)') |
||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
Line 108: | Line 160: | ||
:done() |
:done() |
||
:done() |
:done() |
||
for i, item in ipairs(results) do |
|||
local row = out:tag('tr') |
|||
--level |
|||
:IF(item.level) |
|||
for i,item in ipairs(results) do |
|||
:tag('td') |
|||
-- if its not ebsworth work, need a list of reagents |
|||
local reagentCell = '' |
|||
if not(item.variant=='Ebsworth Work') then |
|||
-- need to generate the text for the reagent cell before starting the row |
|||
for j, reagent in ipairs(item.reagents) do |
|||
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. |
:wikitext(item.lvl) |
||
: |
:ELSE() |
||
:addClass('table-bg-grey') |
|||
:ELSE() |
|||
:css{ ['text-align'] = 'center' } |
|||
:node(plist.unknown_value_edit_cell(item.pageName,1)) |
|||
: |
:wikitext('unknown') |
||
:END() |
|||
:done() |
|||
:tag('td') |
|||
: |
:wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']] [[' .. item.name .. ']]') |
||
:done() |
|||
:IF(not(item.variant=='Ebsworth Work')) |
|||
-- materials |
|||
: |
:tag('td') |
||
:wikitext(reagentCell) |
|||
:node(plist.one_column_image_text(item.materials)) |
|||
:done() |
|||
:node(plist.currency_cell(item.buyPrice)) |
|||
:node(plist.currency_cell(item.sellPrice)) |
|||
:IF(item.hasBuy) |
|||
:wikitext(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 |
|||
:wikitext(currency_cell(item.buy+200*item.profit)) |
|||
--:wikitext(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') |
:tag('td') |
||
:addClass('table-na') |
:addClass('table-na') |
||
:css{ ['text-align'] = 'center' } |
|||
:attr{ colspan = '21' } |
:attr{ colspan = '21' } |
||
:wikitext('N/A') |
:wikitext('N/A') |
||
Line 139: | Line 231: | ||
:END() |
:END() |
||
:IF(item. |
:IF(item.hasProfit) |
||
: |
:wikitext(currency_cell(item.profit)) |
||
:ELSE() |
:ELSE() |
||
:tag('td') |
|||
:node(plist.currency_cell(item.profit)) |
|||
:addClass('table-bg-grey') |
|||
:attr{ colspan = '10' } |
|||
:css{ ['text-align'] = 'center' } |
|||
:wikitext('unknown') |
|||
:done() |
|||
:END() |
:END() |
||
:IF(item.hasProfit and item.hasDuration) |
|||
: |
:wikitext(currency_cell(item.profitPerHour)) |
||
:ELSE() |
|||
-- XP |
|||
: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() |
||
:ELSE() |
|||
:node(plist.unknown_value_edit_cell(item.pageName,1)) |
|||
:END() |
:END() |
||
:tag('td') |
|||
-- XP per hour |
|||
:IF(item. |
: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) |
|||
:wikitext(currency_cell(item.profitPerXP)) |
|||
: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() |
||
:ELSE() |
|||
:node(plist.unknown_value_cell(1)) |
|||
:END() |
:END() |
||
-- XP per hour |
|||
:node(plist.currency_cell(item.profitPerXP)) |
|||
:done() |
:done() |
||
end |
end |
||
return out |
return out |
||
end |
end |