Merge branch 'slipped/lavanoise' into 'master'

lava noise

See merge request veloren/veloren!4147
This commit is contained in:
Justin Shipsey 2023-10-20 18:11:24 +00:00
commit c422616f70
4 changed files with 54 additions and 24 deletions

View File

@ -129,6 +129,18 @@
threshold: 5.0,
subtitle: "subtitle-running_water",
),
Lavapool: (
files: [
"voxygen.audio.sfx.ambient.river_sounds.running_water-003",
"voxygen.audio.sfx.ambient.river_sounds.running_water-004",
"voxygen.audio.sfx.ambient.river_sounds.running_water-005",
"voxygen.audio.sfx.ambient.river_sounds.running_water-006",
"voxygen.audio.sfx.ambient.river_sounds.running_water-012",
"voxygen.audio.sfx.ambient.river_sounds.running_water-013",
],
threshold: 7.0,
subtitle: "subtitle-lavapool",
),
//
// Character States
//

View File

@ -16,7 +16,8 @@ use common::{
};
use common_state::State;
use hashbrown::HashMap;
use rand::{seq::SliceRandom, thread_rng, Rng};
use rand::{prelude::*, seq::SliceRandom, thread_rng, Rng};
use rand_chacha::ChaCha8Rng;
use std::time::{Duration, Instant};
use vek::*;
@ -55,13 +56,15 @@ impl EventMapper for BlockEventMapper {
let focus_off = camera.get_focus_pos().map(f32::trunc);
let cam_pos = camera.dependents().cam_pos + focus_off;
let mut rng = ChaCha8Rng::from_seed(thread_rng().gen());
// Get the player position and chunk
if let Some(player_pos) = state.read_component_copied::<Pos>(player_entity) {
let player_chunk = player_pos.0.xy().map2(TerrainChunk::RECT_SIZE, |e, sz| {
(e.floor() as i32).div_euclid(sz as i32)
});
// For determining if underground/crickets should chirp
// For determining if crickets should chirp
let (terrain_alt, temp) = match client.current_chunk() {
Some(chunk) => (chunk.meta().alt(), chunk.meta().temp()),
None => (0.0, 0.0),
@ -109,6 +112,13 @@ impl EventMapper for BlockEventMapper {
volume: 1.5,
cond: |_| true,
},
BlockSounds {
blocks: |boi| &boi.lavapool,
range: 1,
sfx: SfxEvent::Lavapool,
volume: 1.8,
cond: |_| true,
},
//BlockSounds {
// blocks: |boi| &boi.embers,
// range: 1,
@ -161,17 +171,15 @@ impl EventMapper for BlockEventMapper {
cond: |st| st.get_day_period().is_light(),
},
];
// Iterate through each kind of block of interest
for sounds in sounds.iter() {
// If the timing condition is false, continue
// or if the player is far enough underground, continue
// TODO Address bird hack properly. See TODO on line 190
// TODO Address bird hack properly. See TODO below
if !(sounds.cond)(state)
|| player_pos.0.z < (terrain_alt - 30.0)
|| (sounds.sfx == SfxEvent::Birdcall && thread_rng().gen_bool(0.995))
|| (sounds.sfx == SfxEvent::Owl && thread_rng().gen_bool(0.998))
|| (sounds.sfx == SfxEvent::Frog && thread_rng().gen_bool(0.95))
|| (!(sounds.sfx == SfxEvent::Lavapool) && player_pos.0.z < (terrain_alt - 30.0))
|| (sounds.sfx == SfxEvent::Birdcall && rng.gen_bool(0.995))
|| (sounds.sfx == SfxEvent::Owl && rng.gen_bool(0.998))
|| (sounds.sfx == SfxEvent::Frog && rng.gen_bool(0.95))
//Crickets will not chirp below 5 Celsius
|| (sounds.sfx == SfxEvent::Cricket1 && (temp < -0.33))
|| (sounds.sfx == SfxEvent::Cricket2 && (temp < -0.33))
@ -195,9 +203,10 @@ impl EventMapper for BlockEventMapper {
// Replace all RunningWater blocks with just one random one per tick
let blocks = if sounds.sfx == SfxEvent::RunningWaterSlow
|| sounds.sfx == SfxEvent::RunningWaterFast
|| sounds.sfx == SfxEvent::Lavapool
{
blocks
.choose(&mut thread_rng())
.choose(&mut rng)
.map(std::slice::from_ref)
.unwrap_or(&[])
} else {
@ -210,10 +219,10 @@ impl EventMapper for BlockEventMapper {
// block of interest type which picks fewer leaf blocks
// Hack to reduce the number of bird, frog, and water sounds
if ((sounds.sfx == SfxEvent::Birdcall || sounds.sfx == SfxEvent::Owl)
&& thread_rng().gen_bool(0.9995))
|| (sounds.sfx == SfxEvent::Frog && thread_rng().gen_bool(0.75))
|| (sounds.sfx == SfxEvent::RunningWaterSlow
&& thread_rng().gen_bool(0.5))
&& rng.gen_bool(0.9995))
|| (sounds.sfx == SfxEvent::Frog && rng.gen_bool(0.75))
|| (sounds.sfx == SfxEvent::RunningWaterSlow && rng.gen_bool(0.5))
|| (sounds.sfx == SfxEvent::Lavapool && rng.gen_bool(0.99))
{
continue;
}
@ -284,6 +293,8 @@ impl BlockEventMapper {
sfx_trigger_item: Option<(&SfxEvent, &SfxTriggerItem)>,
temp: f32,
) -> bool {
let mut rng = ChaCha8Rng::from_seed(thread_rng().gen());
if let Some((event, item)) = sfx_trigger_item {
//The interval between cricket chirps calculated by converting chunk
// temperature to centigrade (we should create a function for this) and applying
@ -295,7 +306,7 @@ impl BlockEventMapper {
match event {
SfxEvent::Cricket1 => {
previous_state.time.elapsed().as_secs_f32()
>= cricket_interval + thread_rng().gen_range(-0.1..0.1)
>= cricket_interval + rng.gen_range(-0.1..0.1)
},
SfxEvent::Cricket2 => {
//the length and manner of this sound is quite different
@ -303,17 +314,16 @@ impl BlockEventMapper {
previous_state.time.elapsed().as_secs_f32() >= 0.75
} else {
previous_state.time.elapsed().as_secs_f32()
>= cricket_interval + thread_rng().gen_range(-0.1..0.1)
>= cricket_interval + rng.gen_range(-0.1..0.1)
}
},
SfxEvent::Cricket3 => {
previous_state.time.elapsed().as_secs_f32()
>= cricket_interval + thread_rng().gen_range(-0.1..0.1)
>= cricket_interval + rng.gen_range(-0.1..0.1)
},
//Adds random factor to frogs (probably doesn't do anything most of the time)
SfxEvent::Frog => {
previous_state.time.elapsed().as_secs_f32()
>= thread_rng().gen_range(-2.0..2.0)
previous_state.time.elapsed().as_secs_f32() >= rng.gen_range(-2.0..2.0)
},
_ => previous_state.time.elapsed().as_secs_f32() >= item.threshold,
}

View File

@ -133,6 +133,7 @@ pub enum SfxEvent {
Bees,
RunningWaterSlow,
RunningWaterFast,
Lavapool,
Idle,
Swim,
Run(BlockKind),

View File

@ -39,6 +39,7 @@ pub struct BlocksOfInterest {
pub grass: Vec<Vec3<i32>>,
pub slow_river: Vec<Vec3<i32>>,
pub fast_river: Vec<Vec3<i32>>,
pub lavapool: Vec<Vec3<i32>>,
pub fires: Vec<Vec3<i32>>,
pub smokers: Vec<SmokerProperties>,
pub beehives: Vec<Vec3<i32>>,
@ -76,6 +77,7 @@ impl BlocksOfInterest {
let mut grass = Vec::new();
let mut slow_river = Vec::new();
let mut fast_river = Vec::new();
let mut lavapool = Vec::new();
let mut fires = Vec::new();
let mut smokers = Vec::new();
let mut beehives = Vec::new();
@ -124,12 +126,16 @@ impl BlocksOfInterest {
BlockKind::Water if river_speed_sq > 0.3_f32.powi(2) => slow_river.push(pos),
BlockKind::Snow if rng.gen_range(0..16) == 0 => snow.push(pos),
BlockKind::Lava
if rng.gen_range(0..5) == 0
&& chunk
.get(pos + Vec3::unit_z())
.map_or(true, |b| !b.is_filled()) =>
if chunk
.get(pos + Vec3::unit_z())
.map_or(true, |b| !b.is_filled()) =>
{
fires.push(pos + Vec3::unit_z())
if rng.gen_range(0..5) == 0 {
fires.push(pos + Vec3::unit_z())
}
if rng.gen_range(0..16) == 0 {
lavapool.push(pos)
}
},
BlockKind::Snow | BlockKind::Ice if rng.gen_range(0..16) == 0 => snow.push(pos),
_ => match block.get_sprite() {
@ -235,6 +241,7 @@ impl BlocksOfInterest {
grass,
slow_river,
fast_river,
lavapool,
fires,
smokers,
beehives,