Add single assembling line
This commit is contained in:
		
							parent
							
								
									cfc132f2d7
								
							
						
					
					
						commit
						cd86679d65
					
				
					 2 changed files with 217 additions and 119 deletions
				
			
		|  | @ -1,4 +1,4 @@ | ||||||
| use assembling_line::assembly_line_2_input; | use assembling_line::{assembly_line, assembly_line_2_input}; | ||||||
| use clap::Subcommand; | use clap::Subcommand; | ||||||
| use factorio_blueprint::abstraction::Blueprint; | use factorio_blueprint::abstraction::Blueprint; | ||||||
| use factorio_core::{ | use factorio_core::{ | ||||||
|  | @ -49,8 +49,8 @@ impl SubFactory { | ||||||
|                 num_machines, |                 num_machines, | ||||||
|                 machine, |                 machine, | ||||||
|                 recipe, |                 recipe, | ||||||
|             } => todo!(), |             } | ||||||
|             SubFactory::DoubleAssemblingLine { |             | SubFactory::DoubleAssemblingLine { | ||||||
|                 num_machines, |                 num_machines, | ||||||
|                 machine, |                 machine, | ||||||
|                 recipe, |                 recipe, | ||||||
|  | @ -107,14 +107,27 @@ impl SubFactory { | ||||||
|                         unreachable!() |                         unreachable!() | ||||||
|                     }; |                     }; | ||||||
| 
 | 
 | ||||||
|                     let (b, size, y_output, y_inputs) = assembly_line_2_input( |                     let (b, size, y_output, y_inputs) = | ||||||
|                         *num_machines, |                         if matches!(self, SubFactory::DoubleAssemblingLine { .. }) { | ||||||
|                         machine, |                             assembly_line_2_input( | ||||||
|                         recipe.as_ref(), |                                 *num_machines, | ||||||
|                         belttype1, |                                 machine, | ||||||
|                         Some(belttype2), |                                 recipe.as_ref(), | ||||||
|                         Beltspeed::from_items_per_second(outputs[0].1), |                                 belttype1, | ||||||
|                     ); |                                 Some(belttype2), | ||||||
|  |                                 Beltspeed::from_items_per_second(outputs[0].1), | ||||||
|  |                             ) | ||||||
|  |                         } else { | ||||||
|  |                             assembly_line( | ||||||
|  |                                 *num_machines, | ||||||
|  |                                 machine, | ||||||
|  |                                 recipe.as_ref(), | ||||||
|  |                                 belttype1, | ||||||
|  |                                 Some(belttype2), | ||||||
|  |                                 None, | ||||||
|  |                                 Beltspeed::from_items_per_second(outputs[0].1), | ||||||
|  |                             ) | ||||||
|  |                         }; | ||||||
| 
 | 
 | ||||||
|                     ( |                     ( | ||||||
|                         b, |                         b, | ||||||
|  | @ -136,14 +149,27 @@ impl SubFactory { | ||||||
|                         vec![BeltConnection::Full(outputs[0])], |                         vec![BeltConnection::Full(outputs[0])], | ||||||
|                     ) |                     ) | ||||||
|                 } else { |                 } else { | ||||||
|                     let (b, size, y_output, y_inputs) = assembly_line_2_input( |                     let (b, size, y_output, y_inputs) = | ||||||
|                         *num_machines, |                         if matches!(self, SubFactory::DoubleAssemblingLine { .. }) { | ||||||
|                         machine, |                             assembly_line_2_input( | ||||||
|                         recipe.as_ref(), |                                 *num_machines, | ||||||
|                         Beltspeed::from_items_per_second(inputs[0].1), |                                 machine, | ||||||
|                         None, |                                 recipe.as_ref(), | ||||||
|                         Beltspeed::from_items_per_second(outputs[0].1), |                                 Beltspeed::from_items_per_second(inputs[0].1), | ||||||
|                     ); |                                 None, | ||||||
|  |                                 Beltspeed::from_items_per_second(outputs[0].1), | ||||||
|  |                             ) | ||||||
|  |                         } else { | ||||||
|  |                             assembly_line( | ||||||
|  |                                 *num_machines, | ||||||
|  |                                 machine, | ||||||
|  |                                 recipe.as_ref(), | ||||||
|  |                                 Beltspeed::from_items_per_second(inputs[0].1), | ||||||
|  |                                 None, | ||||||
|  |                                 None, | ||||||
|  |                                 Beltspeed::from_items_per_second(outputs[0].1), | ||||||
|  |                             ) | ||||||
|  |                         }; | ||||||
| 
 | 
 | ||||||
|                     ( |                     ( | ||||||
|                         b, |                         b, | ||||||
|  |  | ||||||
|  | @ -1,17 +1,15 @@ | ||||||
| use factorio_blueprint::abstraction::{Blueprint, ElectricPoleType, Entity, InserterType}; | use factorio_blueprint::abstraction::{Blueprint, ElectricPoleType, Entity, InserterType}; | ||||||
| use factorio_core::{beltoptions::Beltspeed, prelude::*}; | use factorio_core::{beltoptions::Beltspeed, prelude::*}; | ||||||
| 
 | 
 | ||||||
| /* |  | ||||||
| 
 |  | ||||||
| AAABBBCCC |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| */ |  | ||||||
| pub fn assembly_line( | pub fn assembly_line( | ||||||
|     assembly_machines: usize, |     assembly_machines: usize, | ||||||
|     machine: impl AsRef<str>, |     machine: impl AsRef<str>, | ||||||
|     recipe: Option<impl AsRef<str>>, |     recipe: Option<impl AsRef<str>>, | ||||||
| ) -> Blueprint { |     input_belt1: Beltspeed, | ||||||
|  |     input_belt2: Option<Beltspeed>, | ||||||
|  |     input_belt3: Option<Beltspeed>, | ||||||
|  |     output_belt: Beltspeed, | ||||||
|  | ) -> (Blueprint, Position, PositionType, Vec<PositionType>) { | ||||||
|     let mut blueprint = Blueprint::new(); |     let mut blueprint = Blueprint::new(); | ||||||
|     let mut last = None; |     let mut last = None; | ||||||
|     for i in 0..assembly_machines.div_ceil(3) { |     for i in 0..assembly_machines.div_ceil(3) { | ||||||
|  | @ -45,18 +43,27 @@ pub fn assembly_line( | ||||||
| 
 | 
 | ||||||
|         match i % 3 { |         match i % 3 { | ||||||
|             0 => { |             0 => { | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                 if input_belt3.is_some() { | ||||||
|                     InserterType::Long, |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|                     None, |                         InserterType::Long, | ||||||
|                     Position::new(3 + 6 * i as PositionType, 5), |                         None, | ||||||
|                     Direction::Down, |                         Position::new(3 + 6 * i as PositionType, 5), | ||||||
|                 )); |                         Direction::Down, | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                     )); | ||||||
|                     InserterType::Fast, |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|                     None, |                         InserterType::Fast, | ||||||
|                     Position::new(5 + 6 * i as PositionType, 5), |                         None, | ||||||
|                     Direction::Up, |                         Position::new(5 + 6 * i as PositionType, 5), | ||||||
|                 )); |                         Direction::Up, | ||||||
|  |                     )); | ||||||
|  |                 } else { | ||||||
|  |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|  |                         InserterType::Fast, | ||||||
|  |                         None, | ||||||
|  |                         Position::new(3 + 6 * i as PositionType, 5), | ||||||
|  |                         Direction::Down, | ||||||
|  |                     )); | ||||||
|  |                 } | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                 blueprint.add_entity(Entity::new_inserter( | ||||||
|                     InserterType::Long, |                     InserterType::Long, | ||||||
|                     None, |                     None, | ||||||
|  | @ -71,18 +78,27 @@ pub fn assembly_line( | ||||||
|                 )); |                 )); | ||||||
|             } |             } | ||||||
|             1 => { |             1 => { | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                 if input_belt3.is_some() { | ||||||
|                     InserterType::Long, |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|                     None, |                         InserterType::Long, | ||||||
|                     Position::new(1 + 6 * i as PositionType, 5), |                         None, | ||||||
|                     Direction::Down, |                         Position::new(1 + 6 * i as PositionType, 5), | ||||||
|                 )); |                         Direction::Down, | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                     )); | ||||||
|                     InserterType::Fast, |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|                     None, |                         InserterType::Fast, | ||||||
|                     Position::new(5 + 6 * i as PositionType, 5), |                         None, | ||||||
|                     Direction::Up, |                         Position::new(5 + 6 * i as PositionType, 5), | ||||||
|                 )); |                         Direction::Up, | ||||||
|  |                     )); | ||||||
|  |                 } else { | ||||||
|  |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|  |                         InserterType::Fast, | ||||||
|  |                         None, | ||||||
|  |                         Position::new(1 + 6 * i as PositionType, 5), | ||||||
|  |                         Direction::Down, | ||||||
|  |                     )); | ||||||
|  |                 } | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                 blueprint.add_entity(Entity::new_inserter( | ||||||
|                     InserterType::Long, |                     InserterType::Long, | ||||||
|                     None, |                     None, | ||||||
|  | @ -97,18 +113,27 @@ pub fn assembly_line( | ||||||
|                 )); |                 )); | ||||||
|             } |             } | ||||||
|             2 => { |             2 => { | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                 if input_belt3.is_some() { | ||||||
|                     InserterType::Long, |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|                     None, |                         InserterType::Long, | ||||||
|                     Position::new(1 + 6 * i as PositionType, 5), |                         None, | ||||||
|                     Direction::Down, |                         Position::new(1 + 6 * i as PositionType, 5), | ||||||
|                 )); |                         Direction::Down, | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                     )); | ||||||
|                     InserterType::Fast, |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|                     None, |                         InserterType::Fast, | ||||||
|                     Position::new(3 + 6 * i as PositionType, 5), |                         None, | ||||||
|                     Direction::Up, |                         Position::new(3 + 6 * i as PositionType, 5), | ||||||
|                 )); |                         Direction::Up, | ||||||
|  |                     )); | ||||||
|  |                 } else { | ||||||
|  |                     blueprint.add_entity(Entity::new_inserter( | ||||||
|  |                         InserterType::Fast, | ||||||
|  |                         None, | ||||||
|  |                         Position::new(1 + 6 * i as PositionType, 5), | ||||||
|  |                         Direction::Down, | ||||||
|  |                     )); | ||||||
|  |                 } | ||||||
|                 blueprint.add_entity(Entity::new_inserter( |                 blueprint.add_entity(Entity::new_inserter( | ||||||
|                     InserterType::Long, |                     InserterType::Long, | ||||||
|                     None, |                     None, | ||||||
|  | @ -126,103 +151,150 @@ pub fn assembly_line( | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     let (belt1, belt2) = if let Some(input_belt3) = input_belt3 { | ||||||
|  |         ( | ||||||
|  |             Some((Direction::Left, output_belt)), | ||||||
|  |             (Direction::Right, input_belt3), | ||||||
|  |         ) | ||||||
|  |     } else { | ||||||
|  |         (None, (Direction::Left, output_belt)) | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let belt3 = (Direction::Right, input_belt1); | ||||||
|  |     let belt4 = if let Some(input_belt2) = input_belt2 { | ||||||
|  |         Some((Direction::Right, input_belt2)) | ||||||
|  |     } else { | ||||||
|  |         None | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     for i in 0..(3 * (assembly_machines - 1) + 1) { |     for i in 0..(3 * (assembly_machines - 1) + 1) { | ||||||
|  |         if let Some((d, t)) = belt1 { | ||||||
|  |             blueprint.add_entity(Entity::new_belt( | ||||||
|  |                 t, | ||||||
|  |                 Position::new(1 + 2 * i as PositionType, 1), | ||||||
|  |                 d, | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|         blueprint.add_entity(Entity::new_belt( |         blueprint.add_entity(Entity::new_belt( | ||||||
|             Beltspeed::Normal, |             belt2.1, | ||||||
|             Position::new(1 + 2 * i as PositionType, 1), |  | ||||||
|             Direction::Left, |  | ||||||
|         )); |  | ||||||
|         blueprint.add_entity(Entity::new_belt( |  | ||||||
|             Beltspeed::Normal, |  | ||||||
|             Position::new(1 + 2 * i as PositionType, 3), |             Position::new(1 + 2 * i as PositionType, 3), | ||||||
|             Direction::Right, |             belt2.0, | ||||||
|         )); |         )); | ||||||
|         blueprint.add_entity(Entity::new_belt( |         blueprint.add_entity(Entity::new_belt( | ||||||
|             Beltspeed::Normal, |             belt3.1, | ||||||
|             Position::new(1 + 2 * i as PositionType, 15), |             Position::new(1 + 2 * i as PositionType, 15), | ||||||
|             Direction::Right, |             belt3.0, | ||||||
|         )); |  | ||||||
|         blueprint.add_entity(Entity::new_belt( |  | ||||||
|             Beltspeed::Normal, |  | ||||||
|             Position::new(1 + 2 * i as PositionType, 17), |  | ||||||
|             Direction::Right, |  | ||||||
|         )); |         )); | ||||||
|  |         if let Some((d, t)) = belt4 { | ||||||
|  |             blueprint.add_entity(Entity::new_belt( | ||||||
|  |                 t, | ||||||
|  |                 Position::new(1 + 2 * i as PositionType, 17), | ||||||
|  |                 d, | ||||||
|  |             )); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     match assembly_machines % 3 { |     match assembly_machines % 3 { | ||||||
|         0 => { |         0 => { | ||||||
|             let i = 3 * (assembly_machines - 1); |             let i = 3 * (assembly_machines - 1); | ||||||
|  |             if input_belt3.is_some() { | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     belt2.1, | ||||||
|  |                     Position::new(3 + 2 * i as PositionType, 3), | ||||||
|  |                     belt2.0, | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|             blueprint.add_entity(Entity::new_belt( |             blueprint.add_entity(Entity::new_belt( | ||||||
|                 Beltspeed::Normal, |                 belt3.1, | ||||||
|                 Position::new(3 + 2 * i as PositionType, 3), |  | ||||||
|                 Direction::Right, |  | ||||||
|             )); |  | ||||||
|             blueprint.add_entity(Entity::new_belt( |  | ||||||
|                 Beltspeed::Normal, |  | ||||||
|                 Position::new(3 + 2 * i as PositionType, 15), |                 Position::new(3 + 2 * i as PositionType, 15), | ||||||
|                 Direction::Right, |                 belt3.0, | ||||||
|             )); |             )); | ||||||
|         } |         } | ||||||
|         1 => { |         1 => { | ||||||
|             let i = 3 * (assembly_machines - 1); |             let i = 3 * (assembly_machines - 1); | ||||||
|  |             if let Some((d, t)) = belt1 { | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     t, | ||||||
|  |                     Position::new(3 + 2 * i as PositionType, 1), | ||||||
|  |                     d, | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|             blueprint.add_entity(Entity::new_belt( |             blueprint.add_entity(Entity::new_belt( | ||||||
|                 Beltspeed::Normal, |                 belt2.1, | ||||||
|                 Position::new(3 + 2 * i as PositionType, 1), |  | ||||||
|                 Direction::Left, |  | ||||||
|             )); |  | ||||||
|             blueprint.add_entity(Entity::new_belt( |  | ||||||
|                 Beltspeed::Normal, |  | ||||||
|                 Position::new(3 + 2 * i as PositionType, 3), |                 Position::new(3 + 2 * i as PositionType, 3), | ||||||
|                 Direction::Right, |                 belt2.0, | ||||||
|             )); |             )); | ||||||
|  |             if input_belt3.is_some() { | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     belt2.1, | ||||||
|  |                     Position::new(5 + 2 * i as PositionType, 3), | ||||||
|  |                     belt2.0, | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|             blueprint.add_entity(Entity::new_belt( |             blueprint.add_entity(Entity::new_belt( | ||||||
|                 Beltspeed::Normal, |                 belt3.1, | ||||||
|                 Position::new(3 + 2 * i as PositionType, 15), |                 Position::new(3 + 2 * i as PositionType, 15), | ||||||
|                 Direction::Right, |                 belt3.0, | ||||||
|             )); |             )); | ||||||
|             blueprint.add_entity(Entity::new_belt( |             blueprint.add_entity(Entity::new_belt( | ||||||
|                 Beltspeed::Normal, |                 belt3.1, | ||||||
|                 Position::new(3 + 2 * i as PositionType, 17), |  | ||||||
|                 Direction::Right, |  | ||||||
|             )); |  | ||||||
|             blueprint.add_entity(Entity::new_belt( |  | ||||||
|                 Beltspeed::Normal, |  | ||||||
|                 Position::new(5 + 2 * i as PositionType, 3), |  | ||||||
|                 Direction::Right, |  | ||||||
|             )); |  | ||||||
|             blueprint.add_entity(Entity::new_belt( |  | ||||||
|                 Beltspeed::Normal, |  | ||||||
|                 Position::new(5 + 2 * i as PositionType, 15), |                 Position::new(5 + 2 * i as PositionType, 15), | ||||||
|                 Direction::Right, |                 belt3.0, | ||||||
|             )); |             )); | ||||||
|  |             if let Some((d, t)) = belt4 { | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     t, | ||||||
|  |                     Position::new(3 + 2 * i as PositionType, 17), | ||||||
|  |                     d, | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         2 => { |         2 => { | ||||||
|             let i = 3 * (assembly_machines - 1); |             let i = 3 * (assembly_machines - 1); | ||||||
|  |             if input_belt3.is_some() { | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     belt2.1, | ||||||
|  |                     Position::new(3 + 2 * i as PositionType, 3), | ||||||
|  |                     belt2.0, | ||||||
|  |                 )); | ||||||
|  |                 blueprint.add_entity(Entity::new_belt( | ||||||
|  |                     belt2.1, | ||||||
|  |                     Position::new(5 + 2 * i as PositionType, 3), | ||||||
|  |                     belt2.0, | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|             blueprint.add_entity(Entity::new_belt( |             blueprint.add_entity(Entity::new_belt( | ||||||
|                 Beltspeed::Normal, |                 belt3.1, | ||||||
|                 Position::new(3 + 2 * i as PositionType, 3), |  | ||||||
|                 Direction::Right, |  | ||||||
|             )); |  | ||||||
|             blueprint.add_entity(Entity::new_belt( |  | ||||||
|                 Beltspeed::Normal, |  | ||||||
|                 Position::new(3 + 2 * i as PositionType, 15), |                 Position::new(3 + 2 * i as PositionType, 15), | ||||||
|                 Direction::Right, |                 belt3.0, | ||||||
|             )); |             )); | ||||||
|             blueprint.add_entity(Entity::new_belt( |             blueprint.add_entity(Entity::new_belt( | ||||||
|                 Beltspeed::Normal, |                 belt3.1, | ||||||
|                 Position::new(5 + 2 * i as PositionType, 3), |  | ||||||
|                 Direction::Right, |  | ||||||
|             )); |  | ||||||
|             blueprint.add_entity(Entity::new_belt( |  | ||||||
|                 Beltspeed::Normal, |  | ||||||
|                 Position::new(5 + 2 * i as PositionType, 15), |                 Position::new(5 + 2 * i as PositionType, 15), | ||||||
|                 Direction::Right, |                 belt3.0, | ||||||
|             )); |             )); | ||||||
|         } |         } | ||||||
|         _ => unreachable!(), |         _ => unreachable!(), | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     blueprint |     if input_belt3.is_none() { | ||||||
|  |         blueprint.transform(Transformation::new(Direction::Up, Position::new(0, -2))); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ( | ||||||
|  |         blueprint, | ||||||
|  |         Position::new( | ||||||
|  |             3 * assembly_machines as PositionType, | ||||||
|  |             7 + input_belt2.is_some() as PositionType + input_belt3.is_some() as PositionType, | ||||||
|  |         ), | ||||||
|  |         0, | ||||||
|  |         match (input_belt2.is_some(), input_belt3.is_some()) { | ||||||
|  |             (true, true) => vec![6, 7, 1], | ||||||
|  |             (true, false) => vec![6, 7], | ||||||
|  |             (false, true) => vec![7, 1], | ||||||
|  |             (false, false) => vec![6], | ||||||
|  |         }, | ||||||
|  |     ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn assembly_line_2_input( | pub fn assembly_line_2_input( | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue