diff --git a/examples/train_blueprint.rs b/examples/train_blueprint.rs index b30cae2..e9e3504 100644 --- a/examples/train_blueprint.rs +++ b/examples/train_blueprint.rs @@ -31,10 +31,11 @@ fn main() { BlueprintBook::builder() .blueprints(b) .active_index(0) - .version(562949954797573) .build(), ); + // let b = BlueprintString::Blueprint(generate_train(1, 2, false, false)); + println!("{}", serde_json::to_string_pretty(&b).unwrap()); println!( diff --git a/src/blueprint/structs.rs b/src/blueprint/structs.rs index 5a37756..12d369f 100644 --- a/src/blueprint/structs.rs +++ b/src/blueprint/structs.rs @@ -4,6 +4,12 @@ use bon::Builder; use serde::Deserialize; use serde::Serialize; +static VERSION: u64 = calculate_version(2, 0, 19, 173); + +const fn calculate_version(major: u16, minor: u16, patch: u16, dev: u16) -> u64 { + ((major as u64) << 48) | ((minor as u64) << 32) | ((patch as u64) << 16) | (dev as u64) +} + #[derive(Serialize, Deserialize, Debug)] pub enum BlueprintString { #[serde(rename = "blueprint_book")] @@ -22,6 +28,7 @@ pub struct BlueprintBook { label_color: Option, blueprints: Vec, active_index: i32, + #[builder(skip = VERSION)] version: u64, } @@ -68,6 +75,7 @@ pub struct Blueprint { absolute_snapping: Option, #[serde(skip_serializing_if = "Option::is_none")] position_relative_to_grid: Option, + #[builder(skip = VERSION)] version: u64, } diff --git a/src/blueprint/train.rs b/src/blueprint/train.rs index 1151940..849a9de 100644 --- a/src/blueprint/train.rs +++ b/src/blueprint/train.rs @@ -75,11 +75,55 @@ pub fn generate_train(locomotives: u32, wagons: u32, rails: bool, fluid: bool) - "[virtual-signal=signal-C]" }; + let mut fuel_conditions = Vec::new(); + + fuel_conditions.push(serde_json::json!({ + "compare_type": "and", + "station": format!("[virtual-signal=signal-F][virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}]"), + "type": "specific_destination_not_full" + })); + + for (fuel, min) in [ + ("coal", 50), + ("solid-fuel", 50), + ("rocket-fuel", 20), + ("nuclear-fuel", 1), + ] { + fuel_conditions.push(serde_json::json!({ + "compare_type": "and", + "type": "fuel_item_count_any", + "condition": { + "comparator": "≤", + "constant": min, + "first_signal": { + "name": fuel, + }, + } + })); + } + let schedule = serde_json::json!({ "locomotives": [1], "schedule": { "group": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}]"), "interrupts": [ + { + "name": format!("[virtual-signal=signal-F][virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}]"), + "conditions": fuel_conditions, + "inside_interrupt": true, + "targets": [ + { + "station": format!("[virtual-signal=signal-F][virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}]"), + "wait_conditions": [ + { + "compare_type": "and", + "ticks": 120, + "type": "inactivity" + } + ] + } + ] + }, { "name": format!("{cargotype}[virtual-signal=signal-{locomotives}][virtual-signal=signal-{wagons}][virtual-signal=signal-L]"), "conditions": [ @@ -145,7 +189,7 @@ pub fn generate_train(locomotives: u32, wagons: u32, rails: bool, fluid: bool) - ], "records": [ { - "station": "Depot" + "station": format!("[virtual-signal=signal-D][virtual-signal=signal-{}]", locomotives + wagons), } ] } @@ -156,7 +200,6 @@ pub fn generate_train(locomotives: u32, wagons: u32, rails: bool, fluid: bool) - .entities(e) .stock_connections(stock_connections) .schedules(vec![schedule]) - .version(562949954797573) .snap_to_grid(BlueprintPosition::new( 4.0, 2.0 * ((locomotives + wagons) * 7).div_ceil(2) as f64,