From b2672904c85e15be1bd46cbc7b3904ff54860bdf Mon Sep 17 00:00:00 2001 From: Alex Page Date: Tue, 1 Feb 2022 02:54:08 -0500 Subject: [PATCH] Add monster impact sfx --- src/components/monster.rs | 13 ++++++++++- src/resources/sound_effects.rs | 39 ++++++++++++++++++++++++-------- src/state.rs | 15 ++++++++---- src/systems/monster_ai_system.rs | 10 ++++++-- 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/src/components/monster.rs b/src/components/monster.rs index f254f50..7df8a42 100644 --- a/src/components/monster.rs +++ b/src/components/monster.rs @@ -1,4 +1,7 @@ -use crate::vga_color as vga; +use crate::{ + resources::{sound_output::SoundSamples, SoundEffects}, + vga_color as vga, +}; use bracket_lib::prelude::*; use specs::prelude::*; use specs_derive::Component; @@ -47,3 +50,11 @@ pub fn damage_for_kind(kind: MonsterKind) -> u32 { MonsterKind::Fast => 3, } } + +pub fn sound_effect_for_kind(kind: MonsterKind, sound_effects: &SoundEffects) -> SoundSamples { + match kind { + MonsterKind::Slow => sound_effects.slow_hit.clone(), + MonsterKind::Medium => sound_effects.medium_hit.clone(), + MonsterKind::Fast => sound_effects.fast_hit.clone(), + } +} diff --git a/src/resources/sound_effects.rs b/src/resources/sound_effects.rs index 58d2576..3868361 100644 --- a/src/resources/sound_effects.rs +++ b/src/resources/sound_effects.rs @@ -35,19 +35,22 @@ pub struct SoundEffects { pub whipping: SoundSamples, pub whipping_hit: SoundSamples, pub whipping_hit_end: SoundSamples, + pub slow_hit: SoundSamples, + pub medium_hit: SoundSamples, + pub fast_hit: SoundSamples, rng: RandomNumberGenerator, } impl SoundEffects { - pub fn new(ss: &SoundOutput) -> Self { + pub fn new(sound_output: &SoundOutput) -> Self { Self { - startup: ss.render_sound_effect(&SoundEffect { + startup: sound_output.render_sound_effect(&SoundEffect { sounds: vec![Sound { sound_type: SoundType::Sweep(1, 350), duration: Duration::from_secs(1), }], }), - step: ss.render_sound_effect(&SoundEffect { + step: sound_output.render_sound_effect(&SoundEffect { sounds: vec![ Sound { sound_type: SoundType::Noise(350, 900), @@ -63,7 +66,7 @@ impl SoundEffects { }, ], }), - pickup: ss.render_sound_effect(&SoundEffect { + pickup: sound_output.render_sound_effect(&SoundEffect { sounds: vec![ Sound { sound_type: SoundType::Noise(350, 900), @@ -79,7 +82,7 @@ impl SoundEffects { }, ], }), - bad_key: ss.render_sound_effect(&SoundEffect { + bad_key: sound_output.render_sound_effect(&SoundEffect { sounds: iter::once(Sound { sound_type: SoundType::Tone(540), duration: Duration::from_millis(40), @@ -98,7 +101,7 @@ impl SoundEffects { })) .collect(), }), - blocked: ss.render_sound_effect(&SoundEffect { + blocked: sound_output.render_sound_effect(&SoundEffect { sounds: (30..=60) .rev() .step_by(6) @@ -108,13 +111,13 @@ impl SoundEffects { }) .collect(), }), - whipping: ss.render_sound_effect(&SoundEffect { + whipping: sound_output.render_sound_effect(&SoundEffect { sounds: vec![Sound { sound_type: SoundType::Tone(70), duration: Duration::from_secs(3), }], }), - whipping_hit: ss.render_sound_effect(&SoundEffect { + whipping_hit: sound_output.render_sound_effect(&SoundEffect { sounds: vec![ Sound { sound_type: SoundType::Tone(400), @@ -126,12 +129,30 @@ impl SoundEffects { }, ], }), - whipping_hit_end: ss.render_sound_effect(&SoundEffect { + whipping_hit_end: sound_output.render_sound_effect(&SoundEffect { sounds: vec![Sound { sound_type: SoundType::Tone(400), duration: Duration::from_millis(20), }], }), + slow_hit: sound_output.render_sound_effect(&SoundEffect { + sounds: vec![Sound { + sound_type: SoundType::Tone(400), + duration: Duration::from_millis(25), + }], + }), + medium_hit: sound_output.render_sound_effect(&SoundEffect { + sounds: vec![Sound { + sound_type: SoundType::Tone(600), + duration: Duration::from_millis(25), + }], + }), + fast_hit: sound_output.render_sound_effect(&SoundEffect { + sounds: vec![Sound { + sound_type: SoundType::Tone(800), + duration: Duration::from_millis(25), + }], + }), rng: RandomNumberGenerator::new(), } } diff --git a/src/state.rs b/src/state.rs index e063062..d035268 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,6 +1,7 @@ use std::time::{Duration, Instant}; use crate::components::monster::damage_for_kind; +use crate::components::monster::sound_effect_for_kind; use crate::components::*; use crate::resources::*; use crate::systems::*; @@ -119,7 +120,7 @@ impl State { let monsters = self.ecs.write_storage::(); let mut map = self.ecs.write_resource::(); let mut stats = self.ecs.write_resource::(); - let mut sound_system = self.ecs.write_resource::(); + let mut sound_output = self.ecs.write_resource::(); let wants_to_whips = self.ecs.read_storage::(); for (player_entity, player, pos) in (&entities, &mut players, &mut positions).join() { @@ -139,11 +140,15 @@ impl State { if map.in_bounds(destination) { if map.is_solid(destination) { - sound_system.play_sound(sound_effects.blocked.clone()); + sound_output.play_sound(sound_effects.blocked.clone()); } else { if let Some(e) = map.get_tile_content_at(destination) { if let Some(monster) = monsters.get(e) { stats.take_gems(damage_for_kind(monster.kind)); + sound_output.play_sound(sound_effect_for_kind( + monster.kind, + &sound_effects, + )); let _ = entities.delete(e); } } @@ -161,11 +166,11 @@ impl State { self.ecs.write_resource::().force_tick(); - sound_system.play_sound(sound_effects.step.clone()); + sound_output.play_sound(sound_effects.step.clone()); } } else { - let static_sound = sound_effects.get_new_static_effect(&sound_system); - sound_system.play_sound(static_sound); + let static_sound = sound_effects.get_new_static_effect(&sound_output); + sound_output.play_sound(static_sound); } player.last_moved = now; diff --git a/src/systems/monster_ai_system.rs b/src/systems/monster_ai_system.rs index 36ed68f..d2147a6 100644 --- a/src/systems/monster_ai_system.rs +++ b/src/systems/monster_ai_system.rs @@ -1,9 +1,9 @@ use crate::{ components::{ - monster::{self, damage_for_kind, ticks_for_kind}, + monster::{self, damage_for_kind, sound_effect_for_kind, ticks_for_kind}, Monster, Player, Position, Renderable, }, - resources::{Clock, Map, Stats}, + resources::{Clock, Map, SoundEffects, SoundOutput, Stats}, tile_data::TileType, }; use bracket_lib::{prelude::*, random::RandomNumberGenerator}; @@ -19,6 +19,8 @@ impl<'a> System<'a> for MonsterAiSystem { ReadExpect<'a, Point>, WriteExpect<'a, Map>, WriteExpect<'a, Stats>, + ReadExpect<'a, SoundEffects>, + WriteExpect<'a, SoundOutput>, WriteStorage<'a, Monster>, WriteStorage<'a, Position>, WriteStorage<'a, Renderable>, @@ -33,6 +35,8 @@ impl<'a> System<'a> for MonsterAiSystem { player_pos, mut map, mut stats, + sound_effects, + mut sound_output, mut monsters, mut positions, mut renderables, @@ -79,6 +83,8 @@ impl<'a> System<'a> for MonsterAiSystem { // TODO: Sound map.clear_tile_content_at(Point::from(**position)); stats.take_gems(damage_for_kind(monster.kind)); + sound_output + .play_sound(sound_effect_for_kind(monster.kind, &sound_effects)); let _ = entities.delete(*entity); } } else {