Module:GameData: Difference between revisions

From the Dyson Sphere Program Wiki
(Forgot the table, LOL. Wish I had a better way to test this myself, but I'm doing it live.)
(This is why I don't do things live. The debug console won't work for this without a valid frame, and I'm not sure how to give it one. Just don't look at edit history.)
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(result, frame:expandTemplate{title='ProductionChainTable/head', args={}})
prefix = 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:43, 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}}
Recipe Building Replicator? Technology
Icon Sulfuric Acid.png
4
6 s
Icon Refined Oil.png
4
Icon Stone.png
nil
Icon Water.png
nil
Icon Chemical Plant.pngIcon Quantum Chemical Plant.png
Tech Basic Chemical Engineering.png

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
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Semiconductor Material.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png N/A
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Magnetic Particle Trap.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Thruster.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png N/A
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Magnetic Particle Trap.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Implosion Cannon.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Engine.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Missile Turret.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Weapon System.png

Buildings

Recipe Building Replicator? Technology
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Solar Collection.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Jammer Tower.png
Icon Assembling Machine Mk.I.pngIcon Assembling Machine Mk.II.pngIcon Assembling Machine Mk.III.pngIcon Re-composing Assembler.png
Tech Geothermal Extraction.png

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 = 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.