From 902ed398e41ff6b71213659e91e9a1dd342a7912 Mon Sep 17 00:00:00 2001 From: AmadeusWM <63149896+AmadeusWM@users.noreply.github.com> Date: Sun, 6 Apr 2025 23:17:26 +0200 Subject: [PATCH] round door to doors --- src/level_instantiation/mod.rs | 8 ++-- src/monster.rs | 83 ++++++++++++++++++++-------------- src/player.rs | 4 +- 3 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/level_instantiation/mod.rs b/src/level_instantiation/mod.rs index f6c2afa..3b1a6e9 100644 --- a/src/level_instantiation/mod.rs +++ b/src/level_instantiation/mod.rs @@ -165,7 +165,7 @@ fn spawn_level( pos.with_rotation(Quat::from_rotation_y(90.0_f32.to_radians())), ), ( - round_door.clone(), + door.clone(), pos.with_rotation(Quat::from_rotation_y(180.0_f32.to_radians())), ), ( @@ -181,7 +181,7 @@ fn spawn_level( pos.with_rotation(Quat::from_rotation_y(90.0_f32.to_radians())), ), ( - round_door.clone(), + door.clone(), pos.with_rotation(Quat::from_rotation_y(0.0_f32.to_radians())), ), ( @@ -194,7 +194,7 @@ fn spawn_level( vec![ (wall.clone(), pos), ( - round_door.clone(), + door.clone(), pos.with_rotation(Quat::from_rotation_y(90.0_f32.to_radians())), ), ( @@ -207,7 +207,7 @@ fn spawn_level( vec![ (wall.clone(), pos), ( - round_door.clone(), + door.clone(), pos.with_rotation(Quat::from_rotation_y(270.0_f32.to_radians())), ), ( diff --git a/src/monster.rs b/src/monster.rs index 4c5bd2b..1eda440 100644 --- a/src/monster.rs +++ b/src/monster.rs @@ -1,7 +1,7 @@ use std::time::Duration; use bevy::{ - prelude::*, + prelude::*, time::Stopwatch, }; use bevy_kira_audio::{prelude::Volume, Audio, AudioControl, AudioTween}; @@ -27,7 +27,7 @@ pub struct Monster { #[derive(Debug, Clone, PartialEq)] pub enum MonsterState { Lurking, - Hunting, + Hunting, Wandering, Dormant, } @@ -74,7 +74,7 @@ fn spawn_monster( // mut materials: ResMut>, ) { let spawn_position = Vec3::new(20.0, 0.5, 20.0); - + commands.spawn(( Monster::default(), MonsterPathfinding { @@ -100,16 +100,16 @@ fn update_monster_state( player_query: Query<&Transform, With>, ) { let mut rand = rand::rng(); - + if let Ok((mut monster, monster_transform, mut pathfinding, mut danger)) = monster_query.get_single_mut() { let player_pos = if let Ok(player_transform) = player_query.get_single() { Some(player_transform.translation) } else { None }; - + monster.state_timer.tick(time.delta()); - + // when timer expires, potentially change state if monster.state_timer.just_finished() { let next_state = match monster.state { @@ -150,7 +150,7 @@ fn update_monster_state( MonsterState::Dormant } }; - + // set state monster.state = next_state.clone(); monster.state_timer = match next_state { @@ -159,16 +159,16 @@ fn update_monster_state( MonsterState::Wandering => Timer::from_seconds(30.0, TimerMode::Once), MonsterState::Hunting => Timer::from_seconds(15.0, TimerMode::Once), }; - + // reset pathfinding when state changes pathfinding.current_target = None; println!("new state={:?}", monster.state); } - + // override state in some cases if let Some(player_pos) = player_pos { let distance = monster_transform.translation.distance(player_pos); - + // if player is very close and monster isn't hunting, switch to hunting if distance < monster.detection_range * 0.5 && monster.state != MonsterState::Hunting { if rand.random_bool(0.75) { // 75% chance to notice player @@ -178,7 +178,7 @@ fn update_monster_state( pathfinding.current_target = None; } } - } + } } } @@ -188,10 +188,10 @@ fn move_monster( player_query: Query<&Transform, With>, ) { let mut rand = rand::rng(); - + if let Ok((monster, mut transform, mut velocity, mut pathfinding)) = monster_query.get_single_mut() { pathfinding.wander_target_timer.tick(time.delta()); - + // move based on state match monster.state { MonsterState::Dormant => { @@ -206,17 +206,17 @@ fn move_monster( 0.0, rand.random_range(-range..range) ); - + let base_pos = if let Ok(player_transform) = player_query.get_single() { player_transform.translation } else { transform.translation }; - + pathfinding.current_target = Some(base_pos + random_offset); pathfinding.wander_target_timer = Timer::from_seconds(10.0, TimerMode::Once); } - + // move toward target at slow pace if let Some(target) = pathfinding.current_target { move_towards_target(&mut transform, &mut velocity, target, monster.speed * 0.65); @@ -232,12 +232,12 @@ fn move_monster( 0.0, rand.random_range(-range..range) ); - + pathfinding.current_target = Some(player_transform.translation + random_offset); pathfinding.wander_target_timer = Timer::from_seconds(7.0, TimerMode::Once); } } - + // move toward target at medium pace if let Some(target) = pathfinding.current_target { move_towards_target(&mut transform, &mut velocity, target, monster.speed * 0.85); @@ -247,9 +247,9 @@ fn move_monster( // chase the motherfucker if let Ok(player_transform) = player_query.get_single() { move_towards_target( - &mut transform, - &mut velocity, - player_transform.translation, + &mut transform, + &mut velocity, + player_transform.translation, monster.speed * 1.1 ); } @@ -267,7 +267,7 @@ fn move_towards_target( let direction = (target - transform.translation).normalize_or_zero(); let direction = Vec3::new(direction.x, 0.0, direction.z).normalize_or_zero(); velocity.linvel = direction * speed; - + if direction.length_squared() > 0.01 { let look_direction = Vec3::new(direction.x, 0.0, direction.z).normalize_or_zero(); if look_direction != Vec3::ZERO { @@ -285,33 +285,43 @@ fn play_monster_sounds( player_query: Query<&Transform, With>, ) { let mut rand = rand::rng(); - if let (Ok((mut monster, monster_transform)), Ok(player_transform)) = + if let (Ok((mut monster, monster_transform)), Ok(player_transform)) = (monster_query.get_single_mut(), player_query.get_single()) { monster.footstep_timer.tick(time.delta()); let distance = monster_transform.translation.distance(player_transform.translation); - + // play footstep sound if the timer finished if monster.footstep_timer.just_finished() { match monster.state { MonsterState::Hunting => { - monster.footstep_timer = Timer::from_seconds(1.5, TimerMode::Once); + monster.footstep_timer = Timer::from_seconds(10.0, TimerMode::Once); + monster.speed = 2.0 }, MonsterState::Lurking | MonsterState::Wandering => { monster.footstep_timer = Timer::from_seconds( - rand.random_range(3.0..7.0), + 10.0, TimerMode::Once ); + monster.speed = 1.0 }, MonsterState::Dormant => { monster.footstep_timer = Timer::from_seconds( - rand.random_range(10.0..20.0), + 10.0, TimerMode::Once ); + monster.speed = 0.0 } } - play_footstep_segment(audio, &audio_assets, distance, &monster.state, monster.footstep_timer.duration().as_secs_f32()); + play_footstep_segment( + audio, + &audio_assets, + distance, + &monster.state, + monster.footstep_timer.duration().as_secs_f32(), + monster.speed + ); if monster.state == MonsterState::Hunting && rand.random_bool(0.3) { println!("Monster growl!"); @@ -325,7 +335,8 @@ fn play_footstep_segment( audio_assets: &Res, distance: f32, state: &MonsterState, - dur: f32 + dur: f32, + speed: f32 ) { let base_volume: f32 = match state { MonsterState::Dormant => 0.6, @@ -333,23 +344,25 @@ fn play_footstep_segment( MonsterState::Wandering => 0.8, MonsterState::Hunting => 1.0, }; - + // adjust volume based on distance (closer = louder) - let distance_factor: f32 = 1.0 - (distance / 100.0).clamp(0.0, 1.0); + let distance_factor: f32 = (1.0 - distance / 30.0).clamp(0.0, 1.0); let volume = base_volume * distance_factor; - + // play only a short segment of the footstep sound // by only playing the last part let mut start_time = 30.0 - dur; // let mut rand = rand::rng(); // start_time += rand.random_range(0.0..5.0); + audio.stop(); audio.play(audio_assets.monster_footsteps.clone()) .with_volume(volume as f64) .start_from((start_time as f64).min(27.0)) .fade_in(AudioTween::linear(Duration::from_millis(100))) + .with_playback_rate(speed as f64) .handle(); - - println!("Monster footstep: State={:?}, Distance={:.2}, Volume={:.2}, Dur={:1}, Start={:1}", + + println!("Monster footstep: State={:?}, Distance={:.2}, Volume={:.2}, Dur={:1}, Start={:1}", state, distance, volume, dur, (start_time as f64).min(27.0)); -} \ No newline at end of file +} diff --git a/src/player.rs b/src/player.rs index 8cb2f07..1162f65 100644 --- a/src/player.rs +++ b/src/player.rs @@ -457,9 +457,9 @@ pub fn handle_spotlight( pub fn update_flashlight_charge(time: Res