Source data for this module is stored at Module:GameData/protosets.json
Exported Functions
Each function in this module is exported twice: one as-is for use in templates, and once with a Direct suffix for use directly on pages using {{#invoke|GameData|functionDirect|...}}.
recipesMaking
Arguments: Item Name
Print recipes making an item, given by name. This produces a full table with headers.
Example invocation:
{{#invoke:GameData|recipesMakingDirect|Sulfuric Acid}}
Recipe | Building | Replicator? | Technology |
---|---|---|---|
✖ |
recipesUsing
Arguments: Item Name
Print recipes using an item as an ingredient. Output is separated into two full tables: recipes which create components, and recipes which create buildings. This is selected by the CanBuild property of the produced items.
Example invocation:
{{#invoke:GameData|recipesUsingDirect|Copper Ingot}}
Components
Recipe | Building | Replicator? | Technology |
---|---|---|---|
✔ | |||
✔ | N/A | ||
✔ | |||
✔ | |||
✔ | N/A | ||
✖ | |||
✔ | |||
✔ | |||
✔ | |||
✔ |
Buildings
Recipe | Building | Replicator? | Technology |
---|---|---|---|
✔ | |||
✔ | |||
✔ |
itemRecipes
Arguments: Item Name
Print recipes making an item. This does not produce a full table, and is intended for use in ItemInfo boxes such as at Graphene/ItemInfo.
itemField
Arguments: Item Name, Field Name
Print a field from an item, with the field to print as an argument. You can look at Module:GameData/protosets.json and scroll down or search (Ctrl+F) to the ItemProtoSet to browse fields.
Example invocation:
{{#invoke:GameData|itemFieldDirect|Magnetic Coil|Description}}
Script error: The function "itemFieldDirect" does not exist.
{{#invoke:GameData|itemFieldDirect|Hydrogen|StackSize}}
Script error: The function "itemFieldDirect" does not exist.
local funcs = {}
local protosets = mw.loadJsonData('Module:GameData/protosets.json')
local machines = {
Smelt='Smelter',
Assemble='Assembling Machine',
Refine='Oil Refinery',
Chemical='Chemical Plant',
Exchange='Energy Exchanger',
Particle='Miniature Particle Collider',
PhotonStore='Ray Receiver',
Fractionate='Fractionator',
Research='Matrix Lab',
}
function funcs.recipesMaking(frame)
name = frame:getParent().args[1]
item = itemByName(name)
recipes = recipesMakingByID(item.ID)
return tableRecipes(recipes, frame)
end
function funcs.recipesMakingDirect(frame)
name = frame.args[1]
item = itemByName(name)
recipes = recipesMakingByID(item.ID)
return tableRecipes(recipes, frame)
end
function funcs.recipesUsing(frame)
output = {}
name = frame:getParent().args[1]
item = itemByName(name)
components, buildings = recipesUsingByID(item.ID)
if next(components) then
table.insert(output, '=== Components ===')
table.insert(output, tableRecipes(components, frame))
end
if next(buildings) then
table.insert(output, '=== Buildings ===')
table.insert(output, tableRecipes(buildings, frame))
end
return table.concat(output, '\n')
end
function funcs.recipesUsingDirect(frame)
output = {}
name = frame.args[1]
item = itemByName(name)
components, buildings = recipesUsingByID(item.ID)
if next(components) then
table.insert(output, '=== Components ===')
table.insert(output, tableRecipes(components, frame))
end
if next(buildings) then
table.insert(output, '=== Buildings ===')
table.insert(output, tableRecipes(buildings, frame))
end
return table.concat(output, '\n')
end
function tableRecipes(recipes, frame)
result = {}
for _, recipe in pairs(recipes) do
itemdata = {}
itemdata.CraftTime = string.format('%s s', tostring(recipe.TimeSpend/60))
for i, itemid in ipairs(recipe.Results) do
itemdata[string.format('Out%d', i)] = itemByID(itemid).Name
itemdata[string.format('Out%dQty', i)] = tostring(recipe.ResultCounts[i])
end
for i, itemid in ipairs(recipe.Items) do
itemdata[string.format('In%d', i)] = itemByID(itemid).Name
itemdata[string.format('In%dQty', i)] = tostring(recipe.ItemCounts[i])
end
data = {
Building = machines[recipe.Type],
Recipe = frame:expandTemplate{title='ItemRecipe', args=itemdata},
}
if recipe.Handcraft then
data.Replicator = 'Yes'
else
data.Replicator = 'No'
end
tech = technologyForRecipeID(recipe.ID)
if tech ~= nil then
data.Technology = titleCase(tech.Name)
else
data.Technology = ''
end
table.insert(result, '| ' .. frame:expandTemplate{title='ProductionChain', args=data})
end
prefix = frame:expandTemplate{title='ProductionChainTable/head', args={}}
return string.format('%s\n%s\n|}', prefix, table.concat(result, '\n|-\n'))
end
function itemByName(name)
for _, item in pairs(protosets.ItemProtoSet.dataArray) do
if item.Name == name then
return item
end
end
error('No item named ' .. name)
end
function itemByID(id)
for _, item in pairs(protosets.ItemProtoSet.dataArray) do
if item.ID == id then
return item
end
end
error('No item with ID ' .. id)
end
function recipesMakingByID(id)
result = {}
for _, recipe in pairs(protosets.RecipeProtoSet.dataArray) do
for _, itemid in pairs(recipe.Results) do
if itemid == id then
table.insert(result, recipe)
break
end
end
end
return result
end
function recipesUsingByID(id)
components = {}
buildings = {}
for _, recipe in pairs(protosets.RecipeProtoSet.dataArray) do
for _, itemid in pairs(recipe.Items) do
if itemid == id then
if itemByID(recipe.Results[1]).CanBuild then
table.insert(buildings, recipe)
else
table.insert(components, recipe)
end
break
end
end
end
return components, buildings
end
function technologyForRecipeID(id)
for _, tech in pairs(protosets.TechProtoSet.dataArray) do
for _, recipeid in pairs(tech.UnlockRecipes) do
if recipeid == id then
return tech
end
end
end
return nil
end
function titleCase(str)
start, _ = string.gsub(str, '^%l', string.upper)
title, _ = string.gsub(start, '%s+%l', string.upper)
return title
end
return funcs