diff --git a/factorio-blueprint-generator/src/factory.rs b/factorio-blueprint-generator/src/factory.rs index a546356..df14f03 100644 --- a/factorio-blueprint-generator/src/factory.rs +++ b/factorio-blueprint-generator/src/factory.rs @@ -103,9 +103,9 @@ pub fn generate_factory, pub startpoint: usize, - pub endblock: usize, + pub endblock: Option, pub endpoint: usize, pub lanes: usize, pub beltspeed: Beltspeed, @@ -40,6 +41,8 @@ pub struct Connection { #[derive(Debug, Serialize, Deserialize)] pub struct LayoutInput { pub blocks: Vec, + pub input: Vec, + pub output: Vec, pub connections: Vec, } diff --git a/factorio-layout/src/misc.rs b/factorio-layout/src/misc.rs index 63c4ff4..81fcad9 100644 --- a/factorio-layout/src/misc.rs +++ b/factorio-layout/src/misc.rs @@ -1,10 +1,7 @@ use crate::{LayoutInput, LayoutResult}; use factorio_core::prelude::*; use factorio_pathfinding::{Connection, examples::HashMapMap}; -use rand::{ - Rng, - seq::IndexedRandom, -}; +use rand::{Rng, seq::IndexedRandom}; pub fn initally_set_blocks( input: &LayoutInput, @@ -113,20 +110,34 @@ pub fn path_input_from_blocks_positions( } for c in &input.connections { - let start_transform = block_positions[c.startblock].block_to_world(); - let start_pos = input.blocks[c.startblock].output[c.startpoint] - .offset - .transform(start_transform); - let start_dir = input.blocks[c.startblock].output[c.startpoint] - .dir - .transform(start_transform); - let end_transform = block_positions[c.endblock].block_to_world(); - let end_pos = input.blocks[c.endblock].input[c.endpoint] - .offset - .transform(end_transform); - let end_dir = input.blocks[c.endblock].input[c.endpoint] - .dir - .transform(end_transform); + let start_pos; + let start_dir; + if let Some(block) = c.startblock { + let start_transform = block_positions[block].block_to_world(); + start_pos = input.blocks[block].output[c.startpoint] + .offset + .transform(start_transform); + start_dir = input.blocks[block].output[c.startpoint] + .dir + .transform(start_transform); + } else { + start_pos = input.output[c.startpoint].offset; + start_dir = input.output[c.startpoint].dir; + } + let end_pos; + let end_dir; + if let Some(block) = c.endblock { + let end_transform = block_positions[block].block_to_world(); + end_pos = input.blocks[block].input[c.endpoint] + .offset + .transform(end_transform); + end_dir = input.blocks[block].input[c.endpoint] + .dir + .transform(end_transform); + } else { + end_pos = input.input[c.endpoint].offset; + end_dir = input.input[c.endpoint].dir; + } connections.push(Connection { start_pos,