Gigatrains: 720-car trains supplying a 10K science/min base
Posted: Thu Oct 18, 2018 10:11 pm
Instead of scaling by adding more trains, I wondered what would happen if I scaled by making *longer* trains. It actually works great! And it's hilarious to watch.
My base currently launches a rocket produces 10K science/min (including one rocket launch every 6 game seconds) using just a handful of trains that are 720 cars long. This post describes the base, including various design choices behind it. I'll also upload photos and a blueprint in replies to this post.
FACTORY OVERVIEW
Trains are used to haul ore to one long, gigantic factory. Trains are the same length as the factory, and consist of a repeating pattern of 2 locomotives and 10 ore cars. There are two kinds of trains; the trains entering the top of the factory bring iron ore, while the trains at the bottom carry (per each 10-car group) 5 cars copper ore, 4 cars coal, and 1 car stone. The 10 cargo wagons of iron plus 10 cargo wagons of other raw ingredients (copper/coal/stone) is enough to build 1/5 of a rocket launch (= 200 white science) and 200 of each other science pack. (The factory uses productivity 3 modules everywhere possible.) Each 760-car train has 120 engines and 600 cargo wagons, delivers 1.2M ore, and can make 12K of each science.
The factory itself scales in chunks that are exactly the width of the 12-car train set. 12 because this gives an acceptable ratio of locomotives, is wide enough to be practical, and makes the factory width a multiple of 3 tiles (which is the size of beacons/factories/smelters). Factory chunks are packed with no gap to maximize area and beacon effects, although if I did this again I'd probably use 24 cars and leave a bit of a gap to make walking easier. Each factory chunk is designed to produce 200 science/minute, although sustained throughput is a bit less. Still, the current 60-unit factory sustains >10K science/minute, including a rocket launch every 6 game seconds.
The factory takes in raw ore and does its own smelting, so no processing is required at mines. In addition to being elegant, this simplifies ore collection and avoids scaling mismatches due to productivity bonuses, which increase ore production from drills but not smelting speed. The entire factory and mining area are in an area that's protected by walls/turrets and cleared of biters, so no defenses are needed. As I'm writing this, I've launched 10,936 satellites and have a mining productivity bonus of +664%.
TRAINS & ORE COLLECTION
Trains consists of a pattern of 2 locomotives followed by 10 cargo wagons (LLCCCCCCCCCCLLCCCCCCCCCC...). This pattern currently repeats 60X, for a total of 720 cars per train.
For trains this long, top speed matters far more than acceleration. For example, trains take roughly 75 seconds to go from stopped at a station to having fully exited the station using rocket or nuclear fuel. (The difference is minor, since the max speed is the same.) Another train can slide in while this is happening, but the time between trains will always be slower than this. To keep busy, the factory needs about about 1 train/minute of each type, so at its current scale it exceeds the throughput of one track. Thus, I currently have two unloading bays for each train type. (Larger factories would need more bays... 100K SPM with ~15 loading bays anybody?)
Outside the factory, I have a loop of rail tracks (consisting of 4 non-crossing tracks) for iron ore collection on the north side of the factory, and a set of 4 parallel tracks on the south side for copper/coal/stone. Note that these gigantic trains can't cross while the factory is running, since an intersection would incur terrible delays. Along the tracks, the first train length of track has no signals (so trains exit the station cleanly into one of the ore tracks), then after that there are regular signals (no chain signals) spaced ~12 cars apart to allow trains travel smoothly with only modest gaps. Tracks can curve around ore spots, so when trains stop a bunch of cargo wagons get filled up. Trains can stop 2-3 times per train length, so one ore patch can fill multiple parts of a train. For track building, I used blueprints that place the tracks and signals (e.g. a blueprint for 4 tracks going straight, turning left, or turning right).
The portion of a train stopped at an ore patch gets filled from chests, which buffer up the ore. For the copper/coal/stone train, these need be aligned to load the right material (although filters on the cargo cars prevent misloading). Trains are powered by nuclear fuel which is produced in a single area and delivered via a circular belt runs along the top of the factory, although the factory can be easily switched to rocket fuel by changing requestor chests that feed the fuel belts.
Building trains of this size is a bit tedious. To speed this up, I created a set of 15 horizontal tigtly-packed tracks each 48 cars long. My player character can then run up/down these, adding cars/locomotives, pasting filters onto cars, and putting initial fuel in cars. I then join the train segments togther. For trains at this scale, filters on the ore cars are a must; it'd be immensely tedious to fix if a train got loaded with the wrong material. (According to a recent FFF, train blueprints are coming which will automate all this.)
FACTORY INTERNALS
Most of the factory consists of alternating rows of beacons (with speed 3 modules) and smelters/assemblers (with productivity 3 modules everywhere possible). The rows are slightly offset horizontally so that factories/smelters are boosted by 8 beacons, allowing smelters run at crafting speed 9.4 and factories at 5.5. The pattern is broken in a few cases, e.g. for larger entities (e.g. roboports) and the lower area where coal/oil processing occurs.
Ore and bulk materials are moved by belts, while logistic robots move smaller-volume materials. Each factory chunk has a logistic network that does not overlap with other factory chunks. This keeps robots from making crazily long trips or getting unevenly spread around the factory. The current factory is a little short on roboports, which reduces performance a bit.
I put the rocket silo at the top in case I later want to relocate all the rocket launches to a central viewing area. Below this is a circular belt. During operation, this delivers nuclear fuel. During setup, it's used to load logistic robots. A constant combinator specifies the min/max number of robots per factory chunk (currently 550), and inserters add/remove robots into roboports in the factory chunks. For robot removal, robots need to be in the top roboport, which is achieved by having a requestor chest at the top with an inserter that moves the item into a provider chest. The robot doing this eventually settles in the nearby roboport, where it can be removed. The factory chunks each contain exactly one storage chest, which (when directed via a constant combinator) gets emptied onto the top belt as a way to get rid the logistic network of unwanted junk, such as wood from the player or items during deconstruction.
Below the belt is a track for personal trains, the two tracks/unloading areas for iron ore trains, and a belt balancer to keep iron ore usage roughly even. The main assembly area has mostly iron/steel smelting toward the top, with assorted assembly in the middle, and coal/oil processing at the bottom. Below that are the tracks/unloaders for copper/coal/stone. Inputs for water/oil are placed at the very bottom.
OIL/COAL, WATER
The factory is designed to operate at full speed using coal liquifaction, but can also take oil (and needs some oil initially to create enough heavy oil to start coal liquifaction). I mostly run on coal, since there isn't much oil where I built, although I have oil pipes/tanks that at the bottom mainly for priming. Originally, I tried to have the factory chunks share heavy oil for bootstrapping, but I removed this as it didn't work well and priming with regular oil worked nicely. I also had chunks sharing water horizontally (with every other chunk getting supplied with water), but I ended up piping in water to every chunk and removing most of these connections because some chunks weren't getting enough water. In general, the fluid mechanics are fiddly, which (thankfully) a recent FFF said will get fixed someday. I chose to locate the factory in a fairly water-rich region (with a lot on landfill) because I knew water would be tricky.
ELECTRICITY
I need a massive amount of electricity: I'm currently drawing 63+GW between the gigafactory and the other things I've built (e.g. the bootstrap factory, module factory, etc.). The largest power draws are 18K smelters (20.1 GW), 40K beacons (19.2 GW) and 12K assembling machine 3s (12.2 GW), and 11K roboports (3.2 GW although these are mostly in the solar fields). Except for a tiny nuclear setup (which I didn't scale up due UPS impact) electricity is generated using solar. A lot of solar. 1.6M solar panels and 1.3M accumulators.
CONSTRUCTION OF FACTORY AND SOLAR FIELDS
Everything was built using the stock game, e.g. no mods or cheats with the sole exception that I added ore patches for the gigafactory via a console command. (I got bored of stitching together naturally-occurring ore patches.) I started from a game where I'd already built a conventional main bus factory as well as a 1 RPM rocket/science setup. I then added dedicated factories for items required in bulk: solar panels, accumulators, nuclear fuel, and productivity 3/speed 3 modules. Everything else was built using the vanilla main bus factory.
To clear large swaths of land, I used a mix of artillery turrets (built+serviced by robots) and artillery trains to clear out biter nests. I then typically used robots to lay down a pattern of roboports/laser turrets/substations/radars. (The laser turrets clear out stray biters.) I then used a deconstruction planner to have the robots clear out trees and the now-unneeded laser turrets.
For factory land, it's then necessary to do a tedious manual cleanup with landfill/cliff explosives. (I only minimal cleanup on solar fields, since they can tolerate imperfections.) It's really hard to spot some land imperfections, such as a single tile of water surrounded by grass, so to find these I typically hover a densely-packed blueprint over the land and look for any entities that turn red. I built solar/accumulator areas by shift-clicking a large blueprint on top of the initial roboports/substations (which are patterned in the right places in the first pass). The solar field builds took about a week of unattended time to complete using ~6K construction robots and dedicated factories for solar/accumulators (~2 of each per second).
A train station at each build area delivered construction supplies and carts off wood and other junk (stone, deconstructed turrets, etc.) Although I suppose I could use wood to fuel boilers, I've just let it pile up. Currently, my wood pile has ~3.6M wood in ~750 chests.
During the factory build, I connected the factory logistic networks together, then afterward I separated the networks by removing the roboports. The build would have been faster if I'd built the power/roboports first using the character roboport, but I mostly didn't do this. Factory bugfixes were done using the character's roboport, however, which requires running the huge length of the factory. Given that the factory itself is 5040 tiles long, this takes a while -- so I batched these up and kept changes to a minimum.
The game has a few quirks when building at this scale. For example, there's a limit on the number of pending tasks it queues for construction robots, which results in large construction jobs taking longer. Thankfully, the player's roboport has a [mostly] separate queue... but it's problematic if you start a big construction job before all the modules are ready. Construction robots also get stuck if they're trying to build on top of a tile that is pending deconstruction (e.g. a tree), so I quickly learned to clear then build, rather than adding a blueprint while deconstruction is going on. It's also quite a bit faster if some initial roboports and their power are built via the player's roboport. I also came across a bug where a bunch of my a robot-placed electric mining drills were feeding an chest directly, but were 'stuck' (not mining) despite the chest being empty. (My workaround was to requesting then quickly cancel their deconstruction.) Overall, the largest annoyance is that robots can't apply landfill or cliff explosives.
I keep my factory surrounded by walls (protected with laser turrets and repaired by robots), so biters generally aren't an issue. (Biters generate nests, so once land has been fully cleared it should stay cleared.)
GAME PERFORMANCE
When the giant factory is idle, but other things are going on (e.g. building modules, etc.) I'm seeing ~20 UPS (updates per second). When the giant factory runs, this falls to about 8.4 UPS. The times I've included here are 'game time' (e.g. at 10 UPS, 'wall clock' time is 1/6th of game time).
THOUGHTS ON THE GAME
I've played for a few hundred hours, and think the game is incredible.
Still, there are some tasks that seem unnecessarily difficult or rough edges:
Factorio is a great game... the best I've seen in many years. If you haven't bought it, you should. And big thanks to the team at Wube for enjoyably wasting lots of my time!
My base currently launches a rocket produces 10K science/min (including one rocket launch every 6 game seconds) using just a handful of trains that are 720 cars long. This post describes the base, including various design choices behind it. I'll also upload photos and a blueprint in replies to this post.
FACTORY OVERVIEW
Trains are used to haul ore to one long, gigantic factory. Trains are the same length as the factory, and consist of a repeating pattern of 2 locomotives and 10 ore cars. There are two kinds of trains; the trains entering the top of the factory bring iron ore, while the trains at the bottom carry (per each 10-car group) 5 cars copper ore, 4 cars coal, and 1 car stone. The 10 cargo wagons of iron plus 10 cargo wagons of other raw ingredients (copper/coal/stone) is enough to build 1/5 of a rocket launch (= 200 white science) and 200 of each other science pack. (The factory uses productivity 3 modules everywhere possible.) Each 760-car train has 120 engines and 600 cargo wagons, delivers 1.2M ore, and can make 12K of each science.
The factory itself scales in chunks that are exactly the width of the 12-car train set. 12 because this gives an acceptable ratio of locomotives, is wide enough to be practical, and makes the factory width a multiple of 3 tiles (which is the size of beacons/factories/smelters). Factory chunks are packed with no gap to maximize area and beacon effects, although if I did this again I'd probably use 24 cars and leave a bit of a gap to make walking easier. Each factory chunk is designed to produce 200 science/minute, although sustained throughput is a bit less. Still, the current 60-unit factory sustains >10K science/minute, including a rocket launch every 6 game seconds.
The factory takes in raw ore and does its own smelting, so no processing is required at mines. In addition to being elegant, this simplifies ore collection and avoids scaling mismatches due to productivity bonuses, which increase ore production from drills but not smelting speed. The entire factory and mining area are in an area that's protected by walls/turrets and cleared of biters, so no defenses are needed. As I'm writing this, I've launched 10,936 satellites and have a mining productivity bonus of +664%.
TRAINS & ORE COLLECTION
Trains consists of a pattern of 2 locomotives followed by 10 cargo wagons (LLCCCCCCCCCCLLCCCCCCCCCC...). This pattern currently repeats 60X, for a total of 720 cars per train.
For trains this long, top speed matters far more than acceleration. For example, trains take roughly 75 seconds to go from stopped at a station to having fully exited the station using rocket or nuclear fuel. (The difference is minor, since the max speed is the same.) Another train can slide in while this is happening, but the time between trains will always be slower than this. To keep busy, the factory needs about about 1 train/minute of each type, so at its current scale it exceeds the throughput of one track. Thus, I currently have two unloading bays for each train type. (Larger factories would need more bays... 100K SPM with ~15 loading bays anybody?)
Outside the factory, I have a loop of rail tracks (consisting of 4 non-crossing tracks) for iron ore collection on the north side of the factory, and a set of 4 parallel tracks on the south side for copper/coal/stone. Note that these gigantic trains can't cross while the factory is running, since an intersection would incur terrible delays. Along the tracks, the first train length of track has no signals (so trains exit the station cleanly into one of the ore tracks), then after that there are regular signals (no chain signals) spaced ~12 cars apart to allow trains travel smoothly with only modest gaps. Tracks can curve around ore spots, so when trains stop a bunch of cargo wagons get filled up. Trains can stop 2-3 times per train length, so one ore patch can fill multiple parts of a train. For track building, I used blueprints that place the tracks and signals (e.g. a blueprint for 4 tracks going straight, turning left, or turning right).
The portion of a train stopped at an ore patch gets filled from chests, which buffer up the ore. For the copper/coal/stone train, these need be aligned to load the right material (although filters on the cargo cars prevent misloading). Trains are powered by nuclear fuel which is produced in a single area and delivered via a circular belt runs along the top of the factory, although the factory can be easily switched to rocket fuel by changing requestor chests that feed the fuel belts.
Building trains of this size is a bit tedious. To speed this up, I created a set of 15 horizontal tigtly-packed tracks each 48 cars long. My player character can then run up/down these, adding cars/locomotives, pasting filters onto cars, and putting initial fuel in cars. I then join the train segments togther. For trains at this scale, filters on the ore cars are a must; it'd be immensely tedious to fix if a train got loaded with the wrong material. (According to a recent FFF, train blueprints are coming which will automate all this.)
FACTORY INTERNALS
Most of the factory consists of alternating rows of beacons (with speed 3 modules) and smelters/assemblers (with productivity 3 modules everywhere possible). The rows are slightly offset horizontally so that factories/smelters are boosted by 8 beacons, allowing smelters run at crafting speed 9.4 and factories at 5.5. The pattern is broken in a few cases, e.g. for larger entities (e.g. roboports) and the lower area where coal/oil processing occurs.
Ore and bulk materials are moved by belts, while logistic robots move smaller-volume materials. Each factory chunk has a logistic network that does not overlap with other factory chunks. This keeps robots from making crazily long trips or getting unevenly spread around the factory. The current factory is a little short on roboports, which reduces performance a bit.
I put the rocket silo at the top in case I later want to relocate all the rocket launches to a central viewing area. Below this is a circular belt. During operation, this delivers nuclear fuel. During setup, it's used to load logistic robots. A constant combinator specifies the min/max number of robots per factory chunk (currently 550), and inserters add/remove robots into roboports in the factory chunks. For robot removal, robots need to be in the top roboport, which is achieved by having a requestor chest at the top with an inserter that moves the item into a provider chest. The robot doing this eventually settles in the nearby roboport, where it can be removed. The factory chunks each contain exactly one storage chest, which (when directed via a constant combinator) gets emptied onto the top belt as a way to get rid the logistic network of unwanted junk, such as wood from the player or items during deconstruction.
Below the belt is a track for personal trains, the two tracks/unloading areas for iron ore trains, and a belt balancer to keep iron ore usage roughly even. The main assembly area has mostly iron/steel smelting toward the top, with assorted assembly in the middle, and coal/oil processing at the bottom. Below that are the tracks/unloaders for copper/coal/stone. Inputs for water/oil are placed at the very bottom.
OIL/COAL, WATER
The factory is designed to operate at full speed using coal liquifaction, but can also take oil (and needs some oil initially to create enough heavy oil to start coal liquifaction). I mostly run on coal, since there isn't much oil where I built, although I have oil pipes/tanks that at the bottom mainly for priming. Originally, I tried to have the factory chunks share heavy oil for bootstrapping, but I removed this as it didn't work well and priming with regular oil worked nicely. I also had chunks sharing water horizontally (with every other chunk getting supplied with water), but I ended up piping in water to every chunk and removing most of these connections because some chunks weren't getting enough water. In general, the fluid mechanics are fiddly, which (thankfully) a recent FFF said will get fixed someday. I chose to locate the factory in a fairly water-rich region (with a lot on landfill) because I knew water would be tricky.
ELECTRICITY
I need a massive amount of electricity: I'm currently drawing 63+GW between the gigafactory and the other things I've built (e.g. the bootstrap factory, module factory, etc.). The largest power draws are 18K smelters (20.1 GW), 40K beacons (19.2 GW) and 12K assembling machine 3s (12.2 GW), and 11K roboports (3.2 GW although these are mostly in the solar fields). Except for a tiny nuclear setup (which I didn't scale up due UPS impact) electricity is generated using solar. A lot of solar. 1.6M solar panels and 1.3M accumulators.
CONSTRUCTION OF FACTORY AND SOLAR FIELDS
Everything was built using the stock game, e.g. no mods or cheats with the sole exception that I added ore patches for the gigafactory via a console command. (I got bored of stitching together naturally-occurring ore patches.) I started from a game where I'd already built a conventional main bus factory as well as a 1 RPM rocket/science setup. I then added dedicated factories for items required in bulk: solar panels, accumulators, nuclear fuel, and productivity 3/speed 3 modules. Everything else was built using the vanilla main bus factory.
To clear large swaths of land, I used a mix of artillery turrets (built+serviced by robots) and artillery trains to clear out biter nests. I then typically used robots to lay down a pattern of roboports/laser turrets/substations/radars. (The laser turrets clear out stray biters.) I then used a deconstruction planner to have the robots clear out trees and the now-unneeded laser turrets.
For factory land, it's then necessary to do a tedious manual cleanup with landfill/cliff explosives. (I only minimal cleanup on solar fields, since they can tolerate imperfections.) It's really hard to spot some land imperfections, such as a single tile of water surrounded by grass, so to find these I typically hover a densely-packed blueprint over the land and look for any entities that turn red. I built solar/accumulator areas by shift-clicking a large blueprint on top of the initial roboports/substations (which are patterned in the right places in the first pass). The solar field builds took about a week of unattended time to complete using ~6K construction robots and dedicated factories for solar/accumulators (~2 of each per second).
A train station at each build area delivered construction supplies and carts off wood and other junk (stone, deconstructed turrets, etc.) Although I suppose I could use wood to fuel boilers, I've just let it pile up. Currently, my wood pile has ~3.6M wood in ~750 chests.
During the factory build, I connected the factory logistic networks together, then afterward I separated the networks by removing the roboports. The build would have been faster if I'd built the power/roboports first using the character roboport, but I mostly didn't do this. Factory bugfixes were done using the character's roboport, however, which requires running the huge length of the factory. Given that the factory itself is 5040 tiles long, this takes a while -- so I batched these up and kept changes to a minimum.
The game has a few quirks when building at this scale. For example, there's a limit on the number of pending tasks it queues for construction robots, which results in large construction jobs taking longer. Thankfully, the player's roboport has a [mostly] separate queue... but it's problematic if you start a big construction job before all the modules are ready. Construction robots also get stuck if they're trying to build on top of a tile that is pending deconstruction (e.g. a tree), so I quickly learned to clear then build, rather than adding a blueprint while deconstruction is going on. It's also quite a bit faster if some initial roboports and their power are built via the player's roboport. I also came across a bug where a bunch of my a robot-placed electric mining drills were feeding an chest directly, but were 'stuck' (not mining) despite the chest being empty. (My workaround was to requesting then quickly cancel their deconstruction.) Overall, the largest annoyance is that robots can't apply landfill or cliff explosives.
I keep my factory surrounded by walls (protected with laser turrets and repaired by robots), so biters generally aren't an issue. (Biters generate nests, so once land has been fully cleared it should stay cleared.)
GAME PERFORMANCE
When the giant factory is idle, but other things are going on (e.g. building modules, etc.) I'm seeing ~20 UPS (updates per second). When the giant factory runs, this falls to about 8.4 UPS. The times I've included here are 'game time' (e.g. at 10 UPS, 'wall clock' time is 1/6th of game time).
THOUGHTS ON THE GAME
I've played for a few hundred hours, and think the game is incredible.
Still, there are some tasks that seem unnecessarily difficult or rough edges:
- Long-distance character movement. Riding trains huge distances is tedious. A faster character transport system (teleportation? rockets?) is needed for late-stage gameplay, even if it's relatively expensive.
- Summoning trains. The UI for directing a train to the player is awkward. Currently, this typically involves adding a temporary station, adding it to the train schedule, then entering wait parameter (e.g. 10M seconds). Could this be a single click?
- Larger zoom out. Blueprints that exceed the screen size are tricky to line up, since they can't be fully seen. Ground irregularities are hard to locate even when they're on the screen, and impossible when off screen.
- Setting constant combinators from map view. Currently the game allows map-view changes to constant combinator settings, but it's cumbersome (i.e. make the desired combinator by the player, make a blueprint, and apply it from map view). This should work like map view control of power switches.
- Combined deconstruction+construction. Editing a large factory is tedious, since it typically requires deconstructing parts then rebuilding with another blueprint. It'd be much cleaner if there was a way to have one a blueprint and which would automatically deconstruct+build wherever there were differences, but leave the rest unchanged. It'd be even better if there was a blueprint option for "clean land", where the robots would apply landfill & cliff explosives as needed, just like they do now for trees. (Robot support for cliff explosives and landfill would bypass a lot of pointlessly tedious work.)
- Train routing. I wish train stations had an option to specify that only one train should be en route/parked at once. Frustrations with train routing were partly why I switched to crazy-long trains...
- Integrate map view better into the story, e.g. radioactive regions that harm/kill the player. A scenario that requires accomplishing a task remotely would also be fun.
- More achievements would be nice.
- Train optimization [minor]. Trains coast really far in manual mode, implying greater efficiency, yet they burn fuel at the same pace as short trains while running at speed. UPS for long trains is also not optimized in the game; when just 4 of my long trains are moving, ~11ms (out of 115ms) of my update time (when I press F5) is consumed by trains (vs. negligible when they're stopped). A particularly crazy option would be to have the a max speed increase with train length (= reflecting reduced wind resistance?)... and this would lead to some fun ways to move the player around.
- Minor UI nits: it'd be nice to have fewer keystrokes to memorize (e.g. add clickable icons for various keyboard tasks?); the middle-click action for setting car train filters is weird; there isn't a good visual cue to distinguish when factories are stuck due to excessive output (rather than lack of inputs); chemical plant activity status is hard to see (unlike assemblers); manual mode train steering in reverse is confusing; it's unclear which side of a train the character will exit when pressing enter.
Factorio is a great game... the best I've seen in many years. If you haven't bought it, you should. And big thanks to the team at Wube for enjoyably wasting lots of my time!