diff --git a/build.rs b/build.rs index edecaa2..e718dc4 100644 --- a/build.rs +++ b/build.rs @@ -128,7 +128,11 @@ impl AssetsWriter { writeln!(file, "{indent}\t\t_ctx.load_texture_from_bytes({asset_const_name:?}, {asset_const_name});")?; } for asset_const_name in root.sound_assets.values() { - writeln!(file, "{indent}\t\tcomfy::load_sound_from_bytes({asset_const_name:?}, {asset_const_name}, Default::default());")?; + writeln!(file, "{indent}\t\tcomfy::load_sound_from_bytes({asset_const_name:?}, {asset_const_name},")?; + writeln!( + file, + "{indent}\t\t\tcomfy::StaticSoundSettings::new().loop_region(..));" + )?; } for group_name in root.groups.keys() { writeln!(file, "{indent}\t\t{group_name}::Assets::load(_ctx);")?; diff --git a/src/activities/house/mod.rs b/src/activities/house/mod.rs index 326ea4e..8679bba 100644 --- a/src/activities/house/mod.rs +++ b/src/activities/house/mod.rs @@ -3,7 +3,11 @@ mod grid; mod player; mod room; -use comfy::{delta, main_camera_mut, random_i32, vec2, EngineContext, RandomRange as _}; +use crate::assets::ASSETS; +use comfy::{ + delta, main_camera_mut, play_sound_id, random_i32, stop_sound_id, vec2, + EngineContext, RandomRange as _ +}; use grid::Grid; use indexmap::IndexSet; use log::error; @@ -29,7 +33,9 @@ pub struct HouseState { /// The energy level remaining in the house. Should decrease by itself, and much /// faster when inhabited by the ghost. pub charge: f32, - pub max_charge: f32 + pub max_charge: f32, + + pub sound_playing: bool } impl HouseState { @@ -65,12 +71,14 @@ impl HouseState { exit_time: 0.0, // TODO this should be lower depending on the time elapsed charge: max_charge, - max_charge + max_charge, + + sound_playing: false } } } -pub fn draw(state: &crate::State, _ctx: &comfy::EngineContext<'_>) { +pub fn draw(state: &crate::State, _ctx: &EngineContext<'_>) { let Some(house) = state.house() else { error!("How can I render a house when I'm not in one?!?"); return; @@ -90,15 +98,28 @@ pub fn draw(state: &crate::State, _ctx: &comfy::EngineContext<'_>) { house.player.draw(); } -pub fn update(state: &mut crate::State, ctx: &mut comfy::EngineContext<'_>) { +pub fn update(state: &mut crate::State, ctx: &mut EngineContext<'_>) { + if state.overworld.sound_playing { + stop_sound_id(ASSETS.music.galactic_rap_speedup); + state.overworld.sound_playing = false; + } + let mut camera = main_camera_mut(); camera.center = vec2(0.0, 0.0); drop(camera); - let house = state.house_mut(ctx); + let Some(house) = state.house_mut(ctx) else { + error!("WTF I cannot update a house without a house"); + return; + }; let current_room = house.rooms.get(house.current_room_id).unwrap(); house.player.update(¤t_room); + if !house.sound_playing { + play_sound_id(ASSETS.music.mesmerizing_galaxy_loop); + house.sound_playing = true; + } + if house.player.is_moving_to_right_room(current_room) { if house.current_room_id < (house.room_count - 1) { house.current_room_id += 1; diff --git a/src/activities/overworld/mod.rs b/src/activities/overworld/mod.rs index 0068780..a702a08 100644 --- a/src/activities/overworld/mod.rs +++ b/src/activities/overworld/mod.rs @@ -1,11 +1,13 @@ use crate::{ activities::Activity, + assets::ASSETS, game::{ZLayer, GHOST_DISCHARGE_RATE, GHOST_DISCHARGE_RATE_MOVEMENT}, State }; use comfy::{ draw_rect_outline, draw_sprite, error, info, is_key_down, main_camera_mut, - texture_id, vec2, EngineContext, IVec2, KeyCode, Vec2, RED, WHITE + play_sound_id, stop_sound_id, texture_id, vec2, EngineContext, IVec2, KeyCode, Vec2, + RED, WHITE }; use std::time::Instant; use worldgen::MovementCost; @@ -50,9 +52,20 @@ pub fn draw(state: &State, _ctx: &EngineContext<'_>) { ); } -fn update_move_player(state: &mut State, _ctx: &mut EngineContext<'_>) { +fn update_move_player(state: &mut State, ctx: &mut EngineContext<'_>) { let now = Instant::now(); + if !state.overworld.sound_playing { + if let Some(house) = state.house_mut(ctx) { + if house.sound_playing { + stop_sound_id(ASSETS.music.mesmerizing_galaxy_loop); + house.sound_playing = false; + } + } + play_sound_id(ASSETS.music.galactic_rap_speedup); + state.overworld.sound_playing = true; + } + // Are there any pending position updates? If so, we ignore all user input and execute // the pending updates. if state.ghost.overworld_movement_pending != Vec2::ZERO { diff --git a/src/activities/overworld/worldgen.rs b/src/activities/overworld/worldgen.rs index 83e9067..4739c4e 100644 --- a/src/activities/overworld/worldgen.rs +++ b/src/activities/overworld/worldgen.rs @@ -422,7 +422,9 @@ impl Chunk { #[derive(Debug, Default)] pub struct Overworld { - chunks: HashMap + chunks: HashMap, + + pub sound_playing: bool } fn world_to_chunk_and_local_coords(world_coords: IVec2) -> (IVec2, UVec2) { diff --git a/src/main.rs b/src/main.rs index 9573f72..5b79150 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,10 +59,12 @@ impl State { self.houses.get(&self.get_house_pos()?) } - fn house_mut(&mut self, ctx: &mut EngineContext<'_>) -> &mut HouseState { - self.houses - .entry(self.get_house_pos().unwrap()) - .or_insert_with(|| HouseState::generate_new_house(ctx)) + fn house_mut(&mut self, ctx: &mut EngineContext<'_>) -> Option<&mut HouseState> { + Some( + self.houses + .entry(self.get_house_pos()?) + .or_insert_with(|| HouseState::generate_new_house(ctx)) + ) } }