Add stacked belts to station

This commit is contained in:
hal8174 2025-04-22 23:21:01 +02:00
parent 65e2c03824
commit 59d7cf50cb
5 changed files with 85 additions and 45 deletions

View file

@ -2,7 +2,7 @@ use clap::Parser;
use factorio_blueprint::abstraction::serde::AbstractBlueprintString; use factorio_blueprint::abstraction::serde::AbstractBlueprintString;
use factorio_blueprint::{BlueprintString, encode}; use factorio_blueprint::{BlueprintString, encode};
use factorio_blueprint_generator::multistation::{StationSpec, multistation}; use factorio_blueprint_generator::multistation::{StationSpec, multistation};
use factorio_core::beltoptions::Beltspeed; use factorio_core::beltoptions::{Beltspeed, Belttype};
use factorio_core::visualize::Visualize; use factorio_core::visualize::Visualize;
#[derive(Parser)] #[derive(Parser)]
@ -29,11 +29,7 @@ fn main() {
let (beltspeed, s) = s.split_at_checked(1).expect("extracting lanes"); let (beltspeed, s) = s.split_at_checked(1).expect("extracting lanes");
let (lanes, belttype) = if s.ends_with(['l', 'r']) { let lanes = s.trim_end_matches(['r', 'l', 's']);
s.split_at(s.len() - 1)
} else {
(s, "")
};
StationSpec { StationSpec {
locomotives: locomotives.parse().expect("parsing locomotive count"), locomotives: locomotives.parse().expect("parsing locomotive count"),
@ -51,12 +47,14 @@ fn main() {
_ => panic!("unknown belt speed {beltspeed}"), _ => panic!("unknown belt speed {beltspeed}"),
}, },
lanes: lanes.parse().expect("parsing lane count"), lanes: lanes.parse().expect("parsing lane count"),
belttype: match belttype { belttype: if s.contains('l') {
"" => factorio_core::beltoptions::Belttype::Full, Belttype::Left
"r" => factorio_core::beltoptions::Belttype::Right, } else if s.contains('r') {
"l" => factorio_core::beltoptions::Belttype::Left, Belttype::Right
_ => panic!("unknown belttype {belttype}"), } else {
Belttype::Full
}, },
stacked: s.contains('s'),
} }
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();

View file

@ -69,6 +69,7 @@ fn main() {
o, o,
beltspeed, beltspeed,
Belttype::Full, Belttype::Full,
false,
); );
inner_inner_b.push(BlueprintBookEntry::new( inner_inner_b.push(BlueprintBookEntry::new(
@ -94,10 +95,13 @@ fn main() {
BlueprintBook::builder() BlueprintBook::builder()
.blueprints(inner_b) .blueprints(inner_b)
.active_index(0) .active_index(0)
.label(format!("{locomotives}-{cargo}-{}", match load { .label(format!(
true => "load", "{locomotives}-{cargo}-{}",
false => "unload", match load {
})) true => "load",
false => "unload",
}
))
.build(), .build(),
), ),
2 * i as u32 + load as u32, 2 * i as u32 + load as u32,
@ -126,8 +130,16 @@ fn main() {
belttype, belttype,
} => { } => {
let b = BlueprintString::Blueprint( let b = BlueprintString::Blueprint(
basic_station(load, locomotives, length, outputs, beltspeed, belttype) basic_station(
.to_blueprint(), load,
locomotives,
length,
outputs,
beltspeed,
belttype,
false,
)
.to_blueprint(),
); );
if args.json { if args.json {

View file

@ -413,6 +413,7 @@ pub fn generate_factory<L: Layouter, P: Pathfinder + Sync, R: Rng + SeedableRng
beltspeed: Beltspeed::from_items_per_second(c.amount), beltspeed: Beltspeed::from_items_per_second(c.amount),
lanes: 1, lanes: 1,
belttype: factorio_core::beltoptions::Belttype::Full, belttype: factorio_core::beltoptions::Belttype::Full,
stacked: false,
})); }));
station_spec.extend(output_connections.iter().map(|&(_, c)| StationSpec { station_spec.extend(output_connections.iter().map(|&(_, c)| StationSpec {
locomotives: 2, locomotives: 2,
@ -421,6 +422,7 @@ pub fn generate_factory<L: Layouter, P: Pathfinder + Sync, R: Rng + SeedableRng
beltspeed: Beltspeed::from_items_per_second(c.amount), beltspeed: Beltspeed::from_items_per_second(c.amount),
lanes: 1, lanes: 1,
belttype: factorio_core::beltoptions::Belttype::Full, belttype: factorio_core::beltoptions::Belttype::Full,
stacked: false,
})); }));
intermediate_connections.push(IntermediateConnection { intermediate_connections.push(IntermediateConnection {

View file

@ -15,6 +15,7 @@ pub struct StationSpec {
pub beltspeed: Beltspeed, pub beltspeed: Beltspeed,
pub lanes: usize, pub lanes: usize,
pub belttype: Belttype, pub belttype: Belttype,
pub stacked: bool,
} }
fn calculate_station_height( fn calculate_station_height(
@ -268,6 +269,7 @@ pub fn multistation(
station.lanes, station.lanes,
station.beltspeed, station.beltspeed,
station.belttype, station.belttype,
station.stacked,
); );
let output_height = -b.bounding_box().min().y; let output_height = -b.bounding_box().min().y;

View file

@ -6,9 +6,23 @@ use factorio_core::{
use crate::binary_merger::merger; use crate::binary_merger::merger;
pub fn unloader(beltspeed: Beltspeed, belttype: Belttype) -> (Blueprint, PositionType) { pub fn unloader(
beltspeed: Beltspeed,
belttype: Belttype,
stacked: bool,
) -> (Blueprint, PositionType) {
let mut b = Blueprint::new(); let mut b = Blueprint::new();
let (belt_inserter, stack_size, quality) = match (beltspeed, stacked) {
(Beltspeed::Normal, false) => (InserterType::Fast, None, Quality::Normal),
(Beltspeed::Fast, false) => (InserterType::Fast, None, Quality::Normal),
(Beltspeed::Express, false) => (InserterType::Bulk, Some(7), Quality::Normal),
(Beltspeed::Turbo, false) => (InserterType::Bulk, Some(10), Quality::Normal),
(Beltspeed::Normal, true) => (InserterType::Stack, None, Quality::Normal),
(Beltspeed::Fast, true) => (InserterType::Stack, None, Quality::Normal),
(Beltspeed::Express, true) => (InserterType::Stack, None, Quality::Rare),
(Beltspeed::Turbo, true) => (InserterType::Stack, None, Quality::Epic),
};
if beltspeed == Beltspeed::Normal { if beltspeed == Beltspeed::Normal {
b.add_entity(Entity::new_belt( b.add_entity(Entity::new_belt(
Beltspeed::Fast, Beltspeed::Fast,
@ -30,12 +44,15 @@ pub fn unloader(beltspeed: Beltspeed, belttype: Belttype) -> (Blueprint, Positio
Direction::Down, Direction::Down,
)); ));
b.add_entity(Entity::new_inserter( b.add_entity(
InserterType::Fast, Entity::new_inserter(
None, belt_inserter,
Position::new(1, 1) + 2 * Position::new(4, -2), stack_size,
Direction::Right, Position::new(1, 1) + 2 * Position::new(4, -2),
)); Direction::Right,
)
.quality(quality),
);
} }
if belttype.contains_right() { if belttype.contains_right() {
@ -52,23 +69,19 @@ pub fn unloader(beltspeed: Beltspeed, belttype: Belttype) -> (Blueprint, Positio
Direction::Down, Direction::Down,
)); ));
b.add_entity(Entity::new_inserter( b.add_entity(
InserterType::Fast, Entity::new_inserter(
None, belt_inserter,
Position::new(1, 1) + 2 * Position::new(2, -2), stack_size,
Direction::Left, Position::new(1, 1) + 2 * Position::new(2, -2),
)); Direction::Left,
)
.quality(quality),
);
} }
(b, -3) (b, -3)
} else { } else {
let (belt_inserter, stack_size, quality) = match beltspeed {
Beltspeed::Normal => unreachable!(),
Beltspeed::Fast => (InserterType::Fast, None, Quality::Normal),
Beltspeed::Express => (InserterType::Bulk, Some(7), Quality::Normal),
Beltspeed::Turbo => (InserterType::Bulk, Some(10), Quality::Normal),
};
b.add_entity(Entity::new_belt( b.add_entity(Entity::new_belt(
beltspeed, beltspeed,
Position::new(1, 1) + 2 * Position::new(3, -4), Position::new(1, 1) + 2 * Position::new(3, -4),
@ -118,12 +131,16 @@ pub fn unloader(beltspeed: Beltspeed, belttype: Belttype) -> (Blueprint, Positio
} }
} }
pub fn one_loader(beltspeed: Beltspeed) -> (Blueprint, PositionType) { pub fn one_loader(beltspeed: Beltspeed, stacked: bool) -> (Blueprint, PositionType) {
let (belt_inserter, quality) = match beltspeed { let (belt_inserter, quality) = match (beltspeed, stacked) {
Beltspeed::Normal => (InserterType::Fast, Quality::Normal), (Beltspeed::Normal, false) => (InserterType::Fast, Quality::Normal),
Beltspeed::Fast => (InserterType::Bulk, Quality::Uncommon), (Beltspeed::Fast, false) => (InserterType::Bulk, Quality::Uncommon),
Beltspeed::Express => (InserterType::Bulk, Quality::Rare), (Beltspeed::Express, false) => (InserterType::Bulk, Quality::Rare),
Beltspeed::Turbo => (InserterType::Bulk, Quality::Legendary), (Beltspeed::Turbo, false) => (InserterType::Bulk, Quality::Legendary),
(Beltspeed::Normal, true) => todo!(),
(Beltspeed::Fast, true) => todo!(),
(Beltspeed::Express, true) => todo!(),
(Beltspeed::Turbo, true) => todo!(),
}; };
let mut b = Blueprint::new(); let mut b = Blueprint::new();
@ -186,6 +203,7 @@ pub fn basic_station(
outputs: usize, outputs: usize,
beltspeed: Beltspeed, beltspeed: Beltspeed,
belttype: Belttype, belttype: Belttype,
stacked: bool,
) -> Blueprint { ) -> Blueprint {
let section_size = length / outputs; let section_size = length / outputs;
assert!(length % outputs == 0); assert!(length % outputs == 0);
@ -215,16 +233,24 @@ pub fn basic_station(
false => unloader( false => unloader(
beltspeed.halvings((length / outputs).ilog2() as usize), beltspeed.halvings((length / outputs).ilog2() as usize),
belttype, belttype,
stacked,
),
true => one_loader(
beltspeed.halvings((length / outputs).ilog2() as usize),
stacked,
), ),
true => one_loader(beltspeed.halvings((length / outputs).ilog2() as usize)),
}; };
for l in 0..length { for l in 0..length {
let (mut unloader, _) = match load { let (mut unloader, _) = match load {
false => unloader( false => unloader(
beltspeed.halvings((length / outputs).ilog2() as usize), beltspeed.halvings((length / outputs).ilog2() as usize),
belttype, belttype,
stacked,
),
true => one_loader(
beltspeed.halvings((length / outputs).ilog2() as usize),
stacked,
), ),
true => one_loader(beltspeed.halvings((length / outputs).ilog2() as usize)),
}; };
unloader.transform(Transformation::new( unloader.transform(Transformation::new(