Skip to content

Instantly share code, notes, and snippets.

@j000
Forked from pfmoore/factorio-recipe-parser.lua
Last active November 12, 2017 16:41
Show Gist options
  • Save j000/d398ceea09b1fd8706fb41e23348e6cd to your computer and use it in GitHub Desktop.
Save j000/d398ceea09b1fd8706fb41e23348e6cd to your computer and use it in GitHub Desktop.
Parse the Factorio recipe files to create a CSV of recipes
local write = io.write
function print_me(write,...)
local n = select("#",...)
for i = 1,n do
local v = tostring(select(i,...))
write(v)
if i~=n then write'\t' end
end
write'\n'
end
function print(...)
print_me(write,...)
end
function error(...)
local function write(...)
io.stderr:write(...)
end
print_me(write,...)
end
-- remember about trailing / (or \\ on Windows™)
local basepath='/home/j000/.local/share/Steam/steamapps/common/Factorio/data/base/'
-- global variables
local constraints = {}
local images = {}
local skip = {}
local nodes = {}
function mark(array, what)
if type(what) ~= 'table' then
array[what] = true
return
end
for _, value in ipairs(what) do
mark(array, value)
end
end
function check_node(name)
if nodes[name] ~= false then
nodes[name] = true
end
end
function make_node(name, attributes)
nodes[name] = false
-- just name
if (type(attributes) ~= 'table') then
error(name .. ' does not have attributes')
attributes = {}
end
-- open attributes
write('\t"' .. name .. '" [')
-- loop through attributes
for k, v in pairs(attributes) do
write(k .. '="' .. v .. '", ')
end
-- clear label
if (not attributes['label'] and images[name] ~= '') then
write('label=" ", ')
end
-- add images
if not attributes['image'] then
write('image="' .. (images[name] or (name .. '.png')) .. '", ')
--write('labelloc="b", ')
end
-- close attributes
write('];\n')
end
function make_edge(from, to, attributes)
if (type(attributes) ~= 'table') then
error(from .. ' -> ' .. to .. ' does not have attributes')
attributes = {}
end
write('\t"' .. from .. '" -> "' .. to .. '" [')
for k, v in pairs(attributes) do
write(k .. '="' .. v .. '", ')
end
if constraints[from] and not constraints[to] then
write('constraint=false, /*style=invis,*/ ')
end
write('];\n')
end
function get_recipes()
local file_name = ''
data = {}
data["extend"] = function (data, t)
print('// '..file_name)
for n, recipe in ipairs(t) do
local name = recipe["name"]
if not skip[name] then
local image = recipe["icon"]
if image then
image = basepath .. string.sub(image, 10)
end
-- we have array of results
if recipe["results"] then
-- just one result with same name as product (i.e. water, petroleum gas -> sulfur -> sulfur)
if recipe["results"][2] == nil
and ((recipe["results"][1][1] and recipe["results"][1][1] == name)
or (recipe["results"][1]["name"] and recipe["results"][1]["name"] == name)) then
make_node(name, {image = image})
else
make_node(name, {image = image, shape = 'box'})
for i, result in ipairs(recipe["results"]) do
local rname = result[1] or result["name"]
local ramt = result[2] or result["amount"]
check_node(rname)
make_edge(name, rname, {label = ramt})
end
end
else
make_node(name, {image = image})
end
for i, component in ipairs(recipe["ingredients"]) do
local cname = component[1] or component["name"]
local camt = component[2] or component["amount"]
check_node(cname)
make_edge(cname, name, {label = camt})
end
end
end
end
local files = {
'ammo',
'capsule',
'demo-furnace-recipe',
'demo-recipe',
'demo-turret',
'equipment',
'fluid-recipe',
'furnace-recipe',
'inserter',
'module',
'recipe',
'turret',
}
mark(constraints, {
--'electronic-circuit',
--'advanced-circuit',
--'processing-unit',
'empty-barrel',
'crude-oil-barrel',
--'empty-crude-oil-barrel',
--'fill-crude-oil-barrel'
})
-- not usable in-game items as of 0.14.21
mark(skip, {
'small-plane',
'loader',
'fast-loader',
'express-loader',
'player-port',
'electric-energy-interface'
})
-- images have different names
images['railgun-dart'] = 'railgun-ammo.png'
images['low-density-structure'] = 'rocket-structure.png'
-- no image
images['discharge-defense-remote'] = ''
images['electric-energy-interface'] = ''
for i, f in ipairs(files) do
file_name = f
dofile(basepath .. "prototypes/recipe/" .. f .. ".lua")
end
for k, v in pairs(nodes) do
if v then
--error('making node '..k)
make_node(k, {})
end
end
end
print([[
digraph factorio {
imagepath="]]..basepath..[[graphics/icons/fluid:]]..basepath..[[graphics/icons";
graph [
//compound=true,
//ordering="out", // preserve order from file
];
//rankdir=LR; // draw from left to right, not top to bottom
ranksep="0.1 equally" // space between "ranks"
//size="8,5"; // image size
//ratio="0.625"; // image ratio
overlap=false; // don't overlap nodes
//style=invis; // hide clusters' borders
maxiter=100000; // number of iterations
]])
get_recipes()
print([[
// some positioning
//{ rank=min; "coal"; "iron-ore"; "copper-ore"; "stone"; "raw-wood"; "water"; "crude-oil" }
//{ rank=same; "iron-plate"; "copper-plate"; "wood"; "landfill"; "stone-brick" }
//{ rank=same; "lubricant"; "heavy-oil"; "heavy-oil-cracking"; "light-oil"; "light-oil-cracking"; "petroleum-gas" }
//{ rank=same; "splitter"; "underground-belt"; "loader"; "fast-transport-belt" }
//{ rank=same; "empty-barrel"; "crude-oil-barrel"; "empty-crude-oil-barrel"; "fill-crude-oil-barrel" }
subgraph cluster_barrels {
{ rank=same; "empty-barrel"; "crude-oil-barrel"; }
"empty-crude-oil-barrel"; "fill-crude-oil-barrel"
}
}
]])
piercing-rounds-magazine copper-plate 5
piercing-rounds-magazine steel-plate 1
rocket electronic-circuit 1
rocket explosives 2
rocket iron-plate 2
explosive-rocket rocket 1
explosive-rocket explosives 5
shotgun-shell copper-plate 2
shotgun-shell iron-plate 2
piercing-shotgun-shell copper-plate 2
piercing-shotgun-shell steel-plate 2
railgun-dart steel-plate 5
railgun-dart electronic-circuit 5
cannon-shell steel-plate 4
cannon-shell plastic-bar 2
cannon-shell explosives 1
explosive-cannon-shell steel-plate 4
explosive-cannon-shell plastic-bar 2
explosive-cannon-shell explosives 4
poison-capsule steel-plate 3
poison-capsule electronic-circuit 3
poison-capsule coal 10
slowdown-capsule steel-plate 2
slowdown-capsule electronic-circuit 2
slowdown-capsule coal 5
grenade iron-plate 5
grenade coal 10
cluster-grenade grenade 7
cluster-grenade explosives 5
cluster-grenade steel-plate 5
defender-capsule piercing-rounds-magazine 1
defender-capsule electronic-circuit 2
defender-capsule iron-gear-wheel 3
distractor-capsule defender-capsule 4
distractor-capsule advanced-circuit 3
destroyer-capsule distractor-capsule 4
destroyer-capsule speed-module 1
discharge-defense-remote electronic-circuit 1
copper-plate copper-ore 1
iron-plate iron-ore 1
stone-brick stone 2
wood raw-wood 1
wooden-chest wood 4
iron-stick iron-plate 1
iron-axe iron-stick 2
iron-axe iron-plate 3
stone-furnace stone 5
boiler stone-furnace 1
boiler pipe 1
steam-engine iron-gear-wheel 5
steam-engine pipe 5
steam-engine iron-plate 5
iron-gear-wheel iron-plate 2
electronic-circuit iron-plate 1
electronic-circuit copper-cable 3
transport-belt iron-plate 1
transport-belt iron-gear-wheel 1
electric-mining-drill electronic-circuit 3
electric-mining-drill iron-gear-wheel 5
electric-mining-drill iron-plate 10
burner-mining-drill iron-gear-wheel 3
burner-mining-drill stone-furnace 1
burner-mining-drill iron-plate 3
inserter electronic-circuit 1
inserter iron-gear-wheel 1
inserter iron-plate 1
burner-inserter iron-plate 1
burner-inserter iron-gear-wheel 1
pipe iron-plate 1
offshore-pump electronic-circuit 2
offshore-pump pipe 1
offshore-pump iron-gear-wheel 1
copper-cable copper-plate 1
small-electric-pole wood 2
small-electric-pole copper-cable 2
pistol copper-plate 5
pistol iron-plate 5
submachine-gun iron-gear-wheel 10
submachine-gun copper-plate 5
submachine-gun iron-plate 10
firearm-magazine iron-plate 2
light-armor iron-plate 40
radar electronic-circuit 5
radar iron-gear-wheel 5
radar iron-plate 10
small-lamp electronic-circuit 1
small-lamp iron-stick 3
small-lamp iron-plate 1
pipe-to-ground pipe 10
pipe-to-ground iron-plate 5
assembling-machine-1 electronic-circuit 3
assembling-machine-1 iron-gear-wheel 5
assembling-machine-1 iron-plate 9
repair-pack electronic-circuit 1
repair-pack iron-gear-wheel 1
gun-turret iron-gear-wheel 10
gun-turret copper-plate 10
gun-turret iron-plate 20
night-vision-equipment advanced-circuit 5
night-vision-equipment steel-plate 10
energy-shield-equipment advanced-circuit 5
energy-shield-equipment steel-plate 10
energy-shield-mk2-equipment energy-shield-equipment 10
energy-shield-mk2-equipment processing-unit 10
battery-equipment battery 5
battery-equipment steel-plate 10
battery-mk2-equipment battery-equipment 10
battery-mk2-equipment processing-unit 20
solar-panel-equipment solar-panel 5
solar-panel-equipment processing-unit 1
solar-panel-equipment steel-plate 5
fusion-reactor-equipment processing-unit 100
fusion-reactor-equipment alien-artifact 30
personal-laser-defense-equipment processing-unit 1
personal-laser-defense-equipment steel-plate 5
personal-laser-defense-equipment laser-turret 5
discharge-defense-equipment processing-unit 5
discharge-defense-equipment steel-plate 20
discharge-defense-equipment laser-turret 10
exoskeleton-equipment processing-unit 10
exoskeleton-equipment electric-engine-unit 30
exoskeleton-equipment steel-plate 20
personal-roboport-equipment processing-unit 10
personal-roboport-equipment iron-gear-wheel 40
personal-roboport-equipment steel-plate 20
personal-roboport-equipment battery 45
basic-oil-processing crude-oil 10
advanced-oil-processing water 5
advanced-oil-processing crude-oil 10
heavy-oil-cracking water 3
heavy-oil-cracking heavy-oil 4
light-oil-cracking water 3
light-oil-cracking light-oil 3
sulfuric-acid sulfur 5
sulfuric-acid iron-plate 1
sulfuric-acid water 10
plastic-bar petroleum-gas 3
plastic-bar coal 1
solid-fuel-from-light-oil light-oil 1
solid-fuel-from-petroleum-gas petroleum-gas 2
solid-fuel-from-heavy-oil heavy-oil 2
sulfur water 3
sulfur petroleum-gas 3
lubricant heavy-oil 1
empty-barrel steel-plate 1
fill-crude-oil-barrel crude-oil 25
fill-crude-oil-barrel empty-barrel 1
empty-crude-oil-barrel crude-oil-barrel 1
flame-thrower-ammo iron-plate 5
flame-thrower-ammo light-oil 2.5
flame-thrower-ammo heavy-oil 2.5
steel-plate iron-plate 5
long-handed-inserter iron-gear-wheel 1
long-handed-inserter iron-plate 1
long-handed-inserter inserter 1
fast-inserter electronic-circuit 2
fast-inserter iron-plate 2
fast-inserter inserter 1
filter-inserter fast-inserter 1
filter-inserter electronic-circuit 4
stack-inserter iron-gear-wheel 15
stack-inserter electronic-circuit 15
stack-inserter advanced-circuit 1
stack-inserter fast-inserter 1
stack-filter-inserter stack-inserter 1
stack-filter-inserter electronic-circuit 5
speed-module advanced-circuit 5
speed-module electronic-circuit 5
speed-module-2 speed-module 4
speed-module-2 processing-unit 5
speed-module-2 advanced-circuit 5
speed-module-3 speed-module-2 4
speed-module-3 advanced-circuit 5
speed-module-3 processing-unit 5
speed-module-3 alien-artifact 1
productivity-module advanced-circuit 5
productivity-module electronic-circuit 5
productivity-module-2 productivity-module 4
productivity-module-2 advanced-circuit 5
productivity-module-2 processing-unit 5
productivity-module-3 productivity-module-2 5
productivity-module-3 advanced-circuit 5
productivity-module-3 processing-unit 5
productivity-module-3 alien-artifact 1
effectivity-module advanced-circuit 5
effectivity-module electronic-circuit 5
effectivity-module-2 effectivity-module 4
effectivity-module-2 advanced-circuit 5
effectivity-module-2 processing-unit 5
effectivity-module-3 effectivity-module-2 5
effectivity-module-3 advanced-circuit 5
effectivity-module-3 processing-unit 5
effectivity-module-3 alien-artifact 1
player-port electronic-circuit 10
player-port iron-gear-wheel 5
player-port iron-plate 1
fast-transport-belt iron-gear-wheel 5
fast-transport-belt transport-belt 1
express-transport-belt iron-gear-wheel 5
express-transport-belt fast-transport-belt 1
express-transport-belt lubricant 2
solar-panel steel-plate 5
solar-panel electronic-circuit 15
solar-panel copper-plate 5
assembling-machine-2 iron-plate 9
assembling-machine-2 electronic-circuit 3
assembling-machine-2 iron-gear-wheel 5
assembling-machine-2 assembling-machine-1 1
assembling-machine-3 speed-module 4
assembling-machine-3 assembling-machine-2 2
car engine-unit 8
car iron-plate 20
car steel-plate 5
tank engine-unit 16
tank steel-plate 50
tank iron-gear-wheel 15
tank advanced-circuit 5
rail stone 1
rail iron-stick 1
rail steel-plate 1
diesel-locomotive engine-unit 20
diesel-locomotive electronic-circuit 10
diesel-locomotive steel-plate 30
cargo-wagon iron-gear-wheel 10
cargo-wagon iron-plate 20
cargo-wagon steel-plate 20
train-stop electronic-circuit 5
train-stop iron-plate 10
train-stop steel-plate 3
rail-signal electronic-circuit 1
rail-signal iron-plate 5
rail-chain-signal electronic-circuit 1
rail-chain-signal iron-plate 5
heavy-armor copper-plate 100
heavy-armor steel-plate 50
modular-armor advanced-circuit 30
modular-armor processing-unit 5
modular-armor steel-plate 50
power-armor processing-unit 40
power-armor electric-engine-unit 20
power-armor steel-plate 40
power-armor alien-artifact 10
power-armor-mk2 effectivity-module-3 5
power-armor-mk2 speed-module-3 5
power-armor-mk2 processing-unit 40
power-armor-mk2 steel-plate 40
power-armor-mk2 alien-artifact 50
iron-chest iron-plate 8
steel-chest steel-plate 8
stone-wall stone-brick 5
gate stone-wall 1
gate steel-plate 2
gate electronic-circuit 2
flame-thrower steel-plate 5
flame-thrower iron-gear-wheel 10
land-mine steel-plate 1
land-mine explosives 2
rocket-launcher iron-plate 5
rocket-launcher iron-gear-wheel 5
rocket-launcher electronic-circuit 5
shotgun iron-plate 15
shotgun iron-gear-wheel 5
shotgun copper-plate 10
shotgun wood 5
combat-shotgun steel-plate 15
combat-shotgun iron-gear-wheel 5
combat-shotgun copper-plate 10
combat-shotgun wood 10
railgun steel-plate 15
railgun copper-plate 15
railgun electronic-circuit 10
railgun advanced-circuit 5
science-pack-1 copper-plate 1
science-pack-1 iron-gear-wheel 1
science-pack-2 inserter 1
science-pack-2 transport-belt 1
science-pack-3 battery 1
science-pack-3 advanced-circuit 1
science-pack-3 filter-inserter 1
science-pack-3 steel-plate 1
alien-science-pack alien-artifact 1
lab electronic-circuit 10
lab iron-gear-wheel 10
lab transport-belt 4
red-wire electronic-circuit 1
red-wire copper-cable 1
green-wire electronic-circuit 1
green-wire copper-cable 1
underground-belt iron-plate 10
underground-belt transport-belt 5
fast-underground-belt iron-gear-wheel 20
fast-underground-belt underground-belt 2
express-underground-belt iron-gear-wheel 40
express-underground-belt fast-underground-belt 2
express-underground-belt lubricant 4
loader inserter 5
loader electronic-circuit 5
loader iron-gear-wheel 5
loader iron-plate 5
loader transport-belt 5
fast-loader fast-transport-belt 5
fast-loader loader 1
express-loader express-transport-belt 5
express-loader fast-loader 1
splitter electronic-circuit 5
splitter iron-plate 5
splitter transport-belt 4
fast-splitter splitter 1
fast-splitter iron-gear-wheel 10
fast-splitter electronic-circuit 10
express-splitter fast-splitter 1
express-splitter iron-gear-wheel 10
express-splitter advanced-circuit 10
express-splitter lubricant 8
advanced-circuit electronic-circuit 2
advanced-circuit plastic-bar 2
advanced-circuit copper-cable 4
processing-unit electronic-circuit 20
processing-unit advanced-circuit 2
processing-unit sulfuric-acid 0.5
logistic-robot flying-robot-frame 1
logistic-robot advanced-circuit 2
construction-robot flying-robot-frame 1
construction-robot electronic-circuit 2
logistic-chest-passive-provider steel-chest 1
logistic-chest-passive-provider electronic-circuit 3
logistic-chest-passive-provider advanced-circuit 1
logistic-chest-active-provider steel-chest 1
logistic-chest-active-provider electronic-circuit 3
logistic-chest-active-provider advanced-circuit 1
logistic-chest-storage steel-chest 1
logistic-chest-storage electronic-circuit 3
logistic-chest-storage advanced-circuit 1
logistic-chest-requester steel-chest 1
logistic-chest-requester electronic-circuit 3
logistic-chest-requester advanced-circuit 1
rocket-silo steel-plate 1000
rocket-silo concrete 1000
rocket-silo pipe 100
rocket-silo processing-unit 200
rocket-silo electric-engine-unit 200
roboport steel-plate 45
roboport iron-gear-wheel 45
roboport advanced-circuit 45
steel-axe steel-plate 5
steel-axe iron-stick 2
big-electric-pole steel-plate 5
big-electric-pole copper-plate 5
substation steel-plate 10
substation advanced-circuit 5
substation copper-plate 5
medium-electric-pole steel-plate 2
medium-electric-pole copper-plate 2
accumulator iron-plate 2
accumulator battery 5
steel-furnace steel-plate 8
steel-furnace stone-brick 10
electric-furnace steel-plate 15
electric-furnace advanced-circuit 5
electric-furnace stone-brick 10
beacon electronic-circuit 20
beacon advanced-circuit 20
beacon steel-plate 10
beacon copper-cable 10
blueprint advanced-circuit 1
blueprint-book advanced-circuit 15
deconstruction-planner advanced-circuit 1
pumpjack steel-plate 15
pumpjack iron-gear-wheel 10
pumpjack electronic-circuit 10
pumpjack pipe 10
oil-refinery steel-plate 15
oil-refinery iron-gear-wheel 10
oil-refinery stone-brick 10
oil-refinery electronic-circuit 10
oil-refinery pipe 10
engine-unit steel-plate 1
engine-unit iron-gear-wheel 1
engine-unit pipe 2
electric-engine-unit engine-unit 1
electric-engine-unit lubricant 2
electric-engine-unit electronic-circuit 2
flying-robot-frame electric-engine-unit 1
flying-robot-frame battery 2
flying-robot-frame steel-plate 1
flying-robot-frame electronic-circuit 3
explosives sulfur 1
explosives coal 1
explosives water 1
battery sulfuric-acid 2
battery iron-plate 1
battery copper-plate 1
storage-tank iron-plate 20
storage-tank steel-plate 5
small-pump electric-engine-unit 1
small-pump steel-plate 1
small-pump pipe 1
chemical-plant steel-plate 5
chemical-plant iron-gear-wheel 5
chemical-plant electronic-circuit 5
chemical-plant pipe 5
small-plane plastic-bar 100
small-plane advanced-circuit 200
small-plane electric-engine-unit 20
small-plane battery 100
arithmetic-combinator copper-cable 5
arithmetic-combinator electronic-circuit 5
decider-combinator copper-cable 5
decider-combinator electronic-circuit 5
constant-combinator copper-cable 5
constant-combinator electronic-circuit 2
power-switch iron-plate 5
power-switch copper-cable 5
power-switch electronic-circuit 2
low-density-structure steel-plate 10
low-density-structure copper-plate 5
low-density-structure plastic-bar 5
rocket-fuel solid-fuel 10
rocket-control-unit processing-unit 1
rocket-control-unit speed-module 1
rocket-part low-density-structure 10
rocket-part rocket-fuel 10
rocket-part rocket-control-unit 10
satellite low-density-structure 100
satellite solar-panel 100
satellite accumulator 100
satellite radar 5
satellite processing-unit 100
satellite rocket-fuel 50
concrete stone-brick 5
concrete iron-ore 1
concrete water 10
hazard-concrete concrete 10
landfill stone 20
electric-energy-interface iron-plate 2
electric-energy-interface electronic-circuit 5
laser-turret steel-plate 20
laser-turret electronic-circuit 20
laser-turret battery 12
flamethrower-turret steel-plate 30
flamethrower-turret iron-gear-wheel 15
flamethrower-turret pipe 10
flamethrower-turret engine-unit 5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment