//! Timed operation system for tactical navigation. //! //! Handles operations with durations like undocking, travel, docking, and mining. //! Operations have progress tracking and fire completion events when done. use bevy::prelude::*; /// Active operation with timing information. #[derive(Component, Debug, Clone)] pub struct ActiveOperation { pub kind: OperationKind, pub started_at: f64, pub duration_ms: f64, pub target_name: String, } /// Kinds of operations that can be active. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum OperationKind { Undocking, Travel, Docking, Mining, Refining, Fitting, Combat, } /// Event fired when an operation completes. #[derive(Event, Debug, Clone)] pub struct OperationCompletedEvent { pub kind: OperationKind, pub entity: Entity, } /// Event fired when an operation is started. #[derive(Event, Debug)] pub struct OperationStartedEvent { pub kind: OperationKind, pub duration_ms: f64, pub target_name: String, } /// Resource for operation duration constants. #[derive(Resource, Debug, Clone)] pub struct OperationDurations { pub undock: f64, pub local_travel: f64, pub docking: f64, pub mining: f64, } impl Default for OperationDurations { fn default() -> Self { Self { undock: 3000.0, // 3 seconds local_travel: 5000.0, // 5 seconds docking: 4000.0, // 4 seconds mining: 8000.0, // 8 seconds } } } /// Plugin for timed operation system. pub struct TimedOperationPlugin; impl Plugin for TimedOperationPlugin { fn build(&self, app: &mut App) { app.init_resource::() .add_event::() .add_event::() .add_systems( Update, ( monitor_operations, update_operation_progress, ).run_if(in_state(crate::state::AppState::InGame)), ); } } /// Monitor active operations and fire completion events when done. fn monitor_operations( time: Res