door sounds, ambient tracks
This commit is contained in:
parent
0c74531c5b
commit
b105a415d5
13 changed files with 71 additions and 5 deletions
BIN
resources/sounds/amb/relaxed.wav
Normal file
BIN
resources/sounds/amb/relaxed.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/blocked1.wav
Normal file
BIN
resources/sounds/door/blocked1.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/blocked2.wav
Normal file
BIN
resources/sounds/door/blocked2.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/blocked3.wav
Normal file
BIN
resources/sounds/door/blocked3.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/close1.wav
Normal file
BIN
resources/sounds/door/close1.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/close2.wav
Normal file
BIN
resources/sounds/door/close2.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/close3.wav
Normal file
BIN
resources/sounds/door/close3.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/open1.wav
Normal file
BIN
resources/sounds/door/open1.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/open2.wav
Normal file
BIN
resources/sounds/door/open2.wav
Normal file
Binary file not shown.
BIN
resources/sounds/door/open3.wav
Normal file
BIN
resources/sounds/door/open3.wav
Normal file
Binary file not shown.
|
|
@ -3,7 +3,7 @@ use notan::prelude::*;
|
||||||
use specs::prelude::*;
|
use specs::prelude::*;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use super::{ EffectSpawner, EffectType };
|
use super::{ EffectSpawner, EffectType, Targets, add_effect };
|
||||||
use crate::Map;
|
use crate::Map;
|
||||||
|
|
||||||
lazy_static::lazy_static! {
|
lazy_static::lazy_static! {
|
||||||
|
|
@ -53,6 +53,17 @@ pub fn play_sound(app: &mut App, ecs: &mut World, effect: &EffectSpawner, target
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn stop(app: &mut App) {
|
||||||
|
let mut ambience = AMBIENCE.lock().unwrap();
|
||||||
|
if let Some(old) = ambience.take() {
|
||||||
|
app.audio.stop(&old);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn ambience(sound: &str) {
|
||||||
|
add_effect(None, EffectType::Sound { sound: sound.to_string() }, Targets::Tile { target: 0 })
|
||||||
|
}
|
||||||
|
|
||||||
pub fn replace_ambience(app: &mut App, sound: &Sound) {
|
pub fn replace_ambience(app: &mut App, sound: &Sound) {
|
||||||
let mut ambience = AMBIENCE.lock().unwrap();
|
let mut ambience = AMBIENCE.lock().unwrap();
|
||||||
if let Some(old) = ambience.take() {
|
if let Some(old) = ambience.take() {
|
||||||
|
|
@ -62,12 +73,21 @@ pub fn replace_ambience(app: &mut App, sound: &Sound) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init_sounds(app: &mut App) {
|
pub fn init_sounds(app: &mut App) {
|
||||||
let list: Vec<(&str, (&[u8], AudioType))> = vec![
|
let sound_data: &[(&str, &[u8], AudioType)] = &[
|
||||||
//key, (bytes, type) - audiotype determines final volume, looping, etc.
|
// (key, file_path, audiotype)
|
||||||
("hit", (include_bytes!("../../resources/sounds/hit.wav"), AudioType::SFX))
|
("a_relax", include_bytes!("../../resources/sounds/amb/relaxed.wav"), AudioType::Ambient),
|
||||||
|
("d_blocked1", include_bytes!("../../resources/sounds/door/blocked1.wav"), AudioType::SFX),
|
||||||
|
("d_blocked2", include_bytes!("../../resources/sounds/door/blocked2.wav"), AudioType::SFX),
|
||||||
|
("d_blocked3", include_bytes!("../../resources/sounds/door/blocked3.wav"), AudioType::SFX),
|
||||||
|
("d_open1", include_bytes!("../../resources/sounds/door/open1.wav"), AudioType::SFX),
|
||||||
|
("d_open2", include_bytes!("../../resources/sounds/door/open2.wav"), AudioType::SFX),
|
||||||
|
("d_open3", include_bytes!("../../resources/sounds/door/open3.wav"), AudioType::SFX),
|
||||||
|
("d_close1", include_bytes!("../../resources/sounds/door/close1.wav"), AudioType::SFX),
|
||||||
|
("d_close2", include_bytes!("../../resources/sounds/door/close2.wav"), AudioType::SFX),
|
||||||
|
("d_close3", include_bytes!("../../resources/sounds/door/close3.wav"), AudioType::SFX),
|
||||||
];
|
];
|
||||||
let mut sounds = SOUNDS.lock().unwrap();
|
let mut sounds = SOUNDS.lock().unwrap();
|
||||||
for (k, (bytes, audiotype)) in list.iter() {
|
for (k, bytes, audiotype) in sound_data {
|
||||||
sounds.insert(k.to_string(), (app.audio.create_source(bytes).unwrap(), *audiotype));
|
sounds.insert(k.to_string(), (app.audio.create_source(bytes).unwrap(), *audiotype));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -76,3 +96,42 @@ pub fn set_volume(vol: f32) {
|
||||||
let mut volume = VOLUME.lock().unwrap();
|
let mut volume = VOLUME.lock().unwrap();
|
||||||
*volume = vol;
|
*volume = vol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clean(app: &mut App) {
|
||||||
|
app.audio.clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shorthand functions for adding generic, frequent SFX to the effect queue.
|
||||||
|
pub fn door_open(idx: usize) {
|
||||||
|
let mut rng = RandomNumberGenerator::new();
|
||||||
|
let sound = (
|
||||||
|
match rng.range(0, 3) {
|
||||||
|
0 => "d_open1",
|
||||||
|
1 => "d_open2",
|
||||||
|
_ => "d_open3",
|
||||||
|
}
|
||||||
|
).to_string();
|
||||||
|
super::add_effect(None, EffectType::Sound { sound }, Targets::Tile { target: idx });
|
||||||
|
}
|
||||||
|
pub fn door_resist(idx: usize) {
|
||||||
|
let mut rng = RandomNumberGenerator::new();
|
||||||
|
let sound = (
|
||||||
|
match rng.range(0, 3) {
|
||||||
|
0 => "d_blocked1",
|
||||||
|
1 => "d_blocked2",
|
||||||
|
_ => "d_blocked3",
|
||||||
|
}
|
||||||
|
).to_string();
|
||||||
|
add_effect(None, EffectType::Sound { sound }, Targets::Tile { target: idx });
|
||||||
|
}
|
||||||
|
pub fn door_close(idx: usize) {
|
||||||
|
let mut rng = RandomNumberGenerator::new();
|
||||||
|
let sound = (
|
||||||
|
match rng.range(0, 3) {
|
||||||
|
0 => "d_close1",
|
||||||
|
1 => "d_close2",
|
||||||
|
_ => "d_close3",
|
||||||
|
}
|
||||||
|
).to_string();
|
||||||
|
add_effect(None, EffectType::Sound { sound }, Targets::Tile { target: idx });
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ fn main() -> Result<(), String> {
|
||||||
|
|
||||||
fn setup(app: &mut App, gfx: &mut Graphics) -> State {
|
fn setup(app: &mut App, gfx: &mut Graphics) -> State {
|
||||||
effects::sound::init_sounds(app);
|
effects::sound::init_sounds(app);
|
||||||
|
effects::sound::ambience("a_relax");
|
||||||
let texture = gfx
|
let texture = gfx
|
||||||
.create_texture()
|
.create_texture()
|
||||||
.from_image(include_bytes!("../resources/atlas.png"))
|
.from_image(include_bytes!("../resources/atlas.png"))
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ use super::{
|
||||||
get_dest,
|
get_dest,
|
||||||
Destination,
|
Destination,
|
||||||
DamageType,
|
DamageType,
|
||||||
|
effects::sound,
|
||||||
};
|
};
|
||||||
use bracket_lib::prelude::*;
|
use bracket_lib::prelude::*;
|
||||||
use specs::prelude::*;
|
use specs::prelude::*;
|
||||||
|
|
@ -93,6 +94,7 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState {
|
||||||
if door.open == true {
|
if door.open == true {
|
||||||
let renderables = ecs.read_storage::<Renderable>();
|
let renderables = ecs.read_storage::<Renderable>();
|
||||||
if multiple_tile_content {
|
if multiple_tile_content {
|
||||||
|
sound::door_resist(destination_idx);
|
||||||
if let Some(name) = names.get(potential_target) {
|
if let Some(name) = names.get(potential_target) {
|
||||||
gamelog::Logger
|
gamelog::Logger
|
||||||
::new()
|
::new()
|
||||||
|
|
@ -104,6 +106,7 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState {
|
||||||
.log();
|
.log();
|
||||||
}
|
}
|
||||||
} else if rng.roll_dice(1, 6) + attributes.strength.modifier() < 2 {
|
} else if rng.roll_dice(1, 6) + attributes.strength.modifier() < 2 {
|
||||||
|
sound::door_resist(destination_idx);
|
||||||
if let Some(name) = names.get(potential_target) {
|
if let Some(name) = names.get(potential_target) {
|
||||||
gamelog::Logger
|
gamelog::Logger
|
||||||
::new()
|
::new()
|
||||||
|
|
@ -115,6 +118,7 @@ pub fn try_door(i: i32, j: i32, ecs: &mut World) -> RunState {
|
||||||
.log();
|
.log();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
sound::door_close(destination_idx);
|
||||||
door.open = false;
|
door.open = false;
|
||||||
if door.blocks_vis {
|
if door.blocks_vis {
|
||||||
blocks_visibility
|
blocks_visibility
|
||||||
|
|
@ -210,6 +214,7 @@ pub fn open(i: i32, j: i32, ecs: &mut World) -> RunState {
|
||||||
if door.open == false {
|
if door.open == false {
|
||||||
let renderables = ecs.read_storage::<Renderable>();
|
let renderables = ecs.read_storage::<Renderable>();
|
||||||
if rng.roll_dice(1, 6) + attributes.strength.modifier() < 2 {
|
if rng.roll_dice(1, 6) + attributes.strength.modifier() < 2 {
|
||||||
|
sound::door_resist(destination_idx);
|
||||||
if let Some(name) = names.get(potential_target) {
|
if let Some(name) = names.get(potential_target) {
|
||||||
gamelog::Logger
|
gamelog::Logger
|
||||||
::new()
|
::new()
|
||||||
|
|
@ -221,6 +226,7 @@ pub fn open(i: i32, j: i32, ecs: &mut World) -> RunState {
|
||||||
.log();
|
.log();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
sound::door_open(destination_idx);
|
||||||
door.open = true;
|
door.open = true;
|
||||||
blocks_visibility.remove(potential_target);
|
blocks_visibility.remove(potential_target);
|
||||||
blocks_movement.remove(potential_target);
|
blocks_movement.remove(potential_target);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue