Add connect output belt to station
This commit is contained in:
		
							parent
							
								
									aabd9486e0
								
							
						
					
					
						commit
						1af9712bcb
					
				
					 4 changed files with 435 additions and 139 deletions
				
			
		|  | @ -1,125 +1,108 @@ | ||||||
| use factorio_blueprint::{ | use factorio_blueprint::abstraction::{Blueprint, Entity}; | ||||||
|     Blueprint, BlueprintEntity, BlueprintPosition, |  | ||||||
|     abstraction::{self, Entity}, |  | ||||||
|     belt::convert_to_blueprint, |  | ||||||
| }; |  | ||||||
| use factorio_core::{beltoptions::Beltspeed, pathfield::PathField, prelude::*}; | use factorio_core::{beltoptions::Beltspeed, pathfield::PathField, prelude::*}; | ||||||
| 
 | 
 | ||||||
| fn balancer_path() -> Vec<PathField> { | fn balancer_path() -> Vec<PathField> { | ||||||
|     vec![ |     vec![ | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(0, 1), |             pos: Position::new(1, 0), | ||||||
|             dir: Direction::Up, |             dir: Direction::Right, | ||||||
|         }, |  | ||||||
|         PathField::Belt { |  | ||||||
|             pos: Position::new(3, 1), |  | ||||||
|             dir: Direction::Up, |  | ||||||
|         }, |  | ||||||
|         PathField::Belt { |  | ||||||
|             pos: Position::new(0, 2), |  | ||||||
|             dir: Direction::Up, |  | ||||||
|         }, |  | ||||||
|         PathField::Belt { |  | ||||||
|             pos: Position::new(3, 2), |  | ||||||
|             dir: Direction::Up, |  | ||||||
|         }, |  | ||||||
|         PathField::Belt { |  | ||||||
|             pos: Position::new(0, 3), |  | ||||||
|             dir: Direction::Up, |  | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(1, 3), |             pos: Position::new(1, 3), | ||||||
|             dir: Direction::Left, |             dir: Direction::Right, | ||||||
|  |         }, | ||||||
|  |         PathField::Belt { | ||||||
|  |             pos: Position::new(2, 0), | ||||||
|  |             dir: Direction::Right, | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(2, 3), |             pos: Position::new(2, 3), | ||||||
|             dir: Direction::Right, |             dir: Direction::Right, | ||||||
|         }, |         }, | ||||||
|  |         PathField::Belt { | ||||||
|  |             pos: Position::new(3, 0), | ||||||
|  |             dir: Direction::Down, | ||||||
|  |         }, | ||||||
|  |         PathField::Belt { | ||||||
|  |             pos: Position::new(3, 1), | ||||||
|  |             dir: Direction::Right, | ||||||
|  |         }, | ||||||
|  |         PathField::Belt { | ||||||
|  |             pos: Position::new(3, 2), | ||||||
|  |             dir: Direction::Right, | ||||||
|  |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(3, 3), |             pos: Position::new(3, 3), | ||||||
|             dir: Direction::Up, |             dir: Direction::Up, | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(0, 5), |             pos: Position::new(5, 0), | ||||||
|             dir: Direction::Right, |             dir: Direction::Right, | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(1, 5), |             pos: Position::new(5, 1), | ||||||
|             dir: Direction::Up, |             dir: Direction::Up, | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(2, 5), |             pos: Position::new(5, 2), | ||||||
|             dir: Direction::Up, |             dir: Direction::Down, | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(3, 5), |             pos: Position::new(5, 3), | ||||||
|             dir: Direction::Left, |             dir: Direction::Right, | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(0, 6), |             pos: Position::new(6, 0), | ||||||
|             dir: Direction::Up, |             dir: Direction::Right, | ||||||
|         }, |         }, | ||||||
|         PathField::Belt { |         PathField::Belt { | ||||||
|             pos: Position::new(3, 6), |             pos: Position::new(6, 3), | ||||||
|             dir: Direction::Up, |             dir: Direction::Right, | ||||||
|         }, |         }, | ||||||
|         PathField::Underground { |         PathField::Underground { | ||||||
|             pos: Position::new(1, 6), |             pos: Position::new(2, 1), | ||||||
|             dir: Direction::Up, |             dir: Direction::Right, | ||||||
|             len: 4, |             len: 4, | ||||||
|         }, |         }, | ||||||
|         PathField::Underground { |         PathField::Underground { | ||||||
|             pos: Position::new(2, 6), |             pos: Position::new(2, 2), | ||||||
|             dir: Direction::Up, |             dir: Direction::Right, | ||||||
|             len: 4, |             len: 4, | ||||||
|         }, |         }, | ||||||
|     ] |     ] | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn generate_4_lane_balancer2() -> Blueprint { | pub fn generate_4_lane_balancer(beltspeed: Beltspeed) -> Blueprint { | ||||||
|     let mut b = abstraction::Blueprint::new(); |     let mut b = Blueprint::new(); | ||||||
| 
 | 
 | ||||||
|     let splitter_pos = [(2, 1), (6, 1), (4, 3), (4, 9), (2, 15), (6, 15)]; |     let splitter_pos = [(1, 2), (1, 6), (3, 4), (9, 4), (15, 2), (15, 6)]; | ||||||
| 
 | 
 | ||||||
|     for (x, y) in splitter_pos { |     for (x, y) in splitter_pos { | ||||||
|         b.add_entity(Entity::new_splitter( |         b.add_entity(Entity::new_splitter( | ||||||
|             Beltspeed::Normal, |             beltspeed, | ||||||
|             Position::new(x, y), |             Position::new(x, y), | ||||||
|             Direction::Up, |             Direction::Right, | ||||||
|         )); |         )); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     b.add_path(&balancer_path(), Beltspeed::Normal); |     b.add_path(&balancer_path(), beltspeed); | ||||||
| 
 | 
 | ||||||
|     // b.transform(Transformation::new(Direction::Right, Position::new(0, 0)));
 |     b | ||||||
|     b.to_blueprint() |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn generate_4_lane_balancer() -> Blueprint { | pub fn binary_balancer(lanes: usize, beltspeed: Beltspeed) -> (PositionType, Blueprint) { | ||||||
|     let mut e = vec![ |     match lanes { | ||||||
|         BlueprintEntity::builder("splitter".to_owned(), 1, BlueprintPosition::new(1.0, 0.5)) |         4 => (16, generate_4_lane_balancer(beltspeed)), | ||||||
|             .build(), |         2 => { | ||||||
|         BlueprintEntity::builder("splitter".to_owned(), 2, BlueprintPosition::new(3.0, 0.5)) |             let mut b = Blueprint::new(); | ||||||
|             .build(), |             b.add_entity(Entity::new_splitter( | ||||||
|         BlueprintEntity::builder("splitter".to_owned(), 3, BlueprintPosition::new(2.0, 1.5)) |                 beltspeed, | ||||||
|             .build(), |                 Position::new(1, 2), | ||||||
|         BlueprintEntity::builder("splitter".to_owned(), 11, BlueprintPosition::new(2.0, 4.5)) |                 Direction::Right, | ||||||
|             .build(), |             )); | ||||||
|         BlueprintEntity::builder("splitter".to_owned(), 20, BlueprintPosition::new(1.0, 7.5)) |  | ||||||
|             .build(), |  | ||||||
|         BlueprintEntity::builder("splitter".to_owned(), 21, BlueprintPosition::new(3.0, 7.5)) |  | ||||||
|             .build(), |  | ||||||
|     ]; |  | ||||||
| 
 | 
 | ||||||
|     let mut nextfree = e.len() as u32; |             (2, b) | ||||||
|     e.extend(convert_to_blueprint( |         } | ||||||
|         &balancer_path(), |         _ => (0, Blueprint::new()), | ||||||
|         &Beltspeed::Normal, |     } | ||||||
|         &mut nextfree, |  | ||||||
|     )); |  | ||||||
| 
 |  | ||||||
|     Blueprint::builder() |  | ||||||
|         .label("balancer".to_string()) |  | ||||||
|         .entities(e) |  | ||||||
|         .build() |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,13 +1,27 @@ | ||||||
| use factorio_blueprint::{BlueprintString, encode}; | use factorio_blueprint::{BlueprintBook, BlueprintBookEntry, BlueprintString, encode}; | ||||||
| use factorio_blueprint_generator::balancer::{generate_4_lane_balancer, generate_4_lane_balancer2}; | use factorio_blueprint_generator::balancer::{binary_balancer, generate_4_lane_balancer}; | ||||||
| 
 | 
 | ||||||
| fn main() { | fn main() { | ||||||
|     let b = BlueprintString::Blueprint(generate_4_lane_balancer()); |     let mut v = Vec::new(); | ||||||
|     let b2 = BlueprintString::Blueprint(generate_4_lane_balancer2()); | 
 | ||||||
|  |     for i in 0..3 { | ||||||
|  |         let lanes = 1 << i; | ||||||
|  | 
 | ||||||
|  |         let (_, b) = binary_balancer(lanes, factorio_core::beltoptions::Beltspeed::Normal); | ||||||
|  | 
 | ||||||
|  |         v.push(BlueprintBookEntry::new( | ||||||
|  |             BlueprintString::Blueprint(b.to_blueprint()), | ||||||
|  |             i + 1, | ||||||
|  |         )); | ||||||
|  |     } | ||||||
|  |     let b = BlueprintString::BlueprintBook( | ||||||
|  |         BlueprintBook::builder() | ||||||
|  |             .blueprints(v) | ||||||
|  |             .active_index(1) | ||||||
|  |             .build(), | ||||||
|  |     ); | ||||||
| 
 | 
 | ||||||
|     println!("{}", serde_json::to_string_pretty(&b).unwrap()); |     println!("{}", serde_json::to_string_pretty(&b).unwrap()); | ||||||
|     println!("{}", serde_json::to_string_pretty(&b2).unwrap()); |  | ||||||
| 
 | 
 | ||||||
|     println!("{}", encode(&serde_json::to_string(&b).unwrap())); |     println!("{}", encode(&serde_json::to_string(&b).unwrap())); | ||||||
|     println!("{}", encode(&serde_json::to_string(&b2).unwrap())); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -12,63 +12,77 @@ struct Args { | ||||||
| fn main() { | fn main() { | ||||||
|     let args = Args::parse(); |     let args = Args::parse(); | ||||||
| 
 | 
 | ||||||
|     // let stations: Vec<_> = (0..2)
 |     let stations: Vec<_> = [false, true] | ||||||
|     //     .map(|_| StationSpec {
 |         .into_iter() | ||||||
|     //         locomotives: 1,
 |         .flat_map(|load| { | ||||||
|     //         wagons: 2,
 |             [ | ||||||
|     //         load: false,
 |                 Beltspeed::Normal, | ||||||
|     //         beltspeed: Beltspeed::Turbo,
 |                 Beltspeed::Fast, | ||||||
|     //         lanes: 2,
 |                 Beltspeed::Express, | ||||||
|     //     })
 |                 Beltspeed::Turbo, | ||||||
|     //     .collect();
 |             ] | ||||||
|  |             .into_iter() | ||||||
|  |             .flat_map(move |beltspeed| { | ||||||
|  |                 (0..6).flat_map(move |i| { | ||||||
|  |                     (0..=i).map(move |j| StationSpec { | ||||||
|  |                         locomotives: 1, | ||||||
|  |                         wagons: 1 << i, | ||||||
|  |                         load, | ||||||
|  |                         beltspeed, | ||||||
|  |                         lanes: 1 << j, | ||||||
|  |                     }) | ||||||
|  |                 }) | ||||||
|  |             }) | ||||||
|  |         }) | ||||||
|  |         .collect(); | ||||||
| 
 | 
 | ||||||
|     let b = BlueprintString::Blueprint( |     let b = BlueprintString::Blueprint( | ||||||
|         multistation( |         multistation( | ||||||
|             // &stations,
 |             &stations, | ||||||
|             &[ |             // &[
 | ||||||
|                 StationSpec { |             //     StationSpec {
 | ||||||
|                     locomotives: 2, |             //         locomotives: 2,
 | ||||||
|                     wagons: 4, |             //         wagons: 4,
 | ||||||
|                     load: false, |             //         load: false,
 | ||||||
|                     beltspeed: Beltspeed::Normal, |             //         beltspeed: Beltspeed::Normal,
 | ||||||
|                     lanes: 4, |             //         lanes: 4,
 | ||||||
|                 }, |             //     },
 | ||||||
|                 StationSpec { |             //     StationSpec {
 | ||||||
|                     locomotives: 3, |             //         locomotives: 3,
 | ||||||
|                     wagons: 8, |             //         wagons: 8,
 | ||||||
|                     load: false, |             //         load: false,
 | ||||||
|                     beltspeed: Beltspeed::Turbo, |             //         beltspeed: Beltspeed::Turbo,
 | ||||||
|                     lanes: 8, |             //         lanes: 8,
 | ||||||
|                 }, |             //     },
 | ||||||
|                 StationSpec { |             //     StationSpec {
 | ||||||
|                     locomotives: 3, |             //         locomotives: 3,
 | ||||||
|                     wagons: 8, |             //         wagons: 8,
 | ||||||
|                     load: false, |             //         load: false,
 | ||||||
|                     beltspeed: Beltspeed::Turbo, |             //         beltspeed: Beltspeed::Turbo,
 | ||||||
|                     lanes: 4, |             //         lanes: 4,
 | ||||||
|                 }, |             //     },
 | ||||||
|                 StationSpec { |             //     StationSpec {
 | ||||||
|                     locomotives: 3, |             //         locomotives: 3,
 | ||||||
|                     wagons: 8, |             //         wagons: 8,
 | ||||||
|                     load: false, |             //         load: false,
 | ||||||
|                     beltspeed: Beltspeed::Turbo, |             //         beltspeed: Beltspeed::Turbo,
 | ||||||
|                     lanes: 2, |             //         lanes: 2,
 | ||||||
|                 }, |             //     },
 | ||||||
|                 StationSpec { |             //     StationSpec {
 | ||||||
|                     locomotives: 3, |             //         locomotives: 3,
 | ||||||
|                     wagons: 8, |             //         wagons: 8,
 | ||||||
|                     load: false, |             //         load: false,
 | ||||||
|                     beltspeed: Beltspeed::Turbo, |             //         beltspeed: Beltspeed::Turbo,
 | ||||||
|                     lanes: 1, |             //         lanes: 1,
 | ||||||
|                 }, |             //     },
 | ||||||
|                 StationSpec { |             //     StationSpec {
 | ||||||
|                     locomotives: 1, |             //         locomotives: 1,
 | ||||||
|                     wagons: 1, |             //         wagons: 1,
 | ||||||
|                     load: false, |             //         load: false,
 | ||||||
|                     beltspeed: Beltspeed::Turbo, |             //         beltspeed: Beltspeed::Turbo,
 | ||||||
|                     lanes: 1, |             //         lanes: 1,
 | ||||||
|                 }, |             //     },
 | ||||||
|             ], |             // ],
 | ||||||
|             8, |             8, | ||||||
|         ) |         ) | ||||||
|         .to_blueprint(), |         .to_blueprint(), | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| use factorio_blueprint::abstraction::{Blueprint, Entity, EntityType, RailType}; | use factorio_blueprint::abstraction::{Blueprint, Entity, EntityType, RailType, UndergroundType}; | ||||||
| use factorio_core::{beltoptions::Beltspeed, prelude::*}; | use factorio_core::{beltoptions::Beltspeed, prelude::*}; | ||||||
| 
 | 
 | ||||||
| use crate::station::basic_station; | use crate::{balancer::binary_balancer, station::basic_station}; | ||||||
| 
 | 
 | ||||||
| pub struct StationSpec { | pub struct StationSpec { | ||||||
|     pub locomotives: usize, |     pub locomotives: usize, | ||||||
|  | @ -11,6 +11,35 @@ pub struct StationSpec { | ||||||
|     pub lanes: usize, |     pub lanes: usize, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | fn calculate_station_height( | ||||||
|  |     output_height: PositionType, | ||||||
|  |     lanes: usize, | ||||||
|  |     beltspeed: Beltspeed, | ||||||
|  | ) -> PositionType { | ||||||
|  |     let station_height = match beltspeed { | ||||||
|  |         Beltspeed::Normal => { | ||||||
|  |             if lanes == 1 && output_height % 4 == 1 { | ||||||
|  |                 4 + ((3 + output_height) & !0b11) | ||||||
|  |             } else { | ||||||
|  |                 4 + ((15 + output_height) & !0b11) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         Beltspeed::Fast => { | ||||||
|  |             if lanes == 1 || lanes == 2 && output_height % 4 == 3 { | ||||||
|  |                 4 + ((3 + output_height) & !0b11) | ||||||
|  |             } else { | ||||||
|  |                 4 + ((9 + output_height) & !0b11) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         Beltspeed::Express | Beltspeed::Turbo => 4 + ((3 + output_height) & !0b11), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let station_height = PositionType::max(12, station_height); | ||||||
|  |     assert!(station_height % 4 == 0); | ||||||
|  | 
 | ||||||
|  |     station_height | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub fn multistation(stations: &[StationSpec], stacker_size: usize) -> Blueprint { | pub fn multistation(stations: &[StationSpec], stacker_size: usize) -> Blueprint { | ||||||
|     let longest_train = stations |     let longest_train = stations | ||||||
|         .iter() |         .iter() | ||||||
|  | @ -215,6 +244,7 @@ pub fn multistation(stations: &[StationSpec], stacker_size: usize) -> Blueprint | ||||||
|             )); |             )); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         // station
 | ||||||
|         let mut b = basic_station( |         let mut b = basic_station( | ||||||
|             station.load, |             station.load, | ||||||
|             station.locomotives, |             station.locomotives, | ||||||
|  | @ -223,9 +253,7 @@ pub fn multistation(stations: &[StationSpec], stacker_size: usize) -> Blueprint | ||||||
|             station.beltspeed, |             station.beltspeed, | ||||||
|             factorio_core::beltoptions::Belttype::Full, |             factorio_core::beltoptions::Belttype::Full, | ||||||
|         ); |         ); | ||||||
| 
 |         let output_height = -b.bounding_box().min().y; | ||||||
|         let station_height = PositionType::max(12, 4 + ((3 - b.bounding_box().min().y) / 4) * 4); |  | ||||||
|         assert!(station_height % 4 == 0); |  | ||||||
| 
 | 
 | ||||||
|         b.transform(Transformation::new( |         b.transform(Transformation::new( | ||||||
|             Direction::Down, |             Direction::Down, | ||||||
|  | @ -237,6 +265,263 @@ pub fn multistation(stations: &[StationSpec], stacker_size: usize) -> Blueprint | ||||||
| 
 | 
 | ||||||
|         blueprint.add_blueprint(b); |         blueprint.add_blueprint(b); | ||||||
| 
 | 
 | ||||||
|  |         // belt output
 | ||||||
|  |         let station_height = | ||||||
|  |             calculate_station_height(output_height, station.lanes, station.beltspeed); | ||||||
|  | 
 | ||||||
|  |         // rail crossing
 | ||||||
|  |         let (beltdirection, underground_left, underground_right) = match station.load { | ||||||
|  |             true => ( | ||||||
|  |                 Direction::Left, | ||||||
|  |                 UndergroundType::Output, | ||||||
|  |                 UndergroundType::Input, | ||||||
|  |             ), | ||||||
|  |             false => ( | ||||||
|  |                 Direction::Right, | ||||||
|  |                 UndergroundType::Input, | ||||||
|  |                 UndergroundType::Output, | ||||||
|  |             ), | ||||||
|  |         }; | ||||||
|  |         let mut belt_x = outrail_x - 28 - 14 * station.locomotives as PositionType - 3 | ||||||
|  |             + 2 * (station.wagons / station.lanes).ilog2() as PositionType; | ||||||
|  | 
 | ||||||
|  |         let (balancer_length, mut b) = binary_balancer(station.lanes, station.beltspeed); | ||||||
|  | 
 | ||||||
|  |         if station.load { | ||||||
|  |             b.transform(Transformation::new( | ||||||
|  |                 Direction::Down, | ||||||
|  |                 Position::new(balancer_length, 2 * station.lanes as PositionType), | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         b.transform(Transformation::new( | ||||||
|  |             Direction::Up, | ||||||
|  |             Position::new( | ||||||
|  |                 belt_x - 1, | ||||||
|  |                 31 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                     - 2 * station.lanes as PositionType, | ||||||
|  |             ), | ||||||
|  |         )); | ||||||
|  | 
 | ||||||
|  |         blueprint.add_blueprint(b); | ||||||
|  | 
 | ||||||
|  |         belt_x += balancer_length; | ||||||
|  | 
 | ||||||
|  |         for j in 0..station.lanes { | ||||||
|  |             let (underground_x, signal) = match station_height | ||||||
|  |                 - (output_height - 2 * j as PositionType) | ||||||
|  |             { | ||||||
|  |                 5 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 23, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_right, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 9, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 7, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 23, false) | ||||||
|  |                 } | ||||||
|  |                 7 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 17, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     if station.beltspeed != Beltspeed::Turbo { | ||||||
|  |                         blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                             station.beltspeed, | ||||||
|  |                             underground_right, | ||||||
|  |                             Position::new( | ||||||
|  |                                 outrail_x - 7, | ||||||
|  |                                 30 + total_stacker_height | ||||||
|  |                                     + previous_station_heights | ||||||
|  |                                     + output_height | ||||||
|  |                                     - 2 * j as PositionType, | ||||||
|  |                             ), | ||||||
|  |                             beltdirection, | ||||||
|  |                         )); | ||||||
|  |                         blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                             station.beltspeed, | ||||||
|  |                             underground_left, | ||||||
|  |                             Position::new( | ||||||
|  |                                 outrail_x - 5, | ||||||
|  |                                 30 + total_stacker_height | ||||||
|  |                                     + previous_station_heights | ||||||
|  |                                     + output_height | ||||||
|  |                                     - 2 * j as PositionType, | ||||||
|  |                             ), | ||||||
|  |                             beltdirection, | ||||||
|  |                         )); | ||||||
|  |                     } | ||||||
|  |                     (outrail_x - 17, false) | ||||||
|  |                 } | ||||||
|  |                 9 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 15, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 15, false) | ||||||
|  |                 } | ||||||
|  |                 11 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 11, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 11, false) | ||||||
|  |                 } | ||||||
|  |                 13 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 9, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 9, false) | ||||||
|  |                 } | ||||||
|  |                 15 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 9, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 9, true) | ||||||
|  |                 } | ||||||
|  |                 17 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 7, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 7, false) | ||||||
|  |                 } | ||||||
|  |                 19 | 21 | 23 => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 5, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 5, false) | ||||||
|  |                 } | ||||||
|  |                 _ => { | ||||||
|  |                     blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                         station.beltspeed, | ||||||
|  |                         underground_left, | ||||||
|  |                         Position::new( | ||||||
|  |                             outrail_x - 3, | ||||||
|  |                             30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                                 - 2 * j as PositionType, | ||||||
|  |                         ), | ||||||
|  |                         beltdirection, | ||||||
|  |                     )); | ||||||
|  |                     (outrail_x - 3, false) | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             if signal { | ||||||
|  |                 blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                     station.beltspeed, | ||||||
|  |                     underground_right, | ||||||
|  |                     Position::new( | ||||||
|  |                         outrail_x + 5, | ||||||
|  |                         30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                             - 2 * j as PositionType, | ||||||
|  |                     ), | ||||||
|  |                     beltdirection, | ||||||
|  |                 )); | ||||||
|  |             } else { | ||||||
|  |                 blueprint.add_entity(Entity::new_underground_belt( | ||||||
|  |                     station.beltspeed, | ||||||
|  |                     underground_right, | ||||||
|  |                     Position::new( | ||||||
|  |                         outrail_x + 3, | ||||||
|  |                         30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                             - 2 * j as PositionType, | ||||||
|  |                     ), | ||||||
|  |                     beltdirection, | ||||||
|  |                 )); | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     station.beltspeed, | ||||||
|  |                     Position::new( | ||||||
|  |                         outrail_x + 5, | ||||||
|  |                         30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                             - 2 * j as PositionType, | ||||||
|  |                     ), | ||||||
|  |                     beltdirection, | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             for l in 0..((underground_x - belt_x) / 2) { | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     station.beltspeed, | ||||||
|  |                     Position::new( | ||||||
|  |                         belt_x + 2 * l, | ||||||
|  |                         30 + total_stacker_height + previous_station_heights + output_height | ||||||
|  |                             - 2 * j as PositionType, | ||||||
|  |                     ), | ||||||
|  |                     beltdirection, | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         // rail connection
 |         // rail connection
 | ||||||
|         if i != stations.len() - 1 { |         if i != stations.len() - 1 { | ||||||
|             for j in 0..(station_height / 4) { |             for j in 0..(station_height / 4) { | ||||||
|  | @ -262,7 +547,7 @@ pub fn multistation(stations: &[StationSpec], stacker_size: usize) -> Blueprint | ||||||
|                 RailType::ChainSignal, |                 RailType::ChainSignal, | ||||||
|                 Position::new( |                 Position::new( | ||||||
|                     inrail_x - 3, |                     inrail_x - 3, | ||||||
|                     total_stacker_height + 13 + previous_station_heights, |                     total_stacker_height + 15 + previous_station_heights, | ||||||
|                 ), |                 ), | ||||||
|                 0, |                 0, | ||||||
|             )); |             )); | ||||||
|  | @ -270,7 +555,7 @@ pub fn multistation(stations: &[StationSpec], stacker_size: usize) -> Blueprint | ||||||
|                 RailType::RailSignal, |                 RailType::RailSignal, | ||||||
|                 Position::new( |                 Position::new( | ||||||
|                     outrail_x + 3, |                     outrail_x + 3, | ||||||
|                     total_stacker_height + 13 + previous_station_heights, |                     total_stacker_height + 15 + previous_station_heights, | ||||||
|                 ), |                 ), | ||||||
|                 8, |                 8, | ||||||
|             )); |             )); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue