From 82394cc3426c53c7f542494e8a1bb8218c48ee8b Mon Sep 17 00:00:00 2001 From: hal8174 Date: Wed, 16 Apr 2025 23:28:09 +0200 Subject: [PATCH] Prototype subfactory interface --- .../src/bin/assembly.rs | 2 +- factorio-blueprint-generator/src/factory.rs | 2 +- factorio-blueprint-generator/src/lib.rs | 2 +- .../src/subfactory.rs | 116 ++++++++++++++++++ .../assembling_line.rs} | 0 5 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 factorio-blueprint-generator/src/subfactory.rs rename factorio-blueprint-generator/src/{assembly.rs => subfactory/assembling_line.rs} (100%) diff --git a/factorio-blueprint-generator/src/bin/assembly.rs b/factorio-blueprint-generator/src/bin/assembly.rs index bb7fa8f..d1898f9 100644 --- a/factorio-blueprint-generator/src/bin/assembly.rs +++ b/factorio-blueprint-generator/src/bin/assembly.rs @@ -1,6 +1,6 @@ use clap::Parser; use factorio_blueprint::{BlueprintString, encode}; -use factorio_blueprint_generator::assembly::assembly_line_2_input; +use factorio_blueprint_generator::subfactory::assembling_line::assembly_line_2_input; use factorio_core::beltoptions::Beltspeed; use factorio_core::visualize::Visualize; diff --git a/factorio-blueprint-generator/src/factory.rs b/factorio-blueprint-generator/src/factory.rs index a638c46..57b7498 100644 --- a/factorio-blueprint-generator/src/factory.rs +++ b/factorio-blueprint-generator/src/factory.rs @@ -1,6 +1,6 @@ use crate::{ - assembly::assembly_line_2_input, multistation::{StationSpec, multistation}, + subfactory::assembling_line::assembly_line_2_input, }; use factorio_blueprint::abstraction::{Blueprint, Entity}; use factorio_core::{beltoptions::Beltspeed, prelude::*, visualize::Visualize}; diff --git a/factorio-blueprint-generator/src/lib.rs b/factorio-blueprint-generator/src/lib.rs index 0233643..b4e930b 100644 --- a/factorio-blueprint-generator/src/lib.rs +++ b/factorio-blueprint-generator/src/lib.rs @@ -1,7 +1,7 @@ -pub mod assembly; pub mod balancer; pub mod binary_merger; pub mod factory; pub mod multistation; pub mod station; +pub mod subfactory; pub mod train; diff --git a/factorio-blueprint-generator/src/subfactory.rs b/factorio-blueprint-generator/src/subfactory.rs new file mode 100644 index 0000000..354ee4b --- /dev/null +++ b/factorio-blueprint-generator/src/subfactory.rs @@ -0,0 +1,116 @@ +use factorio_blueprint::abstraction::Blueprint; +use factorio_core::beltoptions::{Beltspeed, Belttype}; +use factorio_layout::MacroBlock; + +pub mod assembling_line; + +pub enum SubFactory { + AssemblingLine { + num_machines: usize, + machine: String, + recipe: Option, + }, + DoubleAssemblingLine { + num_machines: usize, + machine: String, + recipe: Option, + }, +} + +enum BeltConnection { + Full(String), + Split { left: String, right: String }, +} + +impl SubFactory { + fn get_subfactory( + &self, + inputs: &[(&str, f64)], + outputs: &[(&str, f64)], + ) -> ( + Blueprint, + MacroBlock, + Vec, + Vec, + ) { + match self { + SubFactory::AssemblingLine { + num_machines, + machine, + recipe, + } => todo!(), + SubFactory::DoubleAssemblingLine { + num_machines, + machine, + recipe, + } => { + assert!(outputs.len() == 1); + assert!(inputs.len() <= 4); + + if inputs.len() > 1 { + let mut inputs = inputs.to_vec(); + inputs.sort_by(|a, b| b.1.total_cmp(&a.1)); + let (input1, belttype1, input2, belttype2) = if let Some( + &[ + (input1, amount1), + (input2, amount2), + (input3, amount3), + (input4, amount4), + ], + ) = inputs.first_chunk() + { + ( + BeltConnection::Split { + left: input1.to_owned(), + right: input2.to_owned(), + }, + Beltspeed::from_items_per_second(2.0 * f64::max(amount1, amount2)), + BeltConnection::Split { + left: input3.to_owned(), + right: input4.to_owned(), + }, + Beltspeed::from_items_per_second(2.0 * f64::max(amount3, amount4)), + ) + } else if let Some(&[(input1, amount1), (input2, amount2), (input3, amount3)]) = + inputs.first_chunk() + { + ( + BeltConnection::Full(input1.to_owned()), + Beltspeed::from_items_per_second(amount1), + BeltConnection::Split { + left: input2.to_owned(), + right: input3.to_owned(), + }, + Beltspeed::from_items_per_second(2.0 * f64::max(amount2, amount3)), + ) + } else if let Some(&[(input1, amount1), (input2, amount2)]) = + inputs.first_chunk() + { + ( + BeltConnection::Full(input1.to_owned()), + Beltspeed::from_items_per_second(amount1), + BeltConnection::Full(input2.to_owned()), + Beltspeed::from_items_per_second(amount2), + ) + } else { + unreachable!() + }; + + ( + todo!(), + todo!(), + vec![input1, input2], + vec![BeltConnection::Full(outputs[0].0.to_owned())], + ) + } else { + ( + todo!(), + todo!(), + vec![BeltConnection::Full(inputs[0].0.to_owned())], + vec![BeltConnection::Full(outputs[0].0.to_owned())], + ) + } + } + } + } +} diff --git a/factorio-blueprint-generator/src/assembly.rs b/factorio-blueprint-generator/src/subfactory/assembling_line.rs similarity index 100% rename from factorio-blueprint-generator/src/assembly.rs rename to factorio-blueprint-generator/src/subfactory/assembling_line.rs