10k SPM bot-free train-heavy modular base
Posted: Fri Oct 09, 2020 11:30 pm
Hi everyone,
I want to show you my mega-base design.
As you can see, arrival to or departure from a train stop only works from one direction of the surrounding track grid. I thought that was fine. *cough* Of course it means that the distance a train has to travel between squares is different depending on the direction and relative rotation of each square. I spent a lot of time making a map of what connections are the shortest, so that I could later put the whole factory together with the most throughput-heavy connections being the shortest travels.
Here is the RCU production as an example: This also shows my preferred machine setup: Virtually all intermediate product machines have productivity modules and are in alternating rows with speed beacons. Products that can't take productivity modules will have either no modules at all, or just the minimum speed modules necessary to keep the number of assemblers reasonably low, but never use beacons.
This ammunition production for 10kSPM fits in one square even with no modules. Still the regular row pattern, because I lack creativity. Here you also see that sometimes intermediate products are in the same square (here: basic ammo together with armor piercing ammo), as long as they fit and are not used elsewhere as well.
Some productions don't fit into one square, so there will be several identical ones. I already showed you the RCU production square, which is used three times in the factory. There might be several reasons why the production might not fit into a square:
Personally I don't like balancers. I've only ever used other peoples' blueprints because my head hurts even when trying to understand them, while I design everything else myself (maybe after studying someone else's design, but still with fully understanding it). Also they become comically huge with increasing number of belts (I understand them so little that I can't even tell how they grow with number of belts <n>, but the area seems to be way above O(n²)).
I achieve balance instead with symmetry: All belts have the same number of machines attached to them, often even on each side of each belt (by having each alternating row mirrored - I wished mirroring a blueprint would be possible in-game, and yes, I understand the issues with that). Allowing trains to turn around as soon as just one wagon is empty helps with getting initial balance to counter belt-length mismatches and other issues with the starting conditions.
Having this wagon-selective condition on both the loading and unloading stations is a mistake, it should only be at the unloading. I realized that after designing most of the squares, but as long as the train schedules are not set up to use it, it doesn't matter.
The petrochemistry doesn't quite fit into the design with four train stops: Here I added an extra loop with an extra fifth train stop. (This also causes the exception for the rule that all the producer stops have the extra stop for the train fuel: Lubricant trains are fueled at the consumer (electric engine units, of course).) This fifth stop looks like a huge waste of space, given that I now need eight of these petro squares. However, the size of one production square was limited by the amount of water I can get through only one train stop anyway - or more precisely, the amount of stuff I estimated I could get through one train stop, a number I had completely wrong anyway - more on that later.
Space science can also not be produced with only 3 inputs, the setup is different though: There are some combinators to limit the number of satellites sitting around unused on belts. Also, no rocket will be launched as long as the science pack from the previous launch are not extracted yet. There need to be three of these launch squares. The limiting factor here is how many trains I felt I could comfortably get through one station (those tiny stack sizes are a problem). A train will leave a space science pack station when it has at least 64k packs loaded (same as a full train for any other science pack), long before it is actually full. The satellite production doesn't fit into a square at all. Instead I use two squares, I skip the train stops that would be between those two squares, while still keeping the regular grid of tracks running between all squares. On most of the remaining two times three sides, I have two train stops next to each other, but without the extra waiting position.
One of these squares has the solar panel production (and also one assembler for the radar), the other one has the accumulator production (and also one assembler for the satellite itself). The satellite is transported in a 1-1 train, unlike almost everything else.
I will also show you the science lab square, three of these are needed for 10kSPM (assuming fully researched research speed): Same as for the sat: Two train stops per side, but no waiting positions.
If you look closely, you can see one additional limitation of this setup: Trains can not turn right at the crossing immediately after leaving the inner of the two stops - but that would completely change later anyway.
The nuclear train fuel is also produced in a square:
I also designed special "stacker" squares, here the one with three separate paths (I also have ones with only one and two paths): The idea was that if I have only chain signals on the crossings in the corners of each square, the few squares that needed more than just the one extra waiting position could have a stacker square next to it, and the trains will stay in these stackers and not block the track grid. Later I realized that this would not work as good as I thought it would, because each entry/exit of these squares only works in one direction (as I already mentioned at the beginning), making the placement of these cumbersome.
Instead I use what I think is called a "cross-dock":
What I don't like about these is that you can't really unload directly from train through chests into another train, so the throughput is limited by the belts. And yes, I know that it works diagonally (I actually built a square with that), but then only four chests (per wagon) can be placed, and the throughput is actually slightly lower as with the 8 chests I use here. Long inserters are even worse regarding throughput.
Of course there is a similar cross-dock for fluids.
They are needed because of the limitations of the train schedule and path finding thing, to distribute each product between x producers and y consumers, with x and y being coprime to one another. And yes, I've read the FFF for the upcoming 1.1 release. OMG, how much pain that would have spared me if that had been implemented earlier.
The smelters (iron plates, copper plates, steel plates) are not in these squares, but in an extra "layer" around the square grid. They are quite boring and incredible large, so no screenshot here.
I designed each of the needed squares (I showed only a small fraction of them here) separately, and tested each using trains coming from stations with infinity chests specifically for each square. I don't know how many hours I actually spent on these, but the savegame with all of them has now 160 hours on it (some of it I was AFK, to see if each square works continuously for an extended period of time). But of course I also spent a lot of time outside of the game just planning with Doomeer and KirkMcDonald. Since I played extremely irregularly, it ran over several months (or was it even years?). Then one day I finally tried to put all of it together, put each square in a blueprint, started a new game, placed the first few (petroechmistry plus plastic production, together with some cross-docks) - and fell flat on my face. It just didn't work. Even with this tiny fraction of the whole setup, the congestion on the innermost train track crossing caused the trains to wait for sometimes minutes before they could leave a station.
That was really painful.
I prefer belts over bots for several reasons, but one is that belts are usually calculable, bots not so much. And trains are even worse (but mostly unavoidable). What is the actual throughput of a train when there is an unpredictable amount of them at all times on the move, going from anywhere to everywhere else? In the end my estimates where completely off.
After tending to my bloody nose I came up with an easy fix: Four-track grid, while keeping the inner part of each square as before.
With this, trains can enter a stop from any direction and leave it into any direction, which helps with congestion just as much as the fact that there are now twice the number of tracks. Only downside is that it is much bigger, so the whole factory is even less space efficient.
So this is the full factory:
There is a grid of 15x8 used squares (minus 2 empty ones), plus an additional empty row at each edge, so really 17x10 squares. In the north are the copper smelters, with 8 copper ore unloading stations and 10 copper plate loading stations. In the east are iron smelters, 6 identical setups with one unloading and one loading station each. There are also two identical steel smelters in the southeast, each made out of three blocks, i.e. three iron ore unloader stations. In the south you can barely see the water, oil an stone from nothing stations (infinity chests), in the southwest is the uranium ore source.
It runs at about 25~28 UPS on my i7-6700K (slightly overclocked). Since currently the water, crude oil, ores, stone and coal comes from infinity chests, by my own requirement mentioned at the beginning, I'm technically not finished. Also the electricity supply is completely missing, there is just one electric energy interface for the 48 GW. There are also some creative-mod's "super radars" at the smelters.
The most complicated thing is the train setup. Due to the limitations of the game, it is highly impractically to route and balance stuff from many producers to many consumers. This is even more true when you deliberately design a compact setup where large stackers are not an option. Just to give you an idea how I solved it: There is one or two trains (max is two because there is only one waiting position before the square's stations) for each consumer of e.g. copper plates. Each of these trains will alternate between the 10 pickup stations at the smelters and the delivery, so 20 items in the train schedule, each with the correct conditions. Keep in mind that due to my design looking for empty single wagons, the unloading condition is "Emtpy cargo OR Circuit F > 0 AND 5 seconds passed". Which is why (a) in the end I skipped the wagon condition in most stops (though not all), (b) incroporated the "5 seconds passed" with some extra combinators into the circuit condition because you can copy&paste them around (unlike train conditions), and (c) decided that if I would ever do this again, I would instead write a small script that would generate a blueprint with all the trains in it. ... and now suddenly there will be a feature in 1.1 that fixes all of that.
Savegame (57 MiB): https://drive.google.com/file/d/1A6v_v9 ... sp=sharing
I want to show you my mega-base design.
- no bots
- lots of trains, one locomotive and eight cargo/fluid wagons, powered by nuclear fuel
- runs in vanilla Factorio with no "cheats" (well actually ...)
- produces theoretically 10k SPM of each of the seven science packs (there is no endless research for that, so that part is untested)
- runs in a map without biters (which makes the grey science kind of pointless, but meh)
As you can see, arrival to or departure from a train stop only works from one direction of the surrounding track grid. I thought that was fine. *cough* Of course it means that the distance a train has to travel between squares is different depending on the direction and relative rotation of each square. I spent a lot of time making a map of what connections are the shortest, so that I could later put the whole factory together with the most throughput-heavy connections being the shortest travels.
Here is the RCU production as an example: This also shows my preferred machine setup: Virtually all intermediate product machines have productivity modules and are in alternating rows with speed beacons. Products that can't take productivity modules will have either no modules at all, or just the minimum speed modules necessary to keep the number of assemblers reasonably low, but never use beacons.
This ammunition production for 10kSPM fits in one square even with no modules. Still the regular row pattern, because I lack creativity. Here you also see that sometimes intermediate products are in the same square (here: basic ammo together with armor piercing ammo), as long as they fit and are not used elsewhere as well.
Some productions don't fit into one square, so there will be several identical ones. I already showed you the RCU production square, which is used three times in the factory. There might be several reasons why the production might not fit into a square:
- too many assemblers (as with the RCUs),
- too much throughput that can't be handled by a train on just one stop, or
- too much throughput for the inserters and belts to unload from the trains.
Personally I don't like balancers. I've only ever used other peoples' blueprints because my head hurts even when trying to understand them, while I design everything else myself (maybe after studying someone else's design, but still with fully understanding it). Also they become comically huge with increasing number of belts (I understand them so little that I can't even tell how they grow with number of belts <n>, but the area seems to be way above O(n²)).
I achieve balance instead with symmetry: All belts have the same number of machines attached to them, often even on each side of each belt (by having each alternating row mirrored - I wished mirroring a blueprint would be possible in-game, and yes, I understand the issues with that). Allowing trains to turn around as soon as just one wagon is empty helps with getting initial balance to counter belt-length mismatches and other issues with the starting conditions.
Having this wagon-selective condition on both the loading and unloading stations is a mistake, it should only be at the unloading. I realized that after designing most of the squares, but as long as the train schedules are not set up to use it, it doesn't matter.
The petrochemistry doesn't quite fit into the design with four train stops: Here I added an extra loop with an extra fifth train stop. (This also causes the exception for the rule that all the producer stops have the extra stop for the train fuel: Lubricant trains are fueled at the consumer (electric engine units, of course).) This fifth stop looks like a huge waste of space, given that I now need eight of these petro squares. However, the size of one production square was limited by the amount of water I can get through only one train stop anyway - or more precisely, the amount of stuff I estimated I could get through one train stop, a number I had completely wrong anyway - more on that later.
Space science can also not be produced with only 3 inputs, the setup is different though: There are some combinators to limit the number of satellites sitting around unused on belts. Also, no rocket will be launched as long as the science pack from the previous launch are not extracted yet. There need to be three of these launch squares. The limiting factor here is how many trains I felt I could comfortably get through one station (those tiny stack sizes are a problem). A train will leave a space science pack station when it has at least 64k packs loaded (same as a full train for any other science pack), long before it is actually full. The satellite production doesn't fit into a square at all. Instead I use two squares, I skip the train stops that would be between those two squares, while still keeping the regular grid of tracks running between all squares. On most of the remaining two times three sides, I have two train stops next to each other, but without the extra waiting position.
One of these squares has the solar panel production (and also one assembler for the radar), the other one has the accumulator production (and also one assembler for the satellite itself). The satellite is transported in a 1-1 train, unlike almost everything else.
I will also show you the science lab square, three of these are needed for 10kSPM (assuming fully researched research speed): Same as for the sat: Two train stops per side, but no waiting positions.
If you look closely, you can see one additional limitation of this setup: Trains can not turn right at the crossing immediately after leaving the inner of the two stops - but that would completely change later anyway.
The nuclear train fuel is also produced in a square:
I also designed special "stacker" squares, here the one with three separate paths (I also have ones with only one and two paths): The idea was that if I have only chain signals on the crossings in the corners of each square, the few squares that needed more than just the one extra waiting position could have a stacker square next to it, and the trains will stay in these stackers and not block the track grid. Later I realized that this would not work as good as I thought it would, because each entry/exit of these squares only works in one direction (as I already mentioned at the beginning), making the placement of these cumbersome.
Instead I use what I think is called a "cross-dock":
What I don't like about these is that you can't really unload directly from train through chests into another train, so the throughput is limited by the belts. And yes, I know that it works diagonally (I actually built a square with that), but then only four chests (per wagon) can be placed, and the throughput is actually slightly lower as with the 8 chests I use here. Long inserters are even worse regarding throughput.
Of course there is a similar cross-dock for fluids.
They are needed because of the limitations of the train schedule and path finding thing, to distribute each product between x producers and y consumers, with x and y being coprime to one another. And yes, I've read the FFF for the upcoming 1.1 release. OMG, how much pain that would have spared me if that had been implemented earlier.
The smelters (iron plates, copper plates, steel plates) are not in these squares, but in an extra "layer" around the square grid. They are quite boring and incredible large, so no screenshot here.
I designed each of the needed squares (I showed only a small fraction of them here) separately, and tested each using trains coming from stations with infinity chests specifically for each square. I don't know how many hours I actually spent on these, but the savegame with all of them has now 160 hours on it (some of it I was AFK, to see if each square works continuously for an extended period of time). But of course I also spent a lot of time outside of the game just planning with Doomeer and KirkMcDonald. Since I played extremely irregularly, it ran over several months (or was it even years?). Then one day I finally tried to put all of it together, put each square in a blueprint, started a new game, placed the first few (petroechmistry plus plastic production, together with some cross-docks) - and fell flat on my face. It just didn't work. Even with this tiny fraction of the whole setup, the congestion on the innermost train track crossing caused the trains to wait for sometimes minutes before they could leave a station.
That was really painful.
I prefer belts over bots for several reasons, but one is that belts are usually calculable, bots not so much. And trains are even worse (but mostly unavoidable). What is the actual throughput of a train when there is an unpredictable amount of them at all times on the move, going from anywhere to everywhere else? In the end my estimates where completely off.
After tending to my bloody nose I came up with an easy fix: Four-track grid, while keeping the inner part of each square as before.
With this, trains can enter a stop from any direction and leave it into any direction, which helps with congestion just as much as the fact that there are now twice the number of tracks. Only downside is that it is much bigger, so the whole factory is even less space efficient.
So this is the full factory:
There is a grid of 15x8 used squares (minus 2 empty ones), plus an additional empty row at each edge, so really 17x10 squares. In the north are the copper smelters, with 8 copper ore unloading stations and 10 copper plate loading stations. In the east are iron smelters, 6 identical setups with one unloading and one loading station each. There are also two identical steel smelters in the southeast, each made out of three blocks, i.e. three iron ore unloader stations. In the south you can barely see the water, oil an stone from nothing stations (infinity chests), in the southwest is the uranium ore source.
It runs at about 25~28 UPS on my i7-6700K (slightly overclocked). Since currently the water, crude oil, ores, stone and coal comes from infinity chests, by my own requirement mentioned at the beginning, I'm technically not finished. Also the electricity supply is completely missing, there is just one electric energy interface for the 48 GW. There are also some creative-mod's "super radars" at the smelters.
The most complicated thing is the train setup. Due to the limitations of the game, it is highly impractically to route and balance stuff from many producers to many consumers. This is even more true when you deliberately design a compact setup where large stackers are not an option. Just to give you an idea how I solved it: There is one or two trains (max is two because there is only one waiting position before the square's stations) for each consumer of e.g. copper plates. Each of these trains will alternate between the 10 pickup stations at the smelters and the delivery, so 20 items in the train schedule, each with the correct conditions. Keep in mind that due to my design looking for empty single wagons, the unloading condition is "Emtpy cargo OR Circuit F > 0 AND 5 seconds passed". Which is why (a) in the end I skipped the wagon condition in most stops (though not all), (b) incroporated the "5 seconds passed" with some extra combinators into the circuit condition because you can copy&paste them around (unlike train conditions), and (c) decided that if I would ever do this again, I would instead write a small script that would generate a blueprint with all the trains in it. ... and now suddenly there will be a feature in 1.1 that fixes all of that.
Savegame (57 MiB): https://drive.google.com/file/d/1A6v_v9 ... sp=sharing