diff --git a/assets/all.headsdb.ron b/assets/all.headsdb.ron index 4bfe812..680e084 100644 --- a/assets/all.headsdb.ron +++ b/assets/all.headsdb.ron @@ -3,7 +3,7 @@ /*01*/(key:"carnival knife thrower", range:60, ammo:5), /*02*/(key:"chicago gangster", ability:Gun, ammo:25, range:60), /*03*/(key:"commando", ability:Gun, aps:7.4, ammo:26, range:60, damage:12), - /*04*/(key:"field medic"), + /*04*/(key:"field medic", ability:Medic, aps:20), /*05*/(key:"geisha"), /*06*/(key:"goblin", ability:Arrow, aps:2, ammo:5, range:90, damage:50), /*07*/(key:"green grocer", range:60, ammo:10, damage:25), diff --git a/assets/sfx/abilities/heal.ogg b/assets/sfx/abilities/heal.ogg index 688ab3b..ee32eb2 100644 Binary files a/assets/sfx/abilities/heal.ogg and b/assets/sfx/abilities/heal.ogg differ diff --git a/src/abilities/healing.rs b/src/abilities/healing.rs new file mode 100644 index 0000000..a2563a2 --- /dev/null +++ b/src/abilities/healing.rs @@ -0,0 +1,76 @@ +use bevy::prelude::*; + +use crate::{ + GameState, global_observer, heads::ActiveHeads, heads_database::HeadsDatabase, + hitpoints::Hitpoints, loading_assets::AudioAssets, +}; + +#[derive(Component)] +struct Healing(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