Load placed-structure triplets into save slices
This commit is contained in:
parent
9f1ee6550e
commit
7abd582aea
5 changed files with 433 additions and 1 deletions
|
|
@ -5783,6 +5783,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: None,
|
event_runtime_collection: None,
|
||||||
notes: vec!["exported for test".to_string()],
|
notes: vec!["exported for test".to_string()],
|
||||||
|
|
|
||||||
|
|
@ -1439,6 +1439,39 @@ fn project_save_slice_components(
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Some(collection) = &save_slice.placed_structure_collection {
|
||||||
|
metadata.insert(
|
||||||
|
"save_slice.placed_structure_collection_source_kind".to_string(),
|
||||||
|
collection.source_kind.clone(),
|
||||||
|
);
|
||||||
|
metadata.insert(
|
||||||
|
"save_slice.placed_structure_collection_semantic_family".to_string(),
|
||||||
|
collection.semantic_family.clone(),
|
||||||
|
);
|
||||||
|
metadata.insert(
|
||||||
|
"save_slice.placed_structure_collection_entry_count".to_string(),
|
||||||
|
collection.observed_entry_count.to_string(),
|
||||||
|
);
|
||||||
|
metadata.insert(
|
||||||
|
"save_slice.placed_structure_collection_farm_growth_stage_count".to_string(),
|
||||||
|
collection
|
||||||
|
.entries
|
||||||
|
.iter()
|
||||||
|
.filter(|entry| entry.farm_growth_stage_index.is_some())
|
||||||
|
.count()
|
||||||
|
.to_string(),
|
||||||
|
);
|
||||||
|
metadata.insert(
|
||||||
|
"save_slice.placed_structure_collection_nondefault_status_count".to_string(),
|
||||||
|
collection
|
||||||
|
.entries
|
||||||
|
.iter()
|
||||||
|
.filter(|entry| entry.profile_status_kind != "unset")
|
||||||
|
.count()
|
||||||
|
.to_string(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let named_locomotive_cost = BTreeMap::new();
|
let named_locomotive_cost = BTreeMap::new();
|
||||||
let all_cargo_price_override = None;
|
let all_cargo_price_override = None;
|
||||||
let named_cargo_price_overrides = BTreeMap::new();
|
let named_cargo_price_overrides = BTreeMap::new();
|
||||||
|
|
@ -5471,6 +5504,42 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn save_placed_structure_collection() -> crate::SmpLoadedPlacedStructureCollection {
|
||||||
|
crate::SmpLoadedPlacedStructureCollection {
|
||||||
|
source_kind: "save-placed-structure-record-triplets".to_string(),
|
||||||
|
semantic_family: "scenario-save-placed-structure-triplet-collection".to_string(),
|
||||||
|
observed_entry_count: 2,
|
||||||
|
entries: vec![
|
||||||
|
crate::SmpLoadedPlacedStructureEntry {
|
||||||
|
record_index: 0,
|
||||||
|
primary_name: "FarmCorn".to_string(),
|
||||||
|
secondary_name: "FarmSet".to_string(),
|
||||||
|
policy_trailing_word: 1,
|
||||||
|
policy_trailing_word_hex: "0x0001".to_string(),
|
||||||
|
profile_payload_dword: 0,
|
||||||
|
profile_payload_dword_hex: "0x00000000".to_string(),
|
||||||
|
profile_status_kind: "farm_growth_stage_bucket".to_string(),
|
||||||
|
farm_growth_stage_index: Some(4),
|
||||||
|
profile_companion_byte_u8: Some(0),
|
||||||
|
profile_companion_byte_hex: Some("0x00".to_string()),
|
||||||
|
},
|
||||||
|
crate::SmpLoadedPlacedStructureEntry {
|
||||||
|
record_index: 1,
|
||||||
|
primary_name: "StationA".to_string(),
|
||||||
|
secondary_name: "StationSetA".to_string(),
|
||||||
|
policy_trailing_word: 1,
|
||||||
|
policy_trailing_word_hex: "0x0001".to_string(),
|
||||||
|
profile_payload_dword: 0x00005dc1,
|
||||||
|
profile_payload_dword_hex: "0x00005dc1".to_string(),
|
||||||
|
profile_status_kind: "opaque_nondefault".to_string(),
|
||||||
|
farm_growth_stage_index: None,
|
||||||
|
profile_companion_byte_u8: Some(7),
|
||||||
|
profile_companion_byte_hex: Some("0x07".to_string()),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn save_chairman_profile_table() -> crate::SmpLoadedChairmanProfileTable {
|
fn save_chairman_profile_table() -> crate::SmpLoadedChairmanProfileTable {
|
||||||
crate::SmpLoadedChairmanProfileTable {
|
crate::SmpLoadedChairmanProfileTable {
|
||||||
source_kind: "tracked-save-slice-chairman-profile-table".to_string(),
|
source_kind: "tracked-save-slice-chairman-profile-table".to_string(),
|
||||||
|
|
@ -5970,6 +6039,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: None,
|
event_runtime_collection: None,
|
||||||
notes: vec![],
|
notes: vec![],
|
||||||
|
|
@ -6017,6 +6087,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: None,
|
event_runtime_collection: None,
|
||||||
notes: vec![],
|
notes: vec![],
|
||||||
|
|
@ -6246,6 +6317,7 @@ mod tests {
|
||||||
}),
|
}),
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: Some(crate::SmpLoadedSpecialConditionsTable {
|
special_conditions_table: Some(crate::SmpLoadedSpecialConditionsTable {
|
||||||
source_kind: "save-fixed-special-conditions-range".to_string(),
|
source_kind: "save-fixed-special-conditions-range".to_string(),
|
||||||
table_offset: 0x0d64,
|
table_offset: 0x0d64,
|
||||||
|
|
@ -6793,6 +6865,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: Some(save_company_roster()),
|
company_roster: Some(save_company_roster()),
|
||||||
chairman_profile_table: Some(save_chairman_profile_table()),
|
chairman_profile_table: Some(save_chairman_profile_table()),
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: None,
|
event_runtime_collection: None,
|
||||||
notes: vec![],
|
notes: vec![],
|
||||||
|
|
@ -6823,6 +6896,73 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn projects_placed_structure_collection_metadata_from_save_slice() {
|
||||||
|
let save_slice = SmpLoadedSaveSlice {
|
||||||
|
file_extension_hint: Some("gms".to_string()),
|
||||||
|
container_profile_family: Some("rt3-classic-save-container-v1".to_string()),
|
||||||
|
mechanism_family: "classic-save-rehydrate-v1".to_string(),
|
||||||
|
mechanism_confidence: "grounded".to_string(),
|
||||||
|
trailer_family: None,
|
||||||
|
bridge_family: None,
|
||||||
|
profile: None,
|
||||||
|
candidate_availability_table: None,
|
||||||
|
named_locomotive_availability_table: None,
|
||||||
|
locomotive_catalog: None,
|
||||||
|
cargo_catalog: None,
|
||||||
|
world_issue_37_state: None,
|
||||||
|
world_economic_tuning_state: None,
|
||||||
|
world_finance_neighborhood_state: None,
|
||||||
|
world_locomotive_policy_state: None,
|
||||||
|
company_roster: None,
|
||||||
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: Some(save_placed_structure_collection()),
|
||||||
|
special_conditions_table: None,
|
||||||
|
event_runtime_collection: None,
|
||||||
|
notes: vec![],
|
||||||
|
};
|
||||||
|
|
||||||
|
let import = project_save_slice_to_runtime_state_import(
|
||||||
|
&save_slice,
|
||||||
|
"save-native-placed-structures",
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.expect("save slice should project");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
import
|
||||||
|
.state
|
||||||
|
.metadata
|
||||||
|
.get("save_slice.placed_structure_collection_source_kind")
|
||||||
|
.map(String::as_str),
|
||||||
|
Some("save-placed-structure-record-triplets")
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
import
|
||||||
|
.state
|
||||||
|
.metadata
|
||||||
|
.get("save_slice.placed_structure_collection_entry_count")
|
||||||
|
.map(String::as_str),
|
||||||
|
Some("2")
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
import
|
||||||
|
.state
|
||||||
|
.metadata
|
||||||
|
.get("save_slice.placed_structure_collection_farm_growth_stage_count")
|
||||||
|
.map(String::as_str),
|
||||||
|
Some("1")
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
import
|
||||||
|
.state
|
||||||
|
.metadata
|
||||||
|
.get("save_slice.placed_structure_collection_nondefault_status_count")
|
||||||
|
.map(String::as_str),
|
||||||
|
Some("2")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn overlay_replaces_base_company_and_chairman_context_from_save_slice() {
|
fn overlay_replaces_base_company_and_chairman_context_from_save_slice() {
|
||||||
let base_state = RuntimeState {
|
let base_state = RuntimeState {
|
||||||
|
|
@ -6881,6 +7021,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: Some(save_company_roster()),
|
company_roster: Some(save_company_roster()),
|
||||||
chairman_profile_table: Some(save_chairman_profile_table()),
|
chairman_profile_table: Some(save_chairman_profile_table()),
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: None,
|
event_runtime_collection: None,
|
||||||
notes: vec![],
|
notes: vec![],
|
||||||
|
|
@ -7052,6 +7193,7 @@ mod tests {
|
||||||
selected_chairman_profile_id: Some(1),
|
selected_chairman_profile_id: Some(1),
|
||||||
entries: Vec::new(),
|
entries: Vec::new(),
|
||||||
}),
|
}),
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: None,
|
event_runtime_collection: None,
|
||||||
notes: vec![],
|
notes: vec![],
|
||||||
|
|
@ -7101,6 +7243,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -7233,6 +7376,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -7343,6 +7487,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -7479,6 +7624,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -7576,6 +7722,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -7741,6 +7888,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -7996,6 +8144,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8086,6 +8235,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8200,6 +8350,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8287,6 +8438,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: Some(save_company_roster()),
|
company_roster: Some(save_company_roster()),
|
||||||
chairman_profile_table: Some(save_chairman_profile_table()),
|
chairman_profile_table: Some(save_chairman_profile_table()),
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8377,6 +8529,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: Some(save_company_roster()),
|
company_roster: Some(save_company_roster()),
|
||||||
chairman_profile_table: Some(save_chairman_profile_table()),
|
chairman_profile_table: Some(save_chairman_profile_table()),
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8480,6 +8633,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8599,6 +8753,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8689,6 +8844,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8856,6 +9012,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -8968,6 +9125,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9057,6 +9215,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9146,6 +9305,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9309,6 +9469,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9417,6 +9578,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9504,6 +9666,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9601,6 +9764,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9707,6 +9871,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9821,6 +9986,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -9924,6 +10090,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10013,6 +10180,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10172,6 +10340,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10341,6 +10510,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10458,6 +10628,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10556,6 +10727,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10681,6 +10853,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10800,6 +10973,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -10909,6 +11083,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11014,6 +11189,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11133,6 +11309,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11237,6 +11414,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11323,6 +11501,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11414,6 +11593,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11510,6 +11690,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11606,6 +11787,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11718,6 +11900,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11821,6 +12004,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -11971,6 +12155,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -12120,6 +12305,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -12660,6 +12846,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -12854,6 +13041,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -12993,6 +13181,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: Some(save_company_roster()),
|
company_roster: Some(save_company_roster()),
|
||||||
chairman_profile_table: Some(save_chairman_profile_table()),
|
chairman_profile_table: Some(save_chairman_profile_table()),
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -13131,6 +13320,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: Some(save_company_roster()),
|
company_roster: Some(save_company_roster()),
|
||||||
chairman_profile_table: Some(save_chairman_profile_table()),
|
chairman_profile_table: Some(save_chairman_profile_table()),
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -13270,6 +13460,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -13393,6 +13584,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -13591,6 +13783,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -13697,6 +13890,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -13805,6 +13999,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -13984,6 +14179,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -14146,6 +14342,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -14249,6 +14446,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -14385,6 +14583,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -14509,6 +14708,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -14707,6 +14907,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
@ -14915,6 +15116,7 @@ mod tests {
|
||||||
world_locomotive_policy_state: None,
|
world_locomotive_policy_state: None,
|
||||||
company_roster: None,
|
company_roster: None,
|
||||||
chairman_profile_table: None,
|
chairman_profile_table: None,
|
||||||
|
placed_structure_collection: None,
|
||||||
special_conditions_table: None,
|
special_conditions_table: None,
|
||||||
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
event_runtime_collection: Some(crate::SmpLoadedEventRuntimeCollectionSummary {
|
||||||
source_kind: "packed-event-runtime-collection".to_string(),
|
source_kind: "packed-event-runtime-collection".to_string(),
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,8 @@ pub use smp::{
|
||||||
SmpLoadedNamedLocomotiveAvailabilityTable, SmpLoadedPackedEventCompactControlSummary,
|
SmpLoadedNamedLocomotiveAvailabilityTable, SmpLoadedPackedEventCompactControlSummary,
|
||||||
SmpLoadedPackedEventConditionRowSummary, SmpLoadedPackedEventGroupedEffectRowSummary,
|
SmpLoadedPackedEventConditionRowSummary, SmpLoadedPackedEventGroupedEffectRowSummary,
|
||||||
SmpLoadedPackedEventNegativeSentinelScopeSummary, SmpLoadedPackedEventRecordSummary,
|
SmpLoadedPackedEventNegativeSentinelScopeSummary, SmpLoadedPackedEventRecordSummary,
|
||||||
SmpLoadedPackedEventTextBandSummary, SmpLoadedProfile, SmpLoadedSaveSlice,
|
SmpLoadedPackedEventTextBandSummary, SmpLoadedPlacedStructureCollection,
|
||||||
|
SmpLoadedPlacedStructureEntry, SmpLoadedProfile, SmpLoadedSaveSlice,
|
||||||
SmpLoadedSpecialConditionsTable, SmpLoadedWorldEconomicTuningState,
|
SmpLoadedSpecialConditionsTable, SmpLoadedWorldEconomicTuningState,
|
||||||
SmpLoadedWorldFinanceNeighborhoodState, SmpLoadedWorldIssue37State,
|
SmpLoadedWorldFinanceNeighborhoodState, SmpLoadedWorldIssue37State,
|
||||||
SmpLocomotivePolicyFieldObservation, SmpLocomotivePolicyFloatAlignmentCandidate,
|
SmpLocomotivePolicyFieldObservation, SmpLocomotivePolicyFloatAlignmentCandidate,
|
||||||
|
|
|
||||||
|
|
@ -1928,6 +1928,33 @@ pub struct SmpSavePlacedStructureRecordTripletProbe {
|
||||||
pub evidence: Vec<String>,
|
pub evidence: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
pub struct SmpLoadedPlacedStructureEntry {
|
||||||
|
pub record_index: usize,
|
||||||
|
pub primary_name: String,
|
||||||
|
pub secondary_name: String,
|
||||||
|
pub policy_trailing_word: u16,
|
||||||
|
pub policy_trailing_word_hex: String,
|
||||||
|
pub profile_payload_dword: u32,
|
||||||
|
pub profile_payload_dword_hex: String,
|
||||||
|
pub profile_status_kind: String,
|
||||||
|
#[serde(default)]
|
||||||
|
pub farm_growth_stage_index: Option<u8>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub profile_companion_byte_u8: Option<u8>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub profile_companion_byte_hex: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
|
pub struct SmpLoadedPlacedStructureCollection {
|
||||||
|
pub source_kind: String,
|
||||||
|
pub semantic_family: String,
|
||||||
|
pub observed_entry_count: usize,
|
||||||
|
#[serde(default)]
|
||||||
|
pub entries: Vec<SmpLoadedPlacedStructureEntry>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
pub struct SmpSavePlacedStructureDynamicSideBufferProbe {
|
pub struct SmpSavePlacedStructureDynamicSideBufferProbe {
|
||||||
pub profile_family: String,
|
pub profile_family: String,
|
||||||
|
|
@ -4038,6 +4065,8 @@ pub struct SmpLoadedSaveSlice {
|
||||||
pub company_roster: Option<SmpLoadedCompanyRoster>,
|
pub company_roster: Option<SmpLoadedCompanyRoster>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub chairman_profile_table: Option<SmpLoadedChairmanProfileTable>,
|
pub chairman_profile_table: Option<SmpLoadedChairmanProfileTable>,
|
||||||
|
#[serde(default)]
|
||||||
|
pub placed_structure_collection: Option<SmpLoadedPlacedStructureCollection>,
|
||||||
pub special_conditions_table: Option<SmpLoadedSpecialConditionsTable>,
|
pub special_conditions_table: Option<SmpLoadedSpecialConditionsTable>,
|
||||||
pub event_runtime_collection: Option<SmpLoadedEventRuntimeCollectionSummary>,
|
pub event_runtime_collection: Option<SmpLoadedEventRuntimeCollectionSummary>,
|
||||||
pub notes: Vec<String>,
|
pub notes: Vec<String>,
|
||||||
|
|
@ -6830,6 +6859,33 @@ pub fn inspect_smp_bytes(bytes: &[u8]) -> SmpInspectionReport {
|
||||||
inspect_bundle_bytes(bytes, None)
|
inspect_bundle_bytes(bytes, None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn derive_loaded_placed_structure_collection_from_probe(
|
||||||
|
probe: &SmpSavePlacedStructureRecordTripletProbe,
|
||||||
|
) -> SmpLoadedPlacedStructureCollection {
|
||||||
|
SmpLoadedPlacedStructureCollection {
|
||||||
|
source_kind: probe.source_kind.clone(),
|
||||||
|
semantic_family: "scenario-save-placed-structure-triplet-collection".to_string(),
|
||||||
|
observed_entry_count: probe.record_count,
|
||||||
|
entries: probe
|
||||||
|
.entries
|
||||||
|
.iter()
|
||||||
|
.map(|entry| SmpLoadedPlacedStructureEntry {
|
||||||
|
record_index: entry.record_index,
|
||||||
|
primary_name: entry.primary_name.clone(),
|
||||||
|
secondary_name: entry.secondary_name.clone(),
|
||||||
|
policy_trailing_word: entry.policy_trailing_word,
|
||||||
|
policy_trailing_word_hex: entry.policy_trailing_word_hex.clone(),
|
||||||
|
profile_payload_dword: entry.profile_payload_dword,
|
||||||
|
profile_payload_dword_hex: entry.profile_payload_dword_hex.clone(),
|
||||||
|
profile_status_kind: entry.profile_status_kind.clone(),
|
||||||
|
farm_growth_stage_index: entry.farm_growth_stage_index,
|
||||||
|
profile_companion_byte_u8: entry.profile_companion_byte_u8,
|
||||||
|
profile_companion_byte_hex: entry.profile_companion_byte_hex.clone(),
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn load_save_slice_file(path: &Path) -> Result<SmpLoadedSaveSlice, Box<dyn std::error::Error>> {
|
pub fn load_save_slice_file(path: &Path) -> Result<SmpLoadedSaveSlice, Box<dyn std::error::Error>> {
|
||||||
let inspection = inspect_smp_file(path)?;
|
let inspection = inspect_smp_file(path)?;
|
||||||
load_save_slice_from_report(&inspection)
|
load_save_slice_from_report(&inspection)
|
||||||
|
|
@ -6974,6 +7030,10 @@ pub fn load_save_slice_from_report(
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
let placed_structure_collection = report
|
||||||
|
.save_placed_structure_record_triplet_probe
|
||||||
|
.as_ref()
|
||||||
|
.map(derive_loaded_placed_structure_collection_from_probe);
|
||||||
let special_conditions_table =
|
let special_conditions_table =
|
||||||
report
|
report
|
||||||
.special_conditions_probe
|
.special_conditions_probe
|
||||||
|
|
@ -7144,6 +7204,22 @@ pub fn load_save_slice_from_report(
|
||||||
probe.entries.first().map(|entry| entry.profile_status_kind.as_str())
|
probe.entries.first().map(|entry| entry.profile_status_kind.as_str())
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
if let Some(collection) = &placed_structure_collection {
|
||||||
|
let farm_growth_stage_count = collection
|
||||||
|
.entries
|
||||||
|
.iter()
|
||||||
|
.filter(|entry| entry.farm_growth_stage_index.is_some())
|
||||||
|
.count();
|
||||||
|
let opaque_status_count = collection
|
||||||
|
.entries
|
||||||
|
.iter()
|
||||||
|
.filter(|entry| entry.profile_status_kind != "unset")
|
||||||
|
.count();
|
||||||
|
notes.push(format!(
|
||||||
|
"Save-slice projection now carries {} loaded placed-structure triplet rows as first-class context, with {} farm growth-stage rows and {} non-default footer-status rows.",
|
||||||
|
collection.observed_entry_count, farm_growth_stage_count, opaque_status_count
|
||||||
|
));
|
||||||
|
}
|
||||||
if let Some(probe) = &placed_structure_dynamic_side_buffer_probe {
|
if let Some(probe) = &placed_structure_dynamic_side_buffer_probe {
|
||||||
let dominant_pattern = probe.compact_prefix_pattern_summaries.first();
|
let dominant_pattern = probe.compact_prefix_pattern_summaries.first();
|
||||||
let payload_envelope_summary = probe.payload_envelope_summary.as_ref();
|
let payload_envelope_summary = probe.payload_envelope_summary.as_ref();
|
||||||
|
|
@ -7240,6 +7316,7 @@ pub fn load_save_slice_from_report(
|
||||||
world_locomotive_policy_state,
|
world_locomotive_policy_state,
|
||||||
company_roster,
|
company_roster,
|
||||||
chairman_profile_table,
|
chairman_profile_table,
|
||||||
|
placed_structure_collection,
|
||||||
special_conditions_table,
|
special_conditions_table,
|
||||||
event_runtime_collection: report.event_runtime_collection_summary.clone(),
|
event_runtime_collection: report.event_runtime_collection_summary.clone(),
|
||||||
notes,
|
notes,
|
||||||
|
|
@ -25240,6 +25317,154 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn loads_placed_structure_collection_from_report() {
|
||||||
|
let mut report = inspect_smp_bytes(&[]);
|
||||||
|
let classic_probe = SmpClassicRehydrateProfileProbe {
|
||||||
|
profile_family: "rt3-classic-save-container-v1".to_string(),
|
||||||
|
progress_32dc_offset: 0x76e8,
|
||||||
|
progress_3714_offset: 0x76ec,
|
||||||
|
progress_3715_offset: 0x77f8,
|
||||||
|
packed_profile_offset: 0x76f0,
|
||||||
|
packed_profile_len: 0x108,
|
||||||
|
packed_profile_len_hex: "0x108".to_string(),
|
||||||
|
packed_profile_block: SmpClassicPackedProfileBlock {
|
||||||
|
relative_len: 0x108,
|
||||||
|
relative_len_hex: "0x108".to_string(),
|
||||||
|
leading_word_0: 3,
|
||||||
|
leading_word_0_hex: "0x00000003".to_string(),
|
||||||
|
trailing_zero_word_count_after_leading_word: 3,
|
||||||
|
map_path_offset: 0x13,
|
||||||
|
map_path: Some("British Isles.gmp".to_string()),
|
||||||
|
display_name_offset: 0x46,
|
||||||
|
display_name: Some("British Isles".to_string()),
|
||||||
|
profile_byte_0x77: 0,
|
||||||
|
profile_byte_0x77_hex: "0x00".to_string(),
|
||||||
|
profile_byte_0x82: 0,
|
||||||
|
profile_byte_0x82_hex: "0x00".to_string(),
|
||||||
|
profile_byte_0x97: 0,
|
||||||
|
profile_byte_0x97_hex: "0x00".to_string(),
|
||||||
|
profile_byte_0xc5: 0,
|
||||||
|
profile_byte_0xc5_hex: "0x00".to_string(),
|
||||||
|
stable_nonzero_words: vec![],
|
||||||
|
},
|
||||||
|
ascii_runs: vec![],
|
||||||
|
};
|
||||||
|
report.classic_rehydrate_profile_probe = Some(classic_probe.clone());
|
||||||
|
report.save_load_summary = build_save_load_summary(
|
||||||
|
Some("gms"),
|
||||||
|
Some(&SmpContainerProfile {
|
||||||
|
profile_family: "rt3-classic-save-container-v1".to_string(),
|
||||||
|
profile_evidence: vec![],
|
||||||
|
is_known_profile: true,
|
||||||
|
}),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some(&classic_probe),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
report.save_placed_structure_record_triplet_probe =
|
||||||
|
Some(SmpSavePlacedStructureRecordTripletProbe {
|
||||||
|
profile_family: "rt3-classic-save-container-v1".to_string(),
|
||||||
|
source_kind: "save-placed-structure-record-triplets".to_string(),
|
||||||
|
semantic_family: "scenario-save-placed-structure-record-triplets".to_string(),
|
||||||
|
records_tag_offset: 0x3600,
|
||||||
|
close_tag_offset: 0x3800,
|
||||||
|
record_count: 2,
|
||||||
|
entries: vec![
|
||||||
|
SmpSavePlacedStructureRecordTripletEntryProbe {
|
||||||
|
record_index: 0,
|
||||||
|
primary_name: "FarmCorn".to_string(),
|
||||||
|
secondary_name: "FarmSet".to_string(),
|
||||||
|
name_tag_relative_offset: 0,
|
||||||
|
policy_tag_relative_offset: 0x10,
|
||||||
|
profile_tag_relative_offset: 0x2e,
|
||||||
|
policy_chunk_len: 0x1a,
|
||||||
|
profile_chunk_len: 0x10,
|
||||||
|
policy_f32_lane_0: 1.0,
|
||||||
|
policy_f32_lane_1: 2.0,
|
||||||
|
policy_f32_lane_2: 3.0,
|
||||||
|
policy_f32_lane_3: 4.0,
|
||||||
|
policy_f32_lane_4: 5.0,
|
||||||
|
policy_reserved_dword: 0,
|
||||||
|
policy_trailing_word: 1,
|
||||||
|
policy_trailing_word_hex: "0x0001".to_string(),
|
||||||
|
profile_open_marker: 0x00005dc1,
|
||||||
|
profile_open_marker_hex: "0x00005dc1".to_string(),
|
||||||
|
profile_repeated_primary_name: "FarmCorn".to_string(),
|
||||||
|
profile_repeated_secondary_name: "FarmSet".to_string(),
|
||||||
|
profile_footer_relative_offset: 0x08,
|
||||||
|
profile_footer_relative_offset_hex: "0x8".to_string(),
|
||||||
|
profile_pre_footer_padding_len: 1,
|
||||||
|
profile_pre_footer_padding_hex_bytes: vec!["0x00".to_string()],
|
||||||
|
profile_companion_byte_u8: Some(0),
|
||||||
|
profile_companion_byte_hex: Some("0x00".to_string()),
|
||||||
|
profile_payload_dword: 0,
|
||||||
|
profile_payload_dword_hex: "0x00000000".to_string(),
|
||||||
|
profile_sentinel_i32: 4,
|
||||||
|
profile_status_kind: "farm_growth_stage_bucket".to_string(),
|
||||||
|
farm_growth_stage_index: Some(4),
|
||||||
|
profile_close_marker: 0x00005dc2,
|
||||||
|
profile_close_marker_hex: "0x00005dc2".to_string(),
|
||||||
|
},
|
||||||
|
SmpSavePlacedStructureRecordTripletEntryProbe {
|
||||||
|
record_index: 1,
|
||||||
|
primary_name: "StationA".to_string(),
|
||||||
|
secondary_name: "StationSetA".to_string(),
|
||||||
|
name_tag_relative_offset: 0x40,
|
||||||
|
policy_tag_relative_offset: 0x50,
|
||||||
|
profile_tag_relative_offset: 0x6e,
|
||||||
|
policy_chunk_len: 0x1a,
|
||||||
|
profile_chunk_len: 0x10,
|
||||||
|
policy_f32_lane_0: 0.0,
|
||||||
|
policy_f32_lane_1: 0.0,
|
||||||
|
policy_f32_lane_2: 0.0,
|
||||||
|
policy_f32_lane_3: 0.0,
|
||||||
|
policy_f32_lane_4: 0.0,
|
||||||
|
policy_reserved_dword: 0,
|
||||||
|
policy_trailing_word: 1,
|
||||||
|
policy_trailing_word_hex: "0x0001".to_string(),
|
||||||
|
profile_open_marker: 0x00005dc1,
|
||||||
|
profile_open_marker_hex: "0x00005dc1".to_string(),
|
||||||
|
profile_repeated_primary_name: "StationA".to_string(),
|
||||||
|
profile_repeated_secondary_name: "StationSetA".to_string(),
|
||||||
|
profile_footer_relative_offset: 0x08,
|
||||||
|
profile_footer_relative_offset_hex: "0x8".to_string(),
|
||||||
|
profile_pre_footer_padding_len: 1,
|
||||||
|
profile_pre_footer_padding_hex_bytes: vec!["0x07".to_string()],
|
||||||
|
profile_companion_byte_u8: Some(7),
|
||||||
|
profile_companion_byte_hex: Some("0x07".to_string()),
|
||||||
|
profile_payload_dword: 0x00005dc1,
|
||||||
|
profile_payload_dword_hex: "0x00005dc1".to_string(),
|
||||||
|
profile_sentinel_i32: 0,
|
||||||
|
profile_status_kind: "opaque_nondefault".to_string(),
|
||||||
|
farm_growth_stage_index: None,
|
||||||
|
profile_close_marker: 0x00005dc2,
|
||||||
|
profile_close_marker_hex: "0x00005dc2".to_string(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
evidence: vec![],
|
||||||
|
});
|
||||||
|
|
||||||
|
let slice = load_save_slice_from_report(&report).expect("classic save slice");
|
||||||
|
let collection = slice
|
||||||
|
.placed_structure_collection
|
||||||
|
.expect("placed structure collection should project");
|
||||||
|
assert_eq!(
|
||||||
|
collection.source_kind,
|
||||||
|
"save-placed-structure-record-triplets"
|
||||||
|
);
|
||||||
|
assert_eq!(collection.observed_entry_count, 2);
|
||||||
|
assert_eq!(collection.entries[0].primary_name, "FarmCorn");
|
||||||
|
assert_eq!(collection.entries[0].farm_growth_stage_index, Some(4));
|
||||||
|
assert_eq!(collection.entries[1].profile_companion_byte_u8, Some(7));
|
||||||
|
assert!(slice.notes.iter().any(|line| {
|
||||||
|
line.contains("placed-structure triplet rows as first-class context")
|
||||||
|
&& line.contains("2")
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn loads_rt3_105_save_slice_from_report() {
|
fn loads_rt3_105_save_slice_from_report() {
|
||||||
let mut report = inspect_smp_bytes(&[]);
|
let mut report = inspect_smp_bytes(&[]);
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,9 @@ Working rule:
|
||||||
to drive the proximity scan
|
to drive the proximity scan
|
||||||
- whether the acquisition branch can be rehosted as a shellless sibling beside the already
|
- whether the acquisition branch can be rehosted as a shellless sibling beside the already
|
||||||
grounded annual-finance helper
|
grounded annual-finance helper
|
||||||
|
- the save-side `0x36b1/0x36b2/0x36b3` triplet seam is now also loaded into the checked-in
|
||||||
|
save-slice model as first-class `placed_structure_collection` context, carrying stem pairs plus
|
||||||
|
grounded footer/policy status lanes instead of remaining inspection-only evidence
|
||||||
- Direct disassembly now narrows that acquisition strip further:
|
- Direct disassembly now narrows that acquisition strip further:
|
||||||
- `0x004014b0` scans the live placed-structure collection at `0x0062b26c`
|
- `0x004014b0` scans the live placed-structure collection at `0x0062b26c`
|
||||||
- `0x0041f6e0 -> 0x0042b2d0` is the center-cell token gate over the current region
|
- `0x0041f6e0 -> 0x0042b2d0` is the center-cell token gate over the current region
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue