use crate::{ GameState, global_observer, heads::ActiveHeads, heads_database::HeadsDatabase, hitpoints::Hitpoints, loading_assets::AudioAssets, }; use bevy::prelude::*; #[derive(Component)] pub struct Healing(pub Entity); #[derive(Event, Debug)] pub enum HealingStateChanged { Started, Stopped, } pub fn plugin(app: &mut App) { app.add_systems(Update, update.run_if(in_state(GameState::Playing))); global_observer!(app, on_heal_start_stop); } fn on_heal_start_stop( trigger: Trigger, mut cmds: Commands, assets: Res, query: Query<&Healing>, ) { if matches!(trigger.event(), HealingStateChanged::Started) { let e = cmds .spawn(( Name::new("sfx-heal"), AudioPlayer::new(assets.healing.clone()), PlaybackSettings { mode: bevy::audio::PlaybackMode::Loop, ..Default::default() }, )) .id(); cmds.entity(trigger.target()) .add_child(e) .insert(Healing(e)); } else { if let Ok(healing) = query.single() { cmds.entity(healing.0).despawn(); } cmds.entity(trigger.target()).remove::(); } } fn update( mut query: Query<(&mut ActiveHeads, &mut Hitpoints), With>, time: Res