diff --git a/factorio-blueprint-generator/factory_graph_black_science.yml b/factorio-blueprint-generator/factory_graph_black_science.yml index 36924b6..73976df 100644 --- a/factorio-blueprint-generator/factory_graph_black_science.yml +++ b/factorio-blueprint-generator/factory_graph_black_science.yml @@ -1,24 +1,29 @@ subfactories: - !SubFactory - recipe: military-science-pack - machines: 40 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: military-science-pack + num_machines: 40 + machine: assembling-machine-3 - !SubFactory - recipe: piercing-rounds-magazine - machines: 12 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: piercing-rounds-magazine + num_machines: 12 + machine: assembling-machine-3 - !SubFactory - recipe: firearm-magazine - machines: 4 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: firearm-magazine + num_machines: 4 + machine: assembling-machine-3 - !SubFactory - recipe: grenade - machines: 32 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: grenade + num_machines: 32 + machine: assembling-machine-3 - !SubFactory - recipe: stone-wall - machines: 4 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: stone-wall + num_machines: 4 + machine: assembling-machine-3 - !ExternalConnection factory_connections: - item: military-science-pack diff --git a/factorio-blueprint-generator/factory_graph_blue_science.yml b/factorio-blueprint-generator/factory_graph_blue_science.yml index 3527274..b6fc633 100644 --- a/factorio-blueprint-generator/factory_graph_blue_science.yml +++ b/factorio-blueprint-generator/factory_graph_blue_science.yml @@ -1,44 +1,54 @@ subfactories: - !SubFactory - recipe: chemical-science-pack - machines: 96 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: chemical-science-pack + num_machines: 96 + machine: assembling-machine-3 - !SubFactory - recipe: engine-unit - machines: 80 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: engine-unit + num_machines: 80 + machine: assembling-machine-3 - !SubFactory - recipe: iron-gear-wheel - machines: 4 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: iron-gear-wheel + num_machines: 4 + machine: assembling-machine-3 - !SubFactory - recipe: pipe - machines: 8 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: pipe + num_machines: 8 + machine: assembling-machine-3 - !SubFactory - recipe: advanced-circuit - machines: 72 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: advanced-circuit + num_machines: 72 + machine: assembling-machine-3 - !SubFactory - recipe: electronic-circuit - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: electronic-circuit + num_machines: 6 + machine: assembling-machine-3 - !SubFactory - recipe: electronic-circuit - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: electronic-circuit + num_machines: 6 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 10 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 10 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 10 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 10 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 10 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 10 + machine: assembling-machine-3 - !ExternalConnection - !Splitter - !Splitter diff --git a/factorio-blueprint-generator/factory_graph_blue_science_distributor.yml b/factorio-blueprint-generator/factory_graph_blue_science_distributor.yml index b520c34..9a33c03 100644 --- a/factorio-blueprint-generator/factory_graph_blue_science_distributor.yml +++ b/factorio-blueprint-generator/factory_graph_blue_science_distributor.yml @@ -1,57 +1,69 @@ subfactories: - !SubFactory - recipe: chemical-science-pack - machines: 96 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: chemical-science-pack + num_machines: 96 + machine: assembling-machine-3 - !SubFactory - recipe: engine-unit - machines: 80 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: engine-unit + num_machines: 80 + machine: assembling-machine-3 - !SubFactory - recipe: iron-gear-wheel - machines: 4 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: iron-gear-wheel + num_machines: 4 + machine: assembling-machine-3 - !SubFactory - recipe: pipe - machines: 8 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: pipe + num_machines: 8 + machine: assembling-machine-3 - !SubFactory - recipe: advanced-circuit - machines: 72 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: advanced-circuit + num_machines: 72 + machine: assembling-machine-3 - !SubFactory - recipe: electronic-circuit - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: electronic-circuit + num_machines: 6 + machine: assembling-machine-3 - !SubFactory - recipe: electronic-circuit - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: electronic-circuit + num_machines: 6 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 10 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 10 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 10 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 10 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 10 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 10 + machine: assembling-machine-3 - !ExternalConnection - !Distributor - !Distributor - !Distributor - !SubFactory - recipe: copper-plate - machines: 64 - machine: electric-furnace + subfactory: !DoubleAssemblingLine + recipe: copper-plate + num_machines: 64 + machine: electric-furnace - !Distributor - !SubFactory - recipe: copper-plate - machines: 48 - machine: electric-furnace + subfactory: !DoubleAssemblingLine + recipe: copper-plate + num_machines: 48 + machine: electric-furnace factory_connections: - item: chemical-science-pack amount: 10 diff --git a/factorio-blueprint-generator/factory_graph_fast_inserter.yml b/factorio-blueprint-generator/factory_graph_fast_inserter.yml index 8c074d7..800f0db 100644 --- a/factorio-blueprint-generator/factory_graph_fast_inserter.yml +++ b/factorio-blueprint-generator/factory_graph_fast_inserter.yml @@ -1,25 +1,30 @@ subfactories: - !SubFactory - recipe: iron-gear-wheel - machines: 2 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: iron-gear-wheel + num_machines: 2 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 9 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 9 + machine: assembling-machine-3 - !SubFactory - recipe: electronic-circuit - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: electronic-circuit + num_machines: 6 + machine: assembling-machine-3 - !Splitter - !SubFactory - recipe: inserter - machines: 2 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: inserter + num_machines: 2 + machine: assembling-machine-3 - !SubFactory - recipe: fast-inserter - machines: 2 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: fast-inserter + num_machines: 2 + machine: assembling-machine-3 - !SideLoader - !ExternalConnection - !SideLoader diff --git a/factorio-blueprint-generator/factory_graph_green_science.yml b/factorio-blueprint-generator/factory_graph_green_science.yml index db1105e..3c67729 100644 --- a/factorio-blueprint-generator/factory_graph_green_science.yml +++ b/factorio-blueprint-generator/factory_graph_green_science.yml @@ -1,28 +1,34 @@ subfactories: - !SubFactory - recipe: logistic-science-pack - machines: 48 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: logistic-science-pack + num_machines: 48 + machine: assembling-machine-3 - !SubFactory - recipe: inserter - machines: 4 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: inserter + num_machines: 4 + machine: assembling-machine-3 - !SubFactory - recipe: electronic-circuit - machines: 4 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: electronic-circuit + num_machines: 4 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 6 + machine: assembling-machine-3 - !SubFactory - recipe: transport-belt - machines: 2 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: transport-belt + num_machines: 2 + machine: assembling-machine-3 - !SubFactory - recipe: iron-gear-wheel - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: iron-gear-wheel + num_machines: 6 + machine: assembling-machine-3 - !ExternalConnection - !Splitter factory_connections: diff --git a/factorio-blueprint-generator/factory_graph_inserter.yml b/factorio-blueprint-generator/factory_graph_inserter.yml index 5602b54..32feecd 100644 --- a/factorio-blueprint-generator/factory_graph_inserter.yml +++ b/factorio-blueprint-generator/factory_graph_inserter.yml @@ -1,20 +1,24 @@ subfactories: - !SubFactory - recipe: iron-gear-wheel - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: iron-gear-wheel + num_machines: 6 + machine: assembling-machine-3 - !SubFactory - recipe: copper-cable - machines: 9 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: copper-cable + num_machines: 9 + machine: assembling-machine-3 - !SubFactory - recipe: electronic-circuit - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: electronic-circuit + num_machines: 6 + machine: assembling-machine-3 - !SubFactory - recipe: inserter - machines: 6 - machine: assembling-machine-3 + subfactory: !DoubleAssemblingLine + recipe: inserter + num_machines: 6 + machine: assembling-machine-3 - !ExternalConnection factory_connections: - item: iron-gear-wheel diff --git a/factorio-blueprint-generator/src/bin/assembly.rs b/factorio-blueprint-generator/src/bin/assembly.rs index d1898f9..322f73a 100644 --- a/factorio-blueprint-generator/src/bin/assembly.rs +++ b/factorio-blueprint-generator/src/bin/assembly.rs @@ -10,7 +10,7 @@ struct Args { json: bool, assembly_machines: usize, machine: String, - recipe: String, + recipe: Option, output_belt: Beltspeed, input_belt: Vec, } diff --git a/factorio-blueprint-generator/src/factory.rs b/factorio-blueprint-generator/src/factory.rs index 57b7498..77919b5 100644 --- a/factorio-blueprint-generator/src/factory.rs +++ b/factorio-blueprint-generator/src/factory.rs @@ -1,6 +1,6 @@ use crate::{ multistation::{StationSpec, multistation}, - subfactory::assembling_line::assembly_line_2_input, + subfactory::{BeltConnection, SubFactory, assembling_line::assembly_line_2_input}, }; use factorio_blueprint::abstraction::{Blueprint, Entity}; use factorio_core::{beltoptions::Beltspeed, prelude::*, visualize::Visualize}; @@ -18,11 +18,7 @@ pub struct FactoryGraph { #[derive(Debug, Serialize, Deserialize, Clone)] pub enum Building { - SubFactory { - recipe: String, - machines: usize, - machine: String, - }, + SubFactory { subfactory: SubFactory }, ExternalConnection, Splitter, SideLoader, @@ -65,7 +61,7 @@ pub fn generate_factory { - // assert_eq!(machine, "assembly-machine-3"); - assert_eq!(output_connections.len(), 1); - assert!(input_connections.len() <= 3); - let output_connection = output_connections.first().unwrap(); - let intermediate_output_connection = HashMap::from([( - output_connection.0, - IntermediateConnectionEntry { - block: Some(block_index), - interface: 0, - }, - )]); + Building::SubFactory { subfactory } => { + let inputs = input_connections + .iter() + .map(|(_, f)| (f.item.as_str(), f.amount)) + .fold(HashMap::new(), |mut h, (s, a)| { + match h.entry(s) { + std::collections::hash_map::Entry::Occupied(mut occupied_entry) => { + *occupied_entry.get_mut() += a; + } + std::collections::hash_map::Entry::Vacant(vacant_entry) => { + vacant_entry.insert(a); + } + } + h + }) + .into_iter() + .collect::>(); - input_connections.sort_by(|a, b| b.1.amount.total_cmp(&a.1.amount)); - let (input_belt1, input_belt2, addition_blocks) = if let Some( - &[ - (connection_id0, c0), - (connection_id1, c1), - (connection_id2, c2), - ], - ) = - input_connections.first_chunk() - { - let c0_bigger = c0.amount > c1.amount + c2.amount; - intermediate_connections.push(IntermediateConnection { - input: HashMap::from([ - ( - connection_id0, + let outputs = output_connections + .iter() + .map(|(_, f)| (f.item.as_str(), f.amount)) + .fold(HashMap::new(), |mut h, (s, a)| { + match h.entry(s) { + std::collections::hash_map::Entry::Occupied(mut occupied_entry) => { + *occupied_entry.get_mut() += a; + } + std::collections::hash_map::Entry::Vacant(vacant_entry) => { + vacant_entry.insert(a); + } + } + h + }) + .into_iter() + .collect::>(); + + let (b, m, input_belts, output_belts) = + subfactory.get_subfactory(&inputs, &outputs); + + assert!(output_belts.len() == 1); + assert!(output_connections.len() == 1); + assert!(output_belts[0] == BeltConnection::Full(outputs[0])); + + blueprints.push(b); + blocks.push(m); + + let mut intermediate_input_connections = HashMap::new(); + for (interface, input_belt) in input_belts.iter().enumerate() { + match input_belt { + BeltConnection::Full((s, _a)) => { + let input_connection = input_connections + .iter() + .find(|(_, f)| f.item == *s) + .unwrap(); + + intermediate_input_connections.insert( + input_connection.0, IntermediateConnectionEntry { block: Some(block_index), - interface: if c0_bigger { 1 } else { 0 }, + interface, }, - ), - ( - connection_id1, + ); + } + + BeltConnection::Split { left, right } => { + let beltspeed = + Beltspeed::from_items_per_second(2.0 * f64::max(left.1, right.1)); + + connections.push(Connection { + startblock: Some(blocks.len()), + startpoint: 0, + endblock: Some(block_index), + endpoint: interface, + lanes: 1, + beltspeed, + }); + + let input_connection_left = input_connections + .iter() + .find(|(_, f)| f.item == *left.0) + .unwrap(); + intermediate_input_connections.insert( + input_connection_left.0, IntermediateConnectionEntry { - block: Some(block_index + 1), + block: Some(blocks.len()), interface: 0, }, - ), - ( - connection_id2, + ); + + let input_connection_right = input_connections + .iter() + .find(|(_, f)| f.item == *right.0) + .unwrap(); + intermediate_input_connections.insert( + input_connection_right.0, IntermediateConnectionEntry { - block: Some(block_index + 1), + block: Some(blocks.len()), interface: 1, }, - ), - ]), - output: intermediate_output_connection, - }); + ); - let beltspeed = - Beltspeed::from_items_per_second(2.0 * f64::max(c1.amount, c2.amount)); + let mut b = Blueprint::new(); + b.add_entity(Entity::new_belt( + beltspeed, + Position::new(1, 1), + Direction::Up, + )); - connections.push(Connection { - startblock: Some(block_index + 1), - startpoint: 0, - endblock: Some(block_index), - endpoint: if c0_bigger { 0 } else { 1 }, - lanes: 1, - beltspeed, - }); - let mut b = Blueprint::new(); - - b.add_entity(Entity::new_belt( - beltspeed, - Position::new(1, 1), - Direction::Up, - )); - ( - Beltspeed::from_items_per_second(c0.amount), - Some(beltspeed), - vec![( - MacroBlock { + blueprints.push(b); + blocks.push(MacroBlock { size: Position::new(1, 1), input: vec![ Interface { @@ -175,87 +202,191 @@ pub fn generate_factory c1.amount + c2.amount; + // intermediate_connections.push(IntermediateConnection { + // input: HashMap::from([ + // ( + // connection_id0, + // IntermediateConnectionEntry { + // block: Some(block_index), + // interface: if c0_bigger { 1 } else { 0 }, + // }, + // ), + // ( + // connection_id1, + // IntermediateConnectionEntry { + // block: Some(block_index + 1), + // interface: 0, + // }, + // ), + // ( + // connection_id2, + // IntermediateConnectionEntry { + // block: Some(block_index + 1), + // interface: 1, + // }, + // ), + // ]), + // output: intermediate_output_connection, + // }); + + // let beltspeed = + // Beltspeed::from_items_per_second(2.0 * f64::max(c1.amount, c2.amount)); + + // connections.push(Connection { + // startblock: Some(block_index + 1), + // startpoint: 0, + // endblock: Some(block_index), + // endpoint: if c0_bigger { 0 } else { 1 }, + // lanes: 1, + // beltspeed, + // }); + // let mut b = Blueprint::new(); + + // b.add_entity(Entity::new_belt( + // beltspeed, + // Position::new(1, 1), + // Direction::Up, + // )); + // ( + // Beltspeed::from_items_per_second(c0.amount), + // Some(beltspeed), + // vec![( + // MacroBlock { + // size: Position::new(1, 1), + // input: vec![ + // Interface { + // offset: Position::new(0, 0), + // dir: Direction::Right, + // }, + // Interface { + // offset: Position::new(0, 0), + // dir: Direction::Left, + // }, + // ], + // output: vec![Interface { + // offset: Position::new(0, 0), + // dir: Direction::Up, + // }], + // }, + // b, + // )], + // ) + // } else if let Some(&[(connection_id0, c0), (connection_id1, c1)]) = + // input_connections.first_chunk() + // { + // intermediate_connections.push(IntermediateConnection { + // input: HashMap::from([ + // ( + // connection_id0, + // IntermediateConnectionEntry { + // block: Some(block_index), + // interface: 0, + // }, + // ), + // ( + // connection_id1, + // IntermediateConnectionEntry { + // block: Some(block_index), + // interface: 1, + // }, + // ), + // ]), + // output: intermediate_output_connection, + // }); + // ( + // Beltspeed::from_items_per_second(c0.amount), + // Some(Beltspeed::from_items_per_second(c1.amount)), + // vec![], + // ) + // } else if let Some(&[(connection_id, c)]) = input_connections.first_chunk() { + // intermediate_connections.push(IntermediateConnection { + // input: HashMap::from([( + // connection_id, + // IntermediateConnectionEntry { + // block: Some(block_index), + // interface: 0, + // }, + // )]), + // output: intermediate_output_connection, + // }); + // (Beltspeed::from_items_per_second(c.amount), None, vec![]) + // } else { + // unreachable!() + // }; + + // let (b, size, y_output, y_inputs) = assembly_line_2_input( + // *machines, + // machine, + // Some(recipe), + // input_belt1, + // input_belt2, + // Beltspeed::from_items_per_second( + // output_connections + // .first() + // .map(|&(_, c)| c.amount) + // .unwrap_or(1.0), + // ), + // ); + + // blueprints.push(b); + // blocks.push(MacroBlock { + // size, + // input: y_inputs + // .iter() + // .map(|&y| Interface { + // offset: Position::new(0, y), + // dir: Direction::Right, + // }) + // .collect(), + // output: vec![Interface { + // offset: Position::new(0, y_output), + // dir: Direction::Left, + // }], + // }); + + // for (mb, b) in addition_blocks { + // blueprints.push(b); + // blocks.push(mb); + // } } Building::ExternalConnection => { // let step = 1; diff --git a/factorio-blueprint-generator/src/subfactory.rs b/factorio-blueprint-generator/src/subfactory.rs index 354ee4b..1186890 100644 --- a/factorio-blueprint-generator/src/subfactory.rs +++ b/factorio-blueprint-generator/src/subfactory.rs @@ -1,9 +1,15 @@ +use assembling_line::assembly_line_2_input; use factorio_blueprint::abstraction::Blueprint; -use factorio_core::beltoptions::{Beltspeed, Belttype}; -use factorio_layout::MacroBlock; +use factorio_core::{ + beltoptions::{Beltspeed, Belttype}, + prelude::{Direction, Position}, +}; +use factorio_layout::{Interface, MacroBlock}; +use serde::{Deserialize, Serialize}; pub mod assembling_line; +#[derive(Debug, Serialize, Deserialize, Clone)] pub enum SubFactory { AssemblingLine { num_machines: usize, @@ -17,21 +23,25 @@ pub enum SubFactory { }, } -enum BeltConnection { - Full(String), - Split { left: String, right: String }, +#[derive(Debug, Clone, PartialEq)] +pub enum BeltConnection<'a> { + Full((&'a str, f64)), + Split { + left: (&'a str, f64), + right: (&'a str, f64), + }, } impl SubFactory { - fn get_subfactory( + pub fn get_subfactory<'a>( &self, - inputs: &[(&str, f64)], - outputs: &[(&str, f64)], + inputs: &[(&'a str, f64)], + outputs: &[(&'a str, f64)], ) -> ( Blueprint, MacroBlock, - Vec, - Vec, + Vec>, + Vec>, ) { match self { SubFactory::AssemblingLine { @@ -61,13 +71,13 @@ impl SubFactory { { ( BeltConnection::Split { - left: input1.to_owned(), - right: input2.to_owned(), + left: (input1, amount1), + right: (input2, amount2), }, Beltspeed::from_items_per_second(2.0 * f64::max(amount1, amount2)), BeltConnection::Split { - left: input3.to_owned(), - right: input4.to_owned(), + left: (input3, amount3), + right: (input4, amount4), }, Beltspeed::from_items_per_second(2.0 * f64::max(amount3, amount4)), ) @@ -75,11 +85,11 @@ impl SubFactory { inputs.first_chunk() { ( - BeltConnection::Full(input1.to_owned()), + BeltConnection::Full((input1, amount1)), Beltspeed::from_items_per_second(amount1), BeltConnection::Split { - left: input2.to_owned(), - right: input3.to_owned(), + left: (input2, amount2), + right: (input3, amount3), }, Beltspeed::from_items_per_second(2.0 * f64::max(amount2, amount3)), ) @@ -87,27 +97,71 @@ impl SubFactory { inputs.first_chunk() { ( - BeltConnection::Full(input1.to_owned()), + BeltConnection::Full((input1, amount1)), Beltspeed::from_items_per_second(amount1), - BeltConnection::Full(input2.to_owned()), + BeltConnection::Full((input2, amount2)), Beltspeed::from_items_per_second(amount2), ) } else { unreachable!() }; + let (b, size, y_output, y_inputs) = assembly_line_2_input( + *num_machines, + machine, + recipe.as_ref(), + belttype1, + Some(belttype2), + Beltspeed::from_items_per_second(outputs[0].1), + ); + ( - todo!(), - todo!(), + b, + MacroBlock { + size, + input: y_inputs + .iter() + .map(|&y| Interface { + offset: Position::new(0, y), + dir: Direction::Right, + }) + .collect(), + output: vec![Interface { + offset: Position::new(0, y_output), + dir: Direction::Left, + }], + }, vec![input1, input2], - vec![BeltConnection::Full(outputs[0].0.to_owned())], + vec![BeltConnection::Full(outputs[0])], ) } else { + let (b, size, y_output, y_inputs) = assembly_line_2_input( + *num_machines, + machine, + recipe.as_ref(), + Beltspeed::from_items_per_second(inputs[0].1), + None, + Beltspeed::from_items_per_second(outputs[0].1), + ); + ( - todo!(), - todo!(), - vec![BeltConnection::Full(inputs[0].0.to_owned())], - vec![BeltConnection::Full(outputs[0].0.to_owned())], + b, + MacroBlock { + size, + input: y_inputs + .iter() + .map(|&y| Interface { + offset: Position::new(0, y), + dir: Direction::Right, + }) + .collect(), + output: vec![Interface { + offset: Position::new(0, y_output), + dir: Direction::Left, + }], + }, + vec![BeltConnection::Full(inputs[0])], + vec![BeltConnection::Full(outputs[0])], ) } } diff --git a/factorio-blueprint-generator/src/subfactory/assembling_line.rs b/factorio-blueprint-generator/src/subfactory/assembling_line.rs index 776ab0d..ac68a94 100644 --- a/factorio-blueprint-generator/src/subfactory/assembling_line.rs +++ b/factorio-blueprint-generator/src/subfactory/assembling_line.rs @@ -10,7 +10,7 @@ AAABBBCCC pub fn assembly_line( assembly_machines: usize, machine: impl AsRef, - recipe: impl AsRef, + recipe: Option>, ) -> Blueprint { let mut blueprint = Blueprint::new(); let mut last = None; @@ -228,7 +228,7 @@ pub fn assembly_line( pub fn assembly_line_2_input( assembly_machines: usize, machine: impl AsRef, - recipe: impl AsRef, + recipe: Option>, input_belt1: Beltspeed, input_belt2: Option, output_belt: Beltspeed, diff --git a/factorio-blueprint/src/abstraction.rs b/factorio-blueprint/src/abstraction.rs index a44f861..d6eb50c 100644 --- a/factorio-blueprint/src/abstraction.rs +++ b/factorio-blueprint/src/abstraction.rs @@ -164,7 +164,7 @@ pub enum EntityType { }, Production { name: String, - recipe: String, + recipe: Option, size: Position, }, Rail { @@ -276,7 +276,7 @@ impl Entity { pub fn new_production( name: impl AsRef, - recipe: impl AsRef, + recipe: Option>, position: Position, direction: Direction, size: Position, @@ -284,7 +284,7 @@ impl Entity { Self::new( EntityType::Production { name: name.as_ref().to_owned(), - recipe: recipe.as_ref().to_owned(), + recipe: recipe.map(|s| s.as_ref().to_owned()), size, }, position, @@ -384,7 +384,7 @@ impl Entity { name: _, recipe, size: _, - } => Some(recipe.clone()), + } => recipe.clone(), _ => None, } }