use serde::{Deserialize, Serialize}; use crate::{CalendarPoint, RuntimeState}; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct RuntimeSummary { pub calendar: CalendarPoint, pub calendar_projection_source: Option, pub calendar_projection_is_placeholder: bool, pub world_flag_count: usize, pub world_restore_selected_year_profile_lane: Option, pub world_restore_campaign_scenario_enabled: Option, pub world_restore_sandbox_enabled: Option, pub world_restore_seed_tuple_written_from_raw_lane: Option, pub world_restore_absolute_counter_requires_shell_context: Option, pub world_restore_absolute_counter_reconstructible_from_save: Option, pub world_restore_disable_cargo_economy_special_condition_slot: Option, pub world_restore_disable_cargo_economy_special_condition_reconstructible_from_save: Option, pub world_restore_disable_cargo_economy_special_condition_write_side_grounded: Option, pub world_restore_disable_cargo_economy_special_condition_enabled: Option, pub world_restore_use_bio_accelerator_cars_enabled: Option, pub world_restore_use_wartime_cargos_enabled: Option, pub world_restore_disable_train_crashes_enabled: Option, pub world_restore_disable_train_crashes_and_breakdowns_enabled: Option, pub world_restore_ai_ignore_territories_at_startup_enabled: Option, pub world_restore_absolute_counter_restore_kind: Option, pub world_restore_absolute_counter_adjustment_context: Option, pub metadata_count: usize, pub company_count: usize, pub event_runtime_record_count: usize, pub candidate_availability_count: usize, pub zero_candidate_availability_count: usize, pub special_condition_count: usize, pub enabled_special_condition_count: usize, pub save_profile_kind: Option, pub save_profile_family: Option, pub save_profile_map_path: Option, pub save_profile_display_name: Option, pub save_profile_selected_year_profile_lane: Option, pub save_profile_sandbox_enabled: Option, pub save_profile_campaign_scenario_enabled: Option, pub save_profile_staged_profile_copy_on_restore: Option, pub total_event_record_service_count: u64, pub periodic_boundary_call_count: u64, pub total_trigger_dispatch_count: u64, pub dirty_rerun_count: u64, pub total_company_cash: i64, } impl RuntimeSummary { pub fn from_state(state: &RuntimeState) -> Self { Self { calendar: state.calendar, calendar_projection_source: state.metadata.get("save_slice.calendar_source").cloned(), calendar_projection_is_placeholder: state .metadata .get("save_slice.calendar_source") .is_some_and(|value| value == "default-1830-placeholder"), world_flag_count: state.world_flags.len(), world_restore_selected_year_profile_lane: state .world_restore .selected_year_profile_lane, world_restore_campaign_scenario_enabled: state.world_restore.campaign_scenario_enabled, world_restore_sandbox_enabled: state.world_restore.sandbox_enabled, world_restore_seed_tuple_written_from_raw_lane: state .world_restore .seed_tuple_written_from_raw_lane, world_restore_absolute_counter_requires_shell_context: state .world_restore .absolute_counter_requires_shell_context, world_restore_absolute_counter_reconstructible_from_save: state .world_restore .absolute_counter_reconstructible_from_save, world_restore_disable_cargo_economy_special_condition_slot: state .world_restore .disable_cargo_economy_special_condition_slot, world_restore_disable_cargo_economy_special_condition_reconstructible_from_save: state .world_restore .disable_cargo_economy_special_condition_reconstructible_from_save, world_restore_disable_cargo_economy_special_condition_write_side_grounded: state .world_restore .disable_cargo_economy_special_condition_write_side_grounded, world_restore_disable_cargo_economy_special_condition_enabled: state .world_restore .disable_cargo_economy_special_condition_enabled, world_restore_use_bio_accelerator_cars_enabled: state .world_restore .use_bio_accelerator_cars_enabled, world_restore_use_wartime_cargos_enabled: state .world_restore .use_wartime_cargos_enabled, world_restore_disable_train_crashes_enabled: state .world_restore .disable_train_crashes_enabled, world_restore_disable_train_crashes_and_breakdowns_enabled: state .world_restore .disable_train_crashes_and_breakdowns_enabled, world_restore_ai_ignore_territories_at_startup_enabled: state .world_restore .ai_ignore_territories_at_startup_enabled, world_restore_absolute_counter_restore_kind: state .world_restore .absolute_counter_restore_kind .clone(), world_restore_absolute_counter_adjustment_context: state .world_restore .absolute_counter_adjustment_context .clone(), metadata_count: state.metadata.len(), company_count: state.companies.len(), event_runtime_record_count: state.event_runtime_records.len(), candidate_availability_count: state.candidate_availability.len(), zero_candidate_availability_count: state .candidate_availability .values() .filter(|value| **value == 0) .count(), special_condition_count: state.special_conditions.len(), enabled_special_condition_count: state .special_conditions .values() .filter(|value| **value != 0) .count(), save_profile_kind: state.save_profile.profile_kind.clone(), save_profile_family: state.save_profile.profile_family.clone(), save_profile_map_path: state.save_profile.map_path.clone(), save_profile_display_name: state.save_profile.display_name.clone(), save_profile_selected_year_profile_lane: state.save_profile.selected_year_profile_lane, save_profile_sandbox_enabled: state.save_profile.sandbox_enabled, save_profile_campaign_scenario_enabled: state.save_profile.campaign_scenario_enabled, save_profile_staged_profile_copy_on_restore: state .save_profile .staged_profile_copy_on_restore, total_event_record_service_count: state.service_state.total_event_record_services, periodic_boundary_call_count: state.service_state.periodic_boundary_calls, total_trigger_dispatch_count: state .service_state .trigger_dispatch_counts .values() .sum(), dirty_rerun_count: state.service_state.dirty_rerun_count, total_company_cash: state .companies .iter() .map(|company| company.current_cash) .sum(), } } }