Add schedules and output as blueprint book

This commit is contained in:
hal8174 2024-11-24 03:35:50 +01:00
parent 6ac0cab8d5
commit 3beab0c64d
3 changed files with 127 additions and 26 deletions

View file

@ -1,9 +1,39 @@
use factorio_blueprint::blueprint::{train::generate_train, BlueprintString}; use factorio_blueprint::blueprint::{
train::generate_train, BlueprintBook, BlueprintBookEntry, BlueprintString,
};
fn main() { fn main() {
let b = generate_train(2, 4, true, true); let layouts = [
(1, 1),
(1, 2),
(1, 4),
(2, 4),
(1, 8),
(2, 8),
(3, 8),
(4, 8),
];
let b = BlueprintString::Blueprint(b); let mut b = Vec::new();
for (i, (locomotives, wagons)) in layouts.into_iter().enumerate() {
b.push(BlueprintBookEntry::new(
BlueprintString::Blueprint(generate_train(locomotives, wagons, true, false)),
i as u32 * 2,
));
b.push(BlueprintBookEntry::new(
BlueprintString::Blueprint(generate_train(locomotives, wagons, true, true)),
i as u32 * 2 + 1,
));
}
let b = BlueprintString::BlueprintBook(
BlueprintBook::builder()
.blueprints(b)
.active_index(0)
.version(562949954797573)
.build(),
);
println!("{}", serde_json::to_string_pretty(&b).unwrap()); println!("{}", serde_json::to_string_pretty(&b).unwrap());

View file

@ -12,10 +12,13 @@ pub enum BlueprintString {
Blueprint(Blueprint), Blueprint(Blueprint),
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Builder)]
pub struct BlueprintBook { pub struct BlueprintBook {
#[builder(skip = "blueprint-book".to_owned())]
item: String, item: String,
#[serde(skip_serializing_if = "Option::is_none")]
label: Option<String>, label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
label_color: Option<BlueprintColor>, label_color: Option<BlueprintColor>,
blueprints: Vec<BlueprintBookEntry>, blueprints: Vec<BlueprintBookEntry>,
active_index: i32, active_index: i32,
@ -29,6 +32,12 @@ pub struct BlueprintBookEntry {
index: u32, index: u32,
} }
impl BlueprintBookEntry {
pub fn new(entry: BlueprintString, index: u32) -> Self {
Self { entry, index }
}
}
#[derive(Serialize, Deserialize, Debug, Builder)] #[derive(Serialize, Deserialize, Debug, Builder)]
pub struct Blueprint { pub struct Blueprint {
#[builder(skip = "blueprint".to_owned())] #[builder(skip = "blueprint".to_owned())]
@ -47,7 +56,7 @@ pub struct Blueprint {
icons: Vec<BlueprintIcon>, icons: Vec<BlueprintIcon>,
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "Vec::is_empty")]
#[builder(default)] #[builder(default)]
schedules: Vec<BlueprintSchedule>, schedules: Vec<serde_json::Value>,
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "Vec::is_empty")]
#[builder(default)] #[builder(default)]
stock_connections: Vec<BlueprintStockConnection>, stock_connections: Vec<BlueprintStockConnection>,
@ -268,27 +277,6 @@ pub struct BlueprintIcon {
signal: BlueprintSignalID, signal: BlueprintSignalID,
} }
#[derive(Serialize, Deserialize, Debug)]
pub struct BlueprintSchedule {
schedule: Vec<BlueprintScheduleRecord>,
locomotives: Vec<u64>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct BlueprintScheduleRecord {
station: String,
wait_conditions: Vec<BlueprintWaitCondition>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct BlueprintWaitCondition {
#[serde(rename = "type")]
condition_type: String,
compare_type: String,
ticks: Option<u64>,
condition: Option<()>,
}
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct BlueprintTile { pub struct BlueprintTile {
name: String, name: String,

View file

@ -69,10 +69,93 @@ pub fn generate_train(locomotives: u32, wagons: u32, rails: bool, fluid: bool) -
); );
} }
let cargotype = if fluid {
"[virtual-signal=signal-L]"
} else {
"[virtual-signal=signal-C]"
};
let schedule = serde_json::json!({
"locomotives": [1],
"schedule": {
"group": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}]"),
"interrupts": [
{
"name": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}][virtual-signal=signal-L]"),
"conditions": [
{
"compare_type": "and",
"station": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}][virtual-signal=signal-L]"),
"type": "specific_destination_not_full"
},
{
"compare_type": "and",
"type": "empty"
}
],
"inside_interrupt": false,
"targets": [
{
"station": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}][virtual-signal=signal-L]"),
"wait_conditions": [
{
"compare_type": "and",
"type": "full"
}
]
}
]
},
{
"name": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}][virtual-signal=signal-U]"),
"conditions": [
{
"type": "item_count",
"compare_type": "and",
"condition": {
"comparator": "",
"constant": 0,
"first_signal": {
"name": "signal-item-parameter",
"type": "virtual",
}
},
}
],
"targets": [
{
"station": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}][virtual-signal=signal-U][virtual-signal=signal-item-parameter]"),
"wait_conditions": [
{
"type": "item_count",
"compare_type": "and",
"condition": {
"comparator": "=",
"constant": 0,
"first_signal": {
"name": "signal-item-parameter",
"type": "virtual"
}
},
}
]
}
]
}
],
"records": [
{
"station": "Depot"
}
]
}
});
Blueprint::builder() Blueprint::builder()
.label("train".to_string()) .label("train".to_string())
.entities(e) .entities(e)
.stock_connections(stock_connections) .stock_connections(stock_connections)
.schedules(vec![schedule])
.version(562949954797573) .version(562949954797573)
.snap_to_grid(BlueprintPosition::new( .snap_to_grid(BlueprintPosition::new(
4.0, 4.0,