Home
Random
Log in
Settings
About Brighter Shores Wiki
Disclaimers
Search
Editing
Module:Infobox Recipe
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
require('strict') require('Module:Mw.html extension') local currency = require('Module:Currency') local hc = require('Module:Param Parse').has_content local yn = require('Module:Yesno') local editButton = require('Module:Edit button') local function currency_cell(amount) return currency._cell(amount, { html = 'yes' }) end local p = {} function p._main(frame) local args = frame:getParent().args --If set to true, will check if any of the items passed as a rawmaterialparam are actually intermediate materials. Will then change the display order of the infobox. local showFullRecipe = yn(args.showFull or 'no', false) --Get each of the rawmatX parameters from params and store their values in a new table local argsMaterials = p._extractRawMaterials(args) --empty tables to hold materials local rawMaterials = {} local intermediateMaterials = {} --counter for total price of raw materials local rawMaterialCost = 0 --get the value for the output product local output1Value = 0 if args.output1 then output1Value = mw.smw.ask('[[:+]][[' .. args.output1 .. ']]|?Value|limit=1') or 0 end --Calculate total value of output material(s) local output1TotalValue = 0 if type(output1Value) == "table" then if output1Value[1]['Value'] ~= nil then output1TotalValue = output1Value[1]['Value'] * (tonumber(args.output1qty) or 1) else output1TotalValue = 0 end end --Check if any of the raw mats provided are intermediate products, if they are, return their own raw materials if showFullRecipe then local Materials = p._getTrueRawMaterials(argsMaterials) if next(Materials) ~= nil then rawMaterials = Materials.rawMaterials intermediateMaterials = p._reverseTable(Materials.intermediateMaterials) end else rawMaterials = argsMaterials end --Simple query to get the shop buy price for the provided material, if no buy price is available returns 0 local function getBuyPrice(material) local queryResult = mw.smw.ask('[[:+]][[Sold item::' .. material['name'] .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1') or 0 if type(queryResult) == "table" and queryResult[1]['Shop buy price'] then return tonumber(queryResult[1]['Shop buy price']) or 0 end return 0 end --If one of the raw materials provided as a param has been identified as an intermediate material then get the facility it is created at to display in the intermediate Ingredient row local function getFacility(material) local result = mw.smw.ask('[[:+]][[' .. material .. ']]|?Uses facility|limit=1') or 'unknown' local pageName = '' if result and result[1] and result[1]["Uses facility"] then local usesFac = result[1]["Uses facility"] pageName = usesFac:gsub("%[%[", ""):gsub("%]%]", ""):gsub("|.*", ""):gsub("^:", "") end return pageName end --Set SMW properties local smw_properties = { ['Uses item'] = {}, ['Uses item and quantity'] = {}, -- these are for when a recipe is called by a subsequent recipe that uses showFull ['Uses facility'] = args.facility, -- these are for generating tables of profession xp rates and profits ['Activity XP'] = args.exp, ['Activity KP'] = args.kp, ['Activity duration'] = args.duration, } for _, material in ipairs(argsMaterials) do table.insert(smw_properties['Uses item'], material.name) table.insert(smw_properties['Uses item and quantity'], ('%s,%s'):format(material.name, material.quantity)) end mw.smw.set(smw_properties) --Creates a row suitable for the raw materials section of the infobox. local function createRawMaterialRow(item) local materialBuyPrice = getBuyPrice(item) * (item.quantity or 1) rawMaterialCost = rawMaterialCost + materialBuyPrice return mw.html.create('tr') :tag('td') :css{ ['border-right'] = 'none' } :wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']]') :done() :tag('td') :css{ ['border-left'] = 'none' } :wikitext('[[' .. item.name .. ']]') :done() :tag('td') :css{ ['text-align'] = 'right' } :wikitext(item.quantity or 1) :done() :wikitext(currency_cell(materialBuyPrice)) :done() end --Creates a row suitable for the intermediate materials section of the infobox. local function createIntermediateMaterialRow(item) local facility = getFacility(item.name) return mw.html.create('tr') :tag('td') :css{ ['border-right'] = 'none' } :wikitext('[[File:' .. item.name .. '.png|30px|link=' .. item.name .. ']]') :done() :tag('td') :css{ ['border-left'] = 'none' } :wikitext('[[' .. item.name .. ']]') :done() :tag('td') :css{ ['text-align'] = 'right' } :wikitext(item.quantity or 1) :done() :tag('td') :attr{ colspan = '10' } :css{ ['text-align'] = 'center' } :wikitext('[[File:' .. facility .. '.png|30px|link=' .. facility .. ']] [[' .. facility .. ']]') :done() :done() end -- Recipe Table Head local out = mw.html.create('table') :addClass('wikitable') :tag('tr') :tag('th') :attr{ colspan = '13' } :wikitext('Requirements') :done() :done() :tag('tr') :tag('th') :attr{ colspan = '2' } :wikitext('Facility') :done() :tag('td') :attr{ colspan = '11' } :css{ ['text-align'] = 'center' } :wikitext(hc(args.facility) and ('[[File:%s.png|link=%s|30px]] [[%s]]'):format(args.facility, args.facility, args.facility) or editButton("'''?''' (edit)")) :done() :done() :tag('tr') :tag('th') :attr{ colspan = '2' } :wikitext('Duration') :done() :tag('td') :attr{ colspan = '11' } :css{ ['text-align'] = 'center' } :wikitext(hc(args.duration) and ('%ss'):format(args.duration) or editButton("'''?''' (edit)")) :done() :done() :tag('tr') :tag('th') :attr{ colspan = '2' } :wikitext('Profession') :done() :tag('th') :wikitext('Level') :done() :tag('th') :attr{ colspan = '5' } :wikitext('KP') :done() :tag('th') :attr{ colspan = '5' } :wikitext('XP') :done() :done() :tag('tr') :tag('td') :attr{ colspan = '2' } :css{ ['text-align'] = 'center' } :wikitext(hc(args.profession) and ('[[' .. args.profession .. ']]') or editButton("'''?''' (edit)")) :done() :tag('td') :css{ ['text-align'] = 'center' } :wikitext(hc(args.level) and (args.level) or editButton("'''?''' (edit)")) :done() :tag('td') :attr{ colspan = '5' } :css{ ['text-align'] = 'center' } :wikitext(hc(args.kp) and ('%s%%'):format(args.kp) or editButton("'''?''' (edit)")) :done() :tag('td') :attr{ colspan = '5' } :css{ ['text-align'] = 'center' } :wikitext(hc(args.exp) and (args.exp) or editButton("'''?''' (edit)")) :done() :done() -- Add raw materials -- Headers :tag('tr') :tag('th') :attr{ colspan = '2' } :wikitext('Raw Ingredient') :done() :tag('th') :wikitext('Quantity') :done() :tag('th') :attr{ colspan = '10' } :wikitext('Cost') :done() :done() -- Values for _, material in ipairs(rawMaterials) do out:node(createRawMaterialRow(material)) end -- Add total raw cost out :tag('tr') :tag('th') :attr{ colspan = '3' } :wikitext('Total Raw cost') :done() :wikitext(currency_cell(rawMaterialCost)) :done() -- Add Intermediate steps if required -- Headers if next(intermediateMaterials) ~= nil then -- Headers out :tag('tr') :tag('th') :attr{ colspan = '2' } :wikitext('Intermediate Ingredient') :done() :tag('th') :wikitext('Quantity') :done() :tag('th') :attr{ colspan = '10' } :wikitext('Faciltity') :done() :done() -- Values for _, material in ipairs(intermediateMaterials) do mw.logObject(material) out:node(createIntermediateMaterialRow(material)) end end -- Add output data -- Headers out :tag('tr') :tag('th') :attr{ colspan = '2' } :wikitext('Output') :done() :tag('th') :wikitext('Quantity') :done() :tag('th') :attr{ colspan = '10' } :wikitext('Value') :done() :done() :IF(args.output1) -- Values :tag('tr') :tag('td') :css{ ['border-right'] = 'none' } :wikitext('[[File:' .. args.output1 .. '.png|30px|link=' .. args.output1 .. ']]' or 'Unknown') :done() :tag('td') :css{ ['border-left'] = 'none' } :wikitext('[[' .. args.output1 .. ']]' or 'Unknown') :done() :tag('td') :css{ ['text-align'] = 'right' } :wikitext(args.output1qty or 1) :done() :wikitext(currency_cell(output1TotalValue)) :done() :END() -- Add profit data :tag('tr') :addClass('currency') :tag('th') :attr{ colspan = '3' } :wikitext('Profit') :done() :wikitext(currency_cell(output1TotalValue - rawMaterialCost)) :done() return out end function p._extractRawMaterials(args) local rawMaterials = {} for i = 1, 9 do local materialKey = "rawmat" .. i local quantityKey = "rawmat" .. i .. "qty" local materialValue = args[materialKey] if materialValue and materialValue ~= "" then local quantityValue = tonumber(args[quantityKey]) or 1 table.insert(rawMaterials, { name = materialValue, quantity = quantityValue }) end end return rawMaterials end --This function takes a table containing the raw materials params received from the calling template. --For each of the raw materials, a query will be executed to see if it has the property 'Uses item'. --If it does, that means that the 'raw material' is actually an 'intermediate material' as it is itself created. --The materials required to create this intermediate material will be retrieved and added to the rawMaterials table. --This allows for a full recipe to be shown where only intermediate ingredients were provided. function p._getTrueRawMaterials(argsMaterials) local rawMaterials = {} local intermediateMaterials = {} local function _processMaterial(material, quantity) if material then local result = mw.smw.ask('[[:+]][[' .. material .. ']]|?Uses item|?Uses item_and_quantity') if result and result[1] and result[1]["Uses item"] then -- The item is an intermediate material, add it to intermediateMaterials table.insert(intermediateMaterials, { ["name"] = material, ["quantity"] = quantity }) -- Add the raw materials used by this intermediate material to rawMaterials local usesItems = result[1]["Uses item"] local quantities = result[1]["Uses item and quantity"] if type(usesItems) == "table" then for index, usedItem in ipairs(usesItems) do local pageName = usedItem:gsub("%[%[", ""):gsub("%]%]", ""):gsub("|.*", ""):gsub("^:", "") local qty = 1 if quantities and type(quantities) == "table" then local quantityString = quantities[index] local _, q = quantityString:match("(.-),(%d+)") qty = tonumber(q) or 1 end _processMaterial(pageName, qty) end else local pageName = usesItems:gsub("%[%[", ""):gsub("%]%]", ""):gsub("|.*", ""):gsub("^:", "") local qty = 1 if quantities and type(quantities) == "string" then local _, q = quantities:match("(.-),(%d+)") qty = tonumber(q) or 1 end _processMaterial(pageName, qty) end else -- The item is a raw material, add it to rawMaterials table.insert(rawMaterials, { ["name"] = material, ["quantity"] = quantity }) end end end -- Iterate over the initial argsMaterials for _, item in pairs(argsMaterials) do if item["name"] then _processMaterial(item["name"], item["quantity"]) end end return { rawMaterials = rawMaterials, intermediateMaterials = intermediateMaterials } end function p._reverseTable(t) local reversed = {} for i = #t, 1, -1 do table.insert(reversed, t[i]) end return reversed end return p
Summary:
Please note that all contributions to Brighter Shores Wiki are considered to be released under the CC BY-NC-SA 3.0 (see
Brighter Shores:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Preview page with this template
Templates used on this page:
Template:DependencyList
(
edit
)
Template:DependencyList/doc
(
edit
)
Template:Documentation
(
edit
)
Template:Extension DPL
(
edit
)
Template:Infobox Recipe
(
edit
)
Template:Infobox Recipe/doc
(
edit
)
Module:Array
(
edit
)
Module:Currency
(
edit
)
Module:DPLlua
(
edit
)
Module:DependencyList
(
edit
)
Module:Documentation
(
edit
)
Module:Edit button
(
edit
)
Module:Infobox
(
edit
)
Module:Infobox Recipe
(
edit
)
Module:Infobox Recipe/doc
(
edit
)
Module:Mw.html extension
(
edit
)
Module:Param Parse
(
edit
)
Module:Paramtest
(
edit
)
Module:SMW Utils
(
edit
)
Module:Tooltip
(
edit
)
Module:Yesno
(
view source
) (semi-protected)
This page is a member of a hidden category:
Category:Pages using DynamicPageList3 parser function