Module:Sandbox/User:Alsang/NodeDescriptionChecker: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
(yess it works) |
(figuring out queries for different crafting skills, for active and passive tables) |
||
Line 12: | Line 12: | ||
-- returns only directly needed parameter needed for the row, |
-- returns only directly needed parameter needed for the row, |
||
-- other parameters are determined by subqueries of chained pages |
-- other parameters are determined by subqueries of chained pages |
||
-- this is in testing, uncomment out one line to test that type of query |
|||
-- requires pages to be made and have recipes on them or it tends to get an error |
|||
-- query types that include non-recipe passive activities behave weird and need to be fixed |
|||
local query = { |
local query = { |
||
'[[-Sold item.Sold by::Head Chef (shop)]]', |
'[[-Sold item.Sold by::Head Chef (shop)]]', -- chef both active and passive (hard to separate, also mixes in fishing passive subrecipes) |
||
--'[[Uses facility::One Handed Range (bonewright)||One Handed Melee Workbench (bonewright)||Two Handed Range Workbench (bonewright)||Two Handed Melee Workbench (bonewright)||Shield Vice (bonewright)]]', -- bonewright active |
|||
--'[[Uses facility::Knickknacks workbench]] OR [[Variant of::Divination||Sabertooth Cat Skeleton||Wooly Mammoth Skeleton||Triceratops Skeleton||T-Rex Skeleton||Wendigo Skeleton||Bonemeal Cement]]', -- bonewright passive |
|||
--'[[Uses facility::One Handed Range (stonemason)||One Handed Melee Workbench (stonemason)||Two Handed Range Workbench (stonemason)||Two Handed Melee Workbench (stonemason)||Shield Vice (stonemason)]]', -- stonemason active |
|||
--'[[Uses facility::Stoneware bench]] OR [[Variant of::Statue Sculpture||Ornamental Scuplture||Column Sculpture||Bust Sculpture]]', -- stonemason passive |
|||
--'[[Uses facility::Goblin Forge||Gnome Forge (skill node)]]', -- blacksmith active |
|||
--'[[Uses facility::Jewelry Bench]]', -- blacksmith passive, no non-recipe |
|||
--'[[-Sold item.Sold by::Leather stall]][[Recipe JSON::~*]]', -- leatherworker active, the stall sells scraps and we need to ignore those |
|||
--'[[-Sold item.Sold by::Leather Goods]] OR [[Variant of::Upholstery]]', -- leatherworker passive, but the Upholstery activities dont have pages yet |
|||
'?Uses facility #- = facility', |
|||
'?Profession Level A = lvl', |
'?Profession Level A = lvl', |
||
'? #- = name', |
'? #- = name', |
||
Line 20: | Line 33: | ||
'?Activity duration = duration', |
'?Activity duration = duration', |
||
'?Value = sell', |
'?Value = sell', |
||
'?Activity coins = coins', |
|||
'sort = Profession Level A', |
'sort = Profession Level A', |
||
'limit = 500' |
'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 = false -- can delete this entire FOR statement unless there are non-recipe passive activities on the table |
|||
--item.passiveActivity = not(item.facility=='Upholstery station') -- leatherworker has not got upholstery implemented yet, do not use |
|||
end |
|||
results = p.formatResults(results) |
results = p.formatResults(results) |
||
return p.displayTable(results) |
return p.displayTable(results) |
||
--return p.generateLogTable() |
|||
--for debugging |
--for debugging |
||
Line 57: | Line 75: | ||
-- recipe in a workable format |
-- recipe in a workable format |
||
if item.passiveActivity then |
|||
local unpackJSON = mw.text.jsonDecode(item.recipeJSON) |
|||
item.outputQuantity = unpackJSON.output[1].quantity |
|||
-- if it is a passive activity that is not a recipe |
|||
-- some fields are easy to work out |
|||
item.outputQuantity = 1 |
|||
item.reagents = {} |
|||
item.intermediates = {} |
|||
item.buy = 0 |
|||
item.sell = item.coins |
|||
else |
|||
-- call the module:infobox recipe to extensively search for |
|||
-- all raw materials (to add to prices) |
|||
local unpackJSON = mw.text.jsonDecode(item.recipeJSON) |
|||
-- all intermediate materials (for intermediate XP and duration) |
|||
item.outputQuantity = unpackJSON.output[1].quantity |
|||
local Materials = recipe._getTrueRawMaterials(unpackJSON.materials) |
|||
if next(Materials) ~= nil then |
|||
-- call the module:infobox recipe to extensively search for |
|||
item.reagents = Materials.rawMaterials |
|||
-- all raw materials (to add to prices) |
|||
item.intermediates = Materials.intermediateMaterials |
|||
-- all intermediate materials (for intermediate XP and duration) |
|||
end |
|||
local Materials = recipe._getTrueRawMaterials(unpackJSON.materials) |
|||
if next(Materials) ~= nil then |
|||
-- iterate through reagents, adding buy price to running total (individuals not needed) |
|||
item. |
item.reagents = Materials.rawMaterials |
||
item.intermediates = Materials.intermediateMaterials |
|||
for _, reagent in ipairs(item.reagents) do |
|||
--shamelessley lifted from Module:Products |
|||
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent.name .. ']]|?Shop buy price|mainlabel=' .. reagent.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 |
end |
||
item.buy = item.buy and item.buy + shopPrice * reagent.quantity |
|||
-- iterate through reagents, adding buy price to running total (individuals not needed) |
|||
end |
|||
item.buy = 0 |
|||
for _, reagent in ipairs(item.reagents) do |
|||
-- iterate through intermediaries to add to XP and duration parameters |
|||
for _, intermediate in ipairs(item.intermediates) do |
|||
--shamelessley lifted from Module:Products |
|||
-- look up activity XP and add it to running total |
|||
local |
local shopPriceQuery = '[[:+]][[Sold item::' .. reagent.name .. ']]|?Shop buy price|mainlabel=' .. reagent.name |
||
local |
local shopPriceResult = mw.smw.ask(shopPriceQuery) or {} |
||
local |
local shopPrice = 0 |
||
if XPResult[1] and XPResult[1]["Activity XP"] then |
|||
if shopPriceResult[1] and shopPriceResult[1]["Shop buy price"] then |
|||
XPIncrease = tonumber(XPResult[1]["Activity XP"]) or 0 |
|||
shopPrice = tonumber(shopPriceResult[1]["Shop buy price"]) or 0 |
|||
else |
|||
else |
|||
XPIncrease = nil |
|||
item.buy = nil |
|||
end |
|||
item.buy = item.buy and item.buy + shopPrice * reagent.quantity |
|||
end |
end |
||
-- iterate through intermediaries to add to XP and duration parameters |
|||
-- 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 |
|||
for _, intermediate in ipairs(item.intermediates) do |
|||
-- look up activity XP and add it to running total |
|||
local QTYQuery = '[[Recipe output::' .. intermediate.name .. ']]|?Recipe JSON|mainlabel=' .. intermediate.name |
|||
local XPQuery = '[[Recipe output::' .. intermediate.name .. ']]|?Activity XP|mainlabel=' .. intermediate.name |
|||
local QTYResult = mw.smw.ask(QTYQuery) or {} |
|||
local |
local XPResult = mw.smw.ask(XPQuery) or {} |
||
local XPIncrease = 0 |
|||
if QTYResult[1] and QTYResult[1]["Recipe JSON"] then |
|||
if XPResult[1] and XPResult[1]["Activity XP"] then |
|||
QTYmade = mw.text.jsonDecode(QTYResult[1]["Recipe JSON"]) or {} |
|||
XPIncrease = tonumber(XPResult[1]["Activity XP"]) or 0 |
|||
end |
|||
else |
|||
QTYmade = QTYmade.output[1].quantity |
|||
XPIncrease = nil |
|||
end |
|||
item.XP = item.XP and XPIncrease and item.XP + XPIncrease * QTYused / QTYmade; |
|||
-- 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 |
|||
-- look up activity duration and add it to running total |
|||
local QTYused = intermediate.quantity |
|||
local durationQuery = '[[Recipe output::' .. intermediate.name .. ']]|?Activity duration|mainlabel=' .. intermediate.name |
|||
local durationResult = mw.smw.ask(durationQuery) or {} |
|||
local QTYQuery = '[[Recipe output::' .. intermediate.name .. ']]|?Recipe JSON|mainlabel=' .. intermediate.name |
|||
local durationIncrease = 0 |
|||
local QTYResult = mw.smw.ask(QTYQuery) or {} |
|||
if durationResult[1] and durationResult[1]["Activity duration"] then |
|||
local QTYmade = 0 |
|||
durationIncrease = tonumber(durationResult[1]["Activity duration"]) or 0 |
|||
if QTYResult[1] and QTYResult[1]["Recipe JSON"] then |
|||
else |
|||
QTYmade = mw.text.jsonDecode(QTYResult[1]["Recipe JSON"]) or {} |
|||
durationIncrease = nil |
|||
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 |
end |
||
item.duration = item.duration and durationIncrease and item.duration + durationIncrease * intermediate.quantity |
|||
end |
end |
||
Line 132: | Line 164: | ||
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 |
||
-- potions made in 200 lots of 0.005, no downtime for passive activities |
|||
-- 40 seconds to buy new supplies and travel and deposit and everything, per 12 potions |
|||
local batchSize = |
local batchSize = 200 |
||
local downtime = |
local downtime = 0 |
||
item.duration = item.duration and item.duration + downtime/batchSize |
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 |
||
Line 152: | Line 184: | ||
:tag('tr') |
:tag('tr') |
||
:tag('th') |
:tag('th') |
||
:wikitext('[[File: |
:wikitext('[[File:Alchemist small icon.png|15px]] Level') |
||
:done() |
:done() |
||
:tag('th') |
:tag('th') |
||
Line 219: | Line 251: | ||
:wikitext('[[' .. item.name .. ']]') |
:wikitext('[[' .. item.name .. ']]') |
||
:done() |
:done() |
||
:IF(not(item.passiveActivity)) |
|||
local reagentCell = row:tag('td') |
local reagentCell = row:tag('td') |
||
for i, _ in ipairs(item.reagents) do |
for i, _ in ipairs(item.reagents) do |
||
reagentCell:wikitext(item.reagents[i].quantity .. '× [[File:' .. item.reagents[i].name .. '.png|18px|link=' .. item.reagents[i].name .. ']]' .. '[[' .. item.reagents[i].name .. ']]<br>') |
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 |
|||
:node(currency_cell(item.buy)) |
|||
:node(currency_cell(item.sell)) |
|||
:ELSE() |
|||
:tag('td') |
|||
:addClass('table-na') |
|||
:attr{ colspan = '21' } |
|||
:wikitext('N/A') |
|||
:done() |
|||
:END() |
|||
row |
|||
:node(currency_cell(item.buy)) |
|||
:node(currency_cell(item.sell)) |
|||
:node(currency_cell(item.profit)) |
:node(currency_cell(item.profit)) |
||
:node(currency_cell(item.profitPerHour)) |
:node(currency_cell(item.profitPerHour)) |
||
Line 254: | Line 298: | ||
return out |
return out |
||
end |
|||
function p.generateLogTable() |
|||
-- looks to see which logs, planks, poles, staves, and posts have pages and recipes |
|||
local woodTypes = {'Ash','Oak','Pine','Hickory','Juniper','Poplar','Suave','Yew'} |
|||
local variantTypes = {'Coarse','Rugged','Average','Fine','Sturdy','Perfect'} |
|||
local itemTypes = {'Log','Post','Pole'} |
|||
local itemTypesAsh = {'Log','Plank'} |
|||
local itemTypesJuniper = {'Log','Stave'} |
|||
local out = mw.html.create('table') |
|||
:addClass('wikitable') |
|||
for i, variant in ipairs(variantTypes) do |
|||
local row = out:tag('tr') |
|||
for j, wood in ipairs(woodTypes) do |
|||
local cell = row:tag('td') |
|||
local itemTypesThis = itemTypes |
|||
if wood == 'Ash' then |
|||
itemTypesThis = itemTypesAsh |
|||
elseif wood == 'Juniper' then |
|||
itemTypesThis = itemTypesJuniper |
|||
end |
|||
for k, item in ipairs(itemTypesThis) do |
|||
local name = variant .. ' ' .. wood .. ' ' .. item |
|||
cell:wikitext('[[' .. name .. ']]') |
|||
if not(item=='Log') then |
|||
local query = mw.smw.ask('[[Name::' .. name .. ']][[Recipe JSON::~*]]|?#-') |
|||
local result = tostring(query) |
|||
if result=='table' then |
|||
--cell:wikitext(' has recipe') -- do nothing |
|||
elseif result=='nil' then |
|||
cell:wikitext(' needs recipe') |
|||
else |
|||
cell:wikitext(result) |
|||
end |
|||
end |
|||
cell:wikitext('<br>') |
|||
end |
|||
end |
|||
end |
|||
return out |
|||
end |
end |
||