Module:GameData: Difference between revisions

From the Dyson Sphere Program Wiki
(Add direct methods to use directly without a template)
(A title is required)
Line 89: Line 89:
table.insert(result, frame:expandTemplate{title='ProductionChain', args=data})
table.insert(result, frame:expandTemplate{title='ProductionChain', args=data})
end
end
prefix = table.insert(frame:expandTemplate{'ProductionChainTable/head'})
prefix = table.insert(frame:expandTemplate{title='ProductionChainTable/head', args={}})
return string.format('%s\n%s\n|}', prefix, table.concat(result, '|-'))
return string.format('%s\n%s\n|}', prefix, table.concat(result, '|-'))
end
end

Revision as of 23:35, 26 April 2024

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}}

Lua error at line 91: bad argument #1 to 'insert' (table expected, got string).

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}}

Lua error at line 91: bad argument #1 to 'insert' (table expected, got string).

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',
	Resarch='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.ResultCounts[i])
		end
		data = {
			Building = machines[recipe.Type],
			Recipe = frame:expandTemplate{title='ItemRecipe', args=itemdata},
		}
		if data.Handcraft then
			data.Replicator = 'Yes'
		else
			data.Replicator = 'No'
		end
		tech = technologyForRecipeID(recipe.ID)
		if tech ~= nil then
			data.Technology = tech.Name
		else
			data.Technology = ''
		end
		table.insert(result, frame:expandTemplate{title='ProductionChain', args=data})
	end
	prefix = table.insert(frame:expandTemplate{title='ProductionChainTable/head', args={}})
	return string.format('%s\n%s\n|}', prefix, table.concat(result, '|-'))
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

return funcs
🍪 We use cookies to keep session information to provide you a better experience.