use bevy::ecs::{ query::{With, Without}, system::{Commands, Query, Resource}, }; use clap::Parser; use guardian_commands::{ConsoleCommand, NamedCommand}; use guardian_core::{components::*, dcs::text::TextMessage, srs::voice::VoiceMessage}; use tracing::debug; use crate::braa::Braa; #[derive(Parser, Debug)] pub struct BogeyDope; impl NamedCommand for BogeyDope { fn name() -> &'static str { "[shopping|bogey dope]" } } impl Resource for BogeyDope {} pub fn bogey_dope( mut commands: Commands, mut cmd: ConsoleCommand, awacs: Query<&Callsign>, player: Query<(&Callsign, &Position)>, npc: Query<(&Position, &Heading, &Velocity), (Without, With)>, ) { let Some(Ok(BogeyDope)) = cmd.take() else { return; }; let Some(pilot) = &cmd.pilot else { return; // no pilot }; let Some(operator) = &cmd.operator else { return; }; let Ok((p_callsign, p_pos)) = player.get(*pilot) else { debug!("no player, died?"); return; }; let Ok(a_callsign) = awacs.get(*operator) else { debug!("no awacs, they died?"); return; }; let mut distance: f64 = f64::MAX; let mut n = (None, None); for (n_pos, n_heading, n_velocity) in npc.iter() { if n_velocity.speed() < 10.0 { // ignore slow/on-ground units continue; } let d = p_pos.distance_to_nmi(n_pos); if d < distance { distance = d; n = (Some(n_pos), Some(n_heading)); } } let (Some(n_position), Some(n_heading)) = n else { let message = format!("{}, {}, {}", p_callsign, a_callsign, "Skies are clear"); let voice_message = format!( "{} . . . {} . . . {}", p_callsign.to_voice(), a_callsign.to_voice(), "Skies are clear" ); commands.entity(*pilot).insert(TextMessage::new(message)); commands .entity(*operator) .insert(VoiceMessage::new(voice_message)); return; }; let bra = Braa::new(p_pos, n_position, n_heading); let message = format!("{}, {}, {}", p_callsign, a_callsign, bra); let voice_message = format!( "{} . . . {} . . . {}", p_callsign.to_voice(), a_callsign.to_voice(), bra.to_voice() ); commands.entity(*pilot).insert(TextMessage::new(message)); commands .entity(*operator) .insert(VoiceMessage::new(voice_message)); }