From 9d8bf0fde7b12fa77569333d17f310e55df58db9 Mon Sep 17 00:00:00 2001 From: Alexander Foremny Date: Tue, 19 Mar 2024 06:52:42 +0100 Subject: feat: focus ability --- src/shared/ability.rs | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) (limited to 'src/shared/ability.rs') diff --git a/src/shared/ability.rs b/src/shared/ability.rs index 4d45a4d..b841661 100644 --- a/src/shared/ability.rs +++ b/src/shared/ability.rs @@ -1,3 +1,5 @@ +use crate::server::entity_map::*; +use crate::shared::buffs::*; use crate::shared::player::*; use crate::shared::projectile::*; use crate::shared::*; @@ -55,14 +57,93 @@ impl TargetedAbility { #[derive(Copy, Clone, PartialEq, Debug, Deserialize, Serialize)] pub enum ActivatedAbility { + Focus(Focus), + Haste(Haste), Speed(Speed), } +#[derive(Copy, Clone, PartialEq, Debug, Deserialize, Serialize)] +pub struct Focus { + pub duration: f32, +} + +#[derive(Copy, Clone, PartialEq, Debug, Deserialize, Serialize)] +pub struct Haste { + pub duration: f32, +} + #[derive(Copy, Clone, PartialEq, Debug, Deserialize, Serialize)] pub struct Speed { pub duration: f32, } +pub type ActivatedAbilityActivation = Box ()>; + +impl ActivatedAbility { + pub fn activate(self) -> ActivatedAbilityActivation { + match self { + ActivatedAbility::Focus(focus) => focus_activation(focus), + ActivatedAbility::Haste(haste) => haste_activation(haste), + ActivatedAbility::Speed(speed) => speed_activation(speed), + } + } +} + +fn speed_activation(speed: Speed) -> ActivatedAbilityActivation { + Box::new(move |commands: &mut Commands, source_id: PlayerId| { + commands.add(move |world: &mut World| { + world.run_system_once( + move |entity_map: Res, mut buffses: Query<&mut Buffs>| { + let Some(entity_id) = entity_map.0.get(&source_id.0) else { + return; + }; + let Ok(mut buffs) = buffses.get_mut(*entity_id) else { + return; + }; + buffs.speed = Some(Timer::from_seconds(speed.duration, TimerMode::Once)); + }, + ) + }); + }) +} + +fn haste_activation(haste: Haste) -> ActivatedAbilityActivation { + Box::new(move |commands: &mut Commands, source_id: PlayerId| { + commands.add(move |world: &mut World| { + world.run_system_once( + move |entity_map: Res, mut buffses: Query<&mut Buffs>| { + let Some(entity_id) = entity_map.0.get(&source_id.0) else { + return; + }; + let Ok(mut buffs) = buffses.get_mut(*entity_id) else { + return; + }; + buffs.haste = Some(Timer::from_seconds(haste.duration, TimerMode::Once)); + }, + ) + }); + }) +} + +fn focus_activation(focus: Focus) -> ActivatedAbilityActivation { + Box::new(move |commands: &mut Commands, source_id: PlayerId| { + commands.add(move |world: &mut World| { + world.run_system_once( + move |entity_map: Res, mut buffses: Query<&mut Buffs>| { + let Some(entity_id) = entity_map.0.get(&source_id.0) else { + return; + }; + let Ok(mut buffs) = buffses.get_mut(*entity_id) else { + return; + }; + buffs.haste = Some(Timer::from_seconds(focus.duration, TimerMode::Once)); + buffs.speed = Some(Timer::from_seconds(focus.duration, TimerMode::Once)); + }, + ) + }); + }) +} + #[derive(Copy, Clone, PartialEq, Debug, Deserialize, Serialize)] pub enum DirectionalAbility { Dash(Dash), -- cgit v1.2.3