From 09a3729b5d45fcb27ddfe471afe3fb1c81f79388 Mon Sep 17 00:00:00 2001 From: S Handley Date: Fri, 21 Feb 2020 02:56:54 +0000 Subject: [PATCH] Add weapon wield/unwield sfx support --- CHANGELOG.md | 1 + assets/voxygen/audio/sfx.ron | 12 + assets/voxygen/audio/sfx/weapon/sword_in.wav | Bin 0 -> 87596 bytes assets/voxygen/audio/sfx/weapon/sword_out.wav | Bin 0 -> 64556 bytes common/src/event.rs | 11 +- .../src/audio/sfx/event_mapper/movement.rs | 399 ----------------- .../audio/sfx/event_mapper/movement/mod.rs | 207 +++++++++ .../audio/sfx/event_mapper/movement/tests.rs | 419 ++++++++++++++++++ 8 files changed, 641 insertions(+), 408 deletions(-) create mode 100644 assets/voxygen/audio/sfx/weapon/sword_in.wav create mode 100644 assets/voxygen/audio/sfx/weapon/sword_out.wav delete mode 100644 voxygen/src/audio/sfx/event_mapper/movement.rs create mode 100644 voxygen/src/audio/sfx/event_mapper/movement/mod.rs create mode 100644 voxygen/src/audio/sfx/event_mapper/movement/tests.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index f1dc7924ad..086125408c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Tanslation status tracking - Added gamma setting - Added new orc hairstyles +- Added sfx for wielding/unwielding weapons ### Changed diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index 8310f26c09..38349f287e 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -23,5 +23,17 @@ ], threshold: 0.5, ), + Wield(Sword): ( + files: [ + "voxygen.audio.sfx.weapon.sword_out", + ], + threshold: 0.5, + ), + Unwield(Sword): ( + files: [ + "voxygen.audio.sfx.weapon.sword_in", + ], + threshold: 0.5, + ), } ) \ No newline at end of file diff --git a/assets/voxygen/audio/sfx/weapon/sword_in.wav b/assets/voxygen/audio/sfx/weapon/sword_in.wav new file mode 100644 index 0000000000000000000000000000000000000000..1f35cc955e37381e31b3548d3577a71b7a13922d GIT binary patch literal 87596 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 H{`>y`lP#Uf literal 0 HcmV?d00001 diff --git a/assets/voxygen/audio/sfx/weapon/sword_out.wav b/assets/voxygen/audio/sfx/weapon/sword_out.wav new file mode 100644 index 0000000000000000000000000000000000000000..02e9e10f858d60732c102fca86b0ca5ad747cb01 GIT binary patch literal 64556 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 z%0D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�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

;5@kSU6K4C3Vw|4 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 literal 0 HcmV?d00001 diff --git a/common/src/event.rs b/common/src/event.rs index 919ca04c45..d06f912a7b 100644 --- a/common/src/event.rs +++ b/common/src/event.rs @@ -20,11 +20,6 @@ impl SfxEventItem { #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Hash, Eq)] pub enum SfxEvent { Idle, - PlaceBlock, - RemoveBlock, - OpenChest, - ChatTellReceived, - OpenBag, Run, Roll, Climb, @@ -36,10 +31,8 @@ pub enum SfxEvent { Fall, ExperienceGained, LevelUp, - LightLantern, - ExtinguishLantern, - Attack(Tool), - AttackWolf, + Wield(Tool), + Unwield(Tool), } pub enum LocalEvent { diff --git a/voxygen/src/audio/sfx/event_mapper/movement.rs b/voxygen/src/audio/sfx/event_mapper/movement.rs deleted file mode 100644 index 4a1c96934b..0000000000 --- a/voxygen/src/audio/sfx/event_mapper/movement.rs +++ /dev/null @@ -1,399 +0,0 @@ -/// event_mapper::movement watches all local entities movements and determines -/// which sfx to emit, and the position at which the sound should be emitted -/// from -use crate::audio::sfx::{SfxTriggerItem, SfxTriggers}; - -use client::Client; -use common::{ - comp::{ActionState, Body, CharacterState, MovementState, Pos, Vel}, - event::{EventBus, SfxEvent, SfxEventItem}, -}; -use hashbrown::HashMap; -use specs::{Entity as EcsEntity, Join, WorldExt}; -use std::time::{Duration, Instant}; -use vek::*; - -#[derive(Clone)] -struct LastSfxEvent { - event: SfxEvent, - time: Instant, -} - -pub struct MovementEventMapper { - event_history: HashMap, -} - -impl MovementEventMapper { - pub fn new() -> Self { - Self { - event_history: HashMap::new(), - } - } - - pub fn maintain(&mut self, client: &Client, triggers: &SfxTriggers) { - const SFX_DIST_LIMIT_SQR: f32 = 22500.0; - let ecs = client.state().ecs(); - - let player_position = ecs - .read_storage::() - .get(client.entity()) - .map_or(Vec3::zero(), |pos| pos.0); - - for (entity, pos, vel, body, character) in ( - &ecs.entities(), - &ecs.read_storage::(), - &ecs.read_storage::(), - &ecs.read_storage::(), - ecs.read_storage::().maybe(), - ) - .join() - .filter(|(_, e_pos, ..)| { - (e_pos.0.distance_squared(player_position)) < SFX_DIST_LIMIT_SQR - }) - { - if let Some(character) = character { - let state = self - .event_history - .entry(entity) - .or_insert_with(|| LastSfxEvent { - event: SfxEvent::Idle, - time: Instant::now(), - }); - - let mapped_event = match body { - Body::Humanoid(_) => { - Self::map_movement_event(character, state.event.clone(), vel.0) - }, - Body::QuadrupedMedium(_) => { - // TODO: Quadriped running sfx - SfxEvent::Idle - }, - _ => SfxEvent::Idle, - }; - - // Check for SFX config entry for this movement - if Self::should_emit(state, triggers.get_key_value(&mapped_event)) { - ecs.read_resource::>() - .emitter() - .emit(SfxEventItem::new(mapped_event, Some(pos.0))); - - // Update the last play time - state.event = mapped_event; - state.time = Instant::now(); - } else { - // Keep the last event, it may not have an SFX trigger but it helps us determine - // the next one - state.event = mapped_event; - } - } - } - - self.cleanup(client.entity()); - } - - /// As the player explores the world, we track the last event of the nearby - /// entities to determine the correct SFX item to play next based on - /// their activity. `cleanup` will remove entities from event tracking if - /// they have not triggered an event for > n seconds. This prevents - /// stale records from bloating the Map size. - fn cleanup(&mut self, player: EcsEntity) { - const TRACKING_TIMEOUT: u64 = 15; - - let now = Instant::now(); - self.event_history.retain(|entity, event| { - now.duration_since(event.time) < Duration::from_secs(TRACKING_TIMEOUT) - || entity.id() == player.id() - }); - } - - /// When specific entity movements are detected, the associated sound (if - /// any) needs to satisfy two conditions to be allowed to play: - /// 1. An sfx.ron entry exists for the movement (we need to know which sound - /// file(s) to play) 2. The sfx has not been played since it's timeout - /// threshold has elapsed, which prevents firing every tick - fn should_emit( - last_play_entry: &LastSfxEvent, - sfx_trigger_item: Option<(&SfxEvent, &SfxTriggerItem)>, - ) -> bool { - if let Some((event, item)) = sfx_trigger_item { - if &last_play_entry.event == event { - last_play_entry.time.elapsed().as_secs_f64() >= item.threshold - } else { - true - } - } else { - false - } - } - - /// Voxygen has an existing list of character states via `MovementState::*` - /// and `ActionState::*` however that list does not provide enough - /// resolution to target specific entity events, such as opening or - /// closing the glider. These methods translate those entity states with - /// some additional data into more specific `SfxEvent`'s which we attach - /// sounds to - fn map_movement_event( - current_event: &CharacterState, - previous_event: SfxEvent, - vel: Vec3, - ) -> SfxEvent { - match (current_event.movement, current_event.action, previous_event) { - (_, ActionState::Roll { .. }, _) => SfxEvent::Roll, - (MovementState::Climb, ..) => SfxEvent::Climb, - (MovementState::Swim, ..) => SfxEvent::Swim, - (MovementState::Run, ..) => { - // If the entitys's velocity is very low, they may be stuck, or walking into a - // solid object. We should not trigger the run SFX in this case, - // even if their move state indicates running. The 0.1 value is - // an approximation from playtesting scenarios where this can occur. - if vel.magnitude() > 0.1 { - SfxEvent::Run - } else { - SfxEvent::Idle - } - }, - (MovementState::Jump, ..) => SfxEvent::Jump, - (MovementState::Fall, _, SfxEvent::Glide) => SfxEvent::GliderClose, - (MovementState::Stand, _, SfxEvent::Fall) => SfxEvent::Run, - (MovementState::Fall, _, SfxEvent::Jump) => SfxEvent::Idle, - (MovementState::Fall, _, _) => SfxEvent::Fall, - (MovementState::Glide, _, previous_event) => { - if previous_event != SfxEvent::GliderOpen && previous_event != SfxEvent::Glide { - SfxEvent::GliderOpen - } else { - SfxEvent::Glide - } - }, - (MovementState::Stand, _, SfxEvent::Glide) => SfxEvent::GliderClose, - _ => SfxEvent::Idle, - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use common::{ - comp::{ActionState, MovementState}, - event::SfxEvent, - }; - use std::time::{Duration, Instant}; - - #[test] - fn no_item_config_no_emit() { - let last_sfx_event = LastSfxEvent { - event: SfxEvent::Idle, - time: Instant::now(), - }; - - let result = MovementEventMapper::should_emit(&last_sfx_event, None); - - assert_eq!(result, false); - } - - #[test] - fn config_but_played_since_threshold_no_emit() { - let event = SfxEvent::Run; - - let trigger_item = SfxTriggerItem { - files: vec![String::from("some.path.to.sfx.file")], - threshold: 1.0, - }; - - // Triggered a 'Run' 0 seconds ago - let last_sfx_event = LastSfxEvent { - event: SfxEvent::Run, - time: Instant::now(), - }; - - let result = - MovementEventMapper::should_emit(&last_sfx_event, Some((&event, &trigger_item))); - - assert_eq!(result, false); - } - - #[test] - fn config_and_not_played_since_threshold_emits() { - let event = SfxEvent::Run; - - let trigger_item = SfxTriggerItem { - files: vec![String::from("some.path.to.sfx.file")], - threshold: 0.5, - }; - - let last_sfx_event = LastSfxEvent { - event: SfxEvent::Idle, - time: Instant::now().checked_add(Duration::from_secs(1)).unwrap(), - }; - - let result = - MovementEventMapper::should_emit(&last_sfx_event, Some((&event, &trigger_item))); - - assert_eq!(result, true); - } - - #[test] - fn same_previous_event_elapsed_emits() { - let event = SfxEvent::Run; - - let trigger_item = SfxTriggerItem { - files: vec![String::from("some.path.to.sfx.file")], - threshold: 0.5, - }; - - let last_sfx_event = LastSfxEvent { - event: SfxEvent::Run, - time: Instant::now() - .checked_sub(Duration::from_millis(500)) - .unwrap(), - }; - - let result = - MovementEventMapper::should_emit(&last_sfx_event, Some((&event, &trigger_item))); - - assert_eq!(result, true); - } - - #[test] - fn maps_idle() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Stand, - action: ActionState::Idle, - }, - SfxEvent::Idle, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::Idle); - } - - #[test] - fn maps_run_with_sufficient_velocity() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Run, - action: ActionState::Idle, - }, - SfxEvent::Idle, - Vec3::new(0.5, 0.8, 0.0), - ); - - assert_eq!(result, SfxEvent::Run); - } - - #[test] - fn does_not_map_run_with_insufficient_velocity() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Run, - action: ActionState::Idle, - }, - SfxEvent::Idle, - Vec3::new(0.02, 0.0001, 0.0), - ); - - assert_eq!(result, SfxEvent::Idle); - } - - #[test] - fn maps_roll() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - action: ActionState::Roll { - time_left: Duration::new(1, 0), - was_wielding: false, - }, - movement: MovementState::Run, - }, - SfxEvent::Run, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::Roll); - } - - #[test] - fn maps_fall() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Fall, - action: ActionState::Idle, - }, - SfxEvent::Fall, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::Fall); - } - - #[test] - fn maps_land_on_ground_to_run() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Stand, - action: ActionState::Idle, - }, - SfxEvent::Fall, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::Run); - } - - #[test] - fn maps_glider_open() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Glide, - action: ActionState::Idle, - }, - SfxEvent::Jump, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::GliderOpen); - } - - #[test] - fn maps_glide() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Glide, - action: ActionState::Idle, - }, - SfxEvent::Glide, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::Glide); - } - - #[test] - fn maps_glider_close_when_closing_mid_flight() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Fall, - action: ActionState::Idle, - }, - SfxEvent::Glide, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::GliderClose); - } - - #[test] - fn maps_glider_close_when_landing() { - let result = MovementEventMapper::map_movement_event( - &CharacterState { - movement: MovementState::Stand, - action: ActionState::Idle, - }, - SfxEvent::Glide, - Vec3::zero(), - ); - - assert_eq!(result, SfxEvent::GliderClose); - } -} diff --git a/voxygen/src/audio/sfx/event_mapper/movement/mod.rs b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs new file mode 100644 index 0000000000..8c4581c00c --- /dev/null +++ b/voxygen/src/audio/sfx/event_mapper/movement/mod.rs @@ -0,0 +1,207 @@ +/// event_mapper::movement watches all local entities movements and determines +/// which sfx to emit, and the position at which the sound should be emitted +/// from +use crate::audio::sfx::{SfxTriggerItem, SfxTriggers}; + +use client::Client; +use common::{ + comp::{ActionState, Body, CharacterState, Item, ItemKind, MovementState, Pos, Stats, Vel}, + event::{EventBus, SfxEvent, SfxEventItem}, +}; +use hashbrown::HashMap; +use specs::{Entity as EcsEntity, Join, WorldExt}; +use std::time::{Duration, Instant}; +use vek::*; + +#[derive(Clone)] +struct LastSfxEvent { + event: SfxEvent, + weapon_drawn: bool, + time: Instant, +} + +pub struct MovementEventMapper { + event_history: HashMap, +} + +impl MovementEventMapper { + pub fn new() -> Self { + Self { + event_history: HashMap::new(), + } + } + + pub fn maintain(&mut self, client: &Client, triggers: &SfxTriggers) { + const SFX_DIST_LIMIT_SQR: f32 = 22500.0; + let ecs = client.state().ecs(); + + let player_position = ecs + .read_storage::() + .get(client.entity()) + .map_or(Vec3::zero(), |pos| pos.0); + + for (entity, pos, vel, body, stats, character) in ( + &ecs.entities(), + &ecs.read_storage::(), + &ecs.read_storage::(), + &ecs.read_storage::(), + &ecs.read_storage::(), + ecs.read_storage::().maybe(), + ) + .join() + .filter(|(_, e_pos, ..)| { + (e_pos.0.distance_squared(player_position)) < SFX_DIST_LIMIT_SQR + }) + { + if let Some(character) = character { + let state = self + .event_history + .entry(entity) + .or_insert_with(|| LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now(), + }); + + let mapped_event = match body { + Body::Humanoid(_) => Self::map_movement_event(character, state, vel.0, stats), + Body::QuadrupedMedium(_) => { + // TODO: Quadriped running sfx + SfxEvent::Idle + }, + _ => SfxEvent::Idle, + }; + + // Check for SFX config entry for this movement + if Self::should_emit(state, triggers.get_key_value(&mapped_event)) { + ecs.read_resource::>() + .emitter() + .emit(SfxEventItem::new(mapped_event, Some(pos.0))); + + // Update the last play time + state.event = mapped_event; + state.time = Instant::now(); + state.weapon_drawn = Self::has_weapon_drawn(character.action); + } else { + // Keep the last event, it may not have an SFX trigger but it helps us determine + // the next one + state.event = mapped_event; + } + } + } + + self.cleanup(client.entity()); + } + + /// As the player explores the world, we track the last event of the nearby + /// entities to determine the correct SFX item to play next based on + /// their activity. `cleanup` will remove entities from event tracking if + /// they have not triggered an event for > n seconds. This prevents + /// stale records from bloating the Map size. + fn cleanup(&mut self, player: EcsEntity) { + const TRACKING_TIMEOUT: u64 = 15; + + let now = Instant::now(); + self.event_history.retain(|entity, event| { + now.duration_since(event.time) < Duration::from_secs(TRACKING_TIMEOUT) + || entity.id() == player.id() + }); + } + + /// When specific entity movements are detected, the associated sound (if + /// any) needs to satisfy two conditions to be allowed to play: + /// 1. An sfx.ron entry exists for the movement (we need to know which sound + /// file(s) to play) 2. The sfx has not been played since it's timeout + /// threshold has elapsed, which prevents firing every tick + fn should_emit( + last_play_entry: &LastSfxEvent, + sfx_trigger_item: Option<(&SfxEvent, &SfxTriggerItem)>, + ) -> bool { + if let Some((event, item)) = sfx_trigger_item { + if &last_play_entry.event == event { + last_play_entry.time.elapsed().as_secs_f64() >= item.threshold + } else { + true + } + } else { + false + } + } + + /// Voxygen has an existing list of character states via `MovementState::*` + /// and `ActionState::*` however that list does not provide enough + /// resolution to target specific entity events, such as opening or + /// closing the glider. These methods translate those entity states with + /// some additional data into more specific `SfxEvent`'s which we attach + /// sounds to + fn map_movement_event( + current_event: &CharacterState, + previous_event: &LastSfxEvent, + vel: Vec3, + stats: &Stats, + ) -> SfxEvent { + // Handle any weapon wielding changes up front. Doing so here first simplifies + // handling the movement/action state later, since they don't require querying + // stats or previous wield state. + if let Some(Item { + kind: ItemKind::Tool { kind, .. }, + .. + }) = stats.equipment.main + { + if let Some(wield_event) = match ( + previous_event.weapon_drawn, + Self::has_weapon_drawn(current_event.action), + ) { + (false, true) => Some(SfxEvent::Wield(kind)), + (true, false) => Some(SfxEvent::Unwield(kind)), + _ => None, + } { + return wield_event; + } + } + + // Match all other Movemement and Action states + match ( + current_event.movement, + current_event.action, + previous_event.event, + ) { + (_, ActionState::Roll { .. }, _) => SfxEvent::Roll, + (MovementState::Climb, ..) => SfxEvent::Climb, + (MovementState::Swim, ..) => SfxEvent::Swim, + (MovementState::Run, ..) => { + // If the entitys's velocity is very low, they may be stuck, or walking into a + // solid object. We should not trigger the run SFX in this case, + // even if their move state indicates running. The 0.1 value is + // an approximation from playtesting scenarios where this can occur. + if vel.magnitude() > 0.1 { + SfxEvent::Run + } else { + SfxEvent::Idle + } + }, + (MovementState::Jump, ..) => SfxEvent::Jump, + (MovementState::Fall, _, SfxEvent::Glide) => SfxEvent::GliderClose, + (MovementState::Stand, _, SfxEvent::Fall) => SfxEvent::Run, + (MovementState::Fall, _, SfxEvent::Jump) => SfxEvent::Idle, + (MovementState::Fall, _, _) => SfxEvent::Fall, + (MovementState::Glide, _, previous_event) => { + if previous_event != SfxEvent::GliderOpen && previous_event != SfxEvent::Glide { + SfxEvent::GliderOpen + } else { + SfxEvent::Glide + } + }, + (MovementState::Stand, _, SfxEvent::Glide) => SfxEvent::GliderClose, + _ => SfxEvent::Idle, + } + } + + /// Returns true for any state where the player has their weapon drawn. This + /// helps us manage the wield/unwield sfx events + fn has_weapon_drawn(state: ActionState) -> bool { + state.is_wield() | state.is_attack() | state.is_block() | state.is_charge() + } +} + +#[cfg(test)] mod tests; diff --git a/voxygen/src/audio/sfx/event_mapper/movement/tests.rs b/voxygen/src/audio/sfx/event_mapper/movement/tests.rs new file mode 100644 index 0000000000..210f7fe2c1 --- /dev/null +++ b/voxygen/src/audio/sfx/event_mapper/movement/tests.rs @@ -0,0 +1,419 @@ +use super::*; +use common::{ + assets, + comp::{humanoid, item::Tool, ActionState, Body, MovementState, Stats}, + event::SfxEvent, +}; +use std::time::{Duration, Instant}; + +#[test] +fn no_item_config_no_emit() { + let last_sfx_event = LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now(), + }; + + let result = MovementEventMapper::should_emit(&last_sfx_event, None); + + assert_eq!(result, false); +} + +#[test] +fn config_but_played_since_threshold_no_emit() { + let event = SfxEvent::Run; + + let trigger_item = SfxTriggerItem { + files: vec![String::from("some.path.to.sfx.file")], + threshold: 1.0, + }; + + // Triggered a 'Run' 0 seconds ago + let last_sfx_event = LastSfxEvent { + event: SfxEvent::Run, + weapon_drawn: false, + time: Instant::now(), + }; + + let result = MovementEventMapper::should_emit(&last_sfx_event, Some((&event, &trigger_item))); + + assert_eq!(result, false); +} + +#[test] +fn config_and_not_played_since_threshold_emits() { + let event = SfxEvent::Run; + + let trigger_item = SfxTriggerItem { + files: vec![String::from("some.path.to.sfx.file")], + threshold: 0.5, + }; + + let last_sfx_event = LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now().checked_add(Duration::from_secs(1)).unwrap(), + }; + + let result = MovementEventMapper::should_emit(&last_sfx_event, Some((&event, &trigger_item))); + + assert_eq!(result, true); +} + +#[test] +fn same_previous_event_elapsed_emits() { + let event = SfxEvent::Run; + + let trigger_item = SfxTriggerItem { + files: vec![String::from("some.path.to.sfx.file")], + threshold: 0.5, + }; + + let last_sfx_event = LastSfxEvent { + event: SfxEvent::Run, + weapon_drawn: false, + time: Instant::now() + .checked_sub(Duration::from_millis(500)) + .unwrap(), + }; + + let result = MovementEventMapper::should_emit(&last_sfx_event, Some((&event, &trigger_item))); + + assert_eq!(result, true); +} + +#[test] +fn maps_idle() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Stand, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::Idle); +} + +#[test] +fn maps_run_with_sufficient_velocity() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Run, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::new(0.5, 0.8, 0.0), + &stats, + ); + + assert_eq!(result, SfxEvent::Run); +} + +#[test] +fn does_not_map_run_with_insufficient_velocity() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Run, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::new(0.02, 0.0001, 0.0), + &stats, + ); + + assert_eq!(result, SfxEvent::Idle); +} + +#[test] +fn maps_roll() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + action: ActionState::Roll { + time_left: Duration::new(1, 0), + was_wielding: false, + }, + movement: MovementState::Run, + }, + &LastSfxEvent { + event: SfxEvent::Run, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::Roll); +} + +#[test] +fn maps_fall() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Fall, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Fall, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::Fall); +} + +#[test] +fn maps_land_on_ground_to_run() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Stand, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Fall, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::Run); +} + +#[test] +fn maps_glider_open() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Glide, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Jump, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::GliderOpen); +} + +#[test] +fn maps_glide() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Glide, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Glide, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::Glide); +} + +#[test] +fn maps_glider_close_when_closing_mid_flight() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Fall, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Glide, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::GliderClose); +} + +#[test] +fn maps_glider_close_when_landing() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Stand, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Glide, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::GliderClose); +} + +#[test] +fn maps_wield() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + Some(assets::load_expect_cloned( + "common.items.weapons.starter_sword", + )), + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Stand, + action: ActionState::Wield { + time_left: Duration::from_millis(800), + }, + }, + &LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::Wield(Tool::Sword)); +} + +#[test] +fn maps_unwield() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + Some(assets::load_expect_cloned( + "common.items.weapons.starter_axe", + )), + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Stand, + action: ActionState::Idle, + }, + &LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: true, + time: Instant::now(), + }, + Vec3::zero(), + &stats, + ); + + assert_eq!(result, SfxEvent::Unwield(Tool::Axe)); +} + +#[test] +fn does_not_map_wield_when_no_main_weapon() { + let stats = Stats::new( + String::from("test"), + Body::Humanoid(humanoid::Body::random()), + None, + ); + + let result = MovementEventMapper::map_movement_event( + &CharacterState { + movement: MovementState::Run, + action: ActionState::Wield { + time_left: Duration::from_millis(600), + }, + }, + &LastSfxEvent { + event: SfxEvent::Idle, + weapon_drawn: false, + time: Instant::now(), + }, + Vec3::new(0.5, 0.8, 0.0), + &stats, + ); + + assert_eq!(result, SfxEvent::Run); +}