From b90a5829b83f661434ac5c4cd891b2f5d0872c14 Mon Sep 17 00:00:00 2001 From: Gwilym Kuiper Date: Thu, 23 Feb 2023 21:18:29 +0000 Subject: [PATCH] Fix the games --- examples/hyperspace-roll/src/lib.rs | 6 +-- examples/hyperspace-roll/src/save.rs | 9 ++-- examples/hyperspace-roll/src/sfx.rs | 4 +- .../the-hat-chooses-the-wizard/src/lib.rs | 45 +++++++--------- .../the-hat-chooses-the-wizard/src/sfx.rs | 51 ++++++++----------- .../src/splash_screen.rs | 34 +++---------- examples/the-purple-night/src/lib.rs | 2 +- examples/the-purple-night/src/sfx.rs | 4 +- 8 files changed, 57 insertions(+), 98 deletions(-) diff --git a/examples/hyperspace-roll/src/lib.rs b/examples/hyperspace-roll/src/lib.rs index 61506591..1859aaf5 100644 --- a/examples/hyperspace-roll/src/lib.rs +++ b/examples/hyperspace-roll/src/lib.rs @@ -90,7 +90,7 @@ pub struct PlayerDice { } struct Agb<'a> { - obj: ObjectController, + obj: ObjectController<'a>, vblank: VBlank, star_background: StarBackground<'a>, vram: VRamManager, @@ -101,7 +101,7 @@ pub fn main(mut gba: agb::Gba) -> ! { save::init_save(&mut gba).expect("Could not initialize save game"); if save::load_high_score() > 1000 { - save::save_high_score(&mut gba, 0).expect("Could not reset high score"); + save::save_high_score(&mut gba.save, 0).expect("Could not reset high score"); } let gfx = gba.display.object.get(); @@ -208,7 +208,7 @@ pub fn main(mut gba: agb::Gba) -> ! { agb.obj.commit(); agb.sfx.customise(); if save::load_high_score() < current_level { - save::save_high_score(&mut gba, current_level) + save::save_high_score(&mut gba.save, current_level) .expect("Could not save high score"); } break; diff --git a/examples/hyperspace-roll/src/save.rs b/examples/hyperspace-roll/src/save.rs index 804fa4bb..e2154a87 100644 --- a/examples/hyperspace-roll/src/save.rs +++ b/examples/hyperspace-roll/src/save.rs @@ -1,4 +1,4 @@ -use agb::save::Error; +use agb::save::{Error, SaveManager}; use agb::sync::Static; use agb::Gba; @@ -15,7 +15,7 @@ pub fn init_save(gba: &mut Gba) -> Result<(), Error> { if buffer[0] != 0 { access.prepare_write(0..1)?.write(0, &[0])?; core::mem::drop(access); - save_high_score(gba, 0)?; + save_high_score(&mut gba.save, 0)?; } else { let mut buffer = [0; 4]; access.read(1, &mut buffer)?; @@ -35,9 +35,8 @@ pub fn load_high_score() -> u32 { HIGH_SCORE.read() } -pub fn save_high_score(gba: &mut Gba, score: u32) -> Result<(), Error> { - gba.save - .access()? +pub fn save_high_score(save: &mut SaveManager, score: u32) -> Result<(), Error> { + save.access()? .prepare_write(1..5)? .write(1, &score.to_le_bytes())?; HIGH_SCORE.write(score); diff --git a/examples/hyperspace-roll/src/sfx.rs b/examples/hyperspace-roll/src/sfx.rs index d2d877c4..c01ce5ea 100644 --- a/examples/hyperspace-roll/src/sfx.rs +++ b/examples/hyperspace-roll/src/sfx.rs @@ -45,14 +45,14 @@ enum BattleOrMenu { } pub struct Sfx<'a> { - mixer: &'a mut Mixer, + mixer: &'a mut Mixer<'a>, state: BattleOrMenu, current_bgm: ChannelId, } impl<'a> Sfx<'a> { - pub fn new(mixer: &'a mut Mixer) -> Self { + pub fn new(mixer: &'a mut Mixer<'a>) -> Self { let mut title_music = SoundChannel::new_high_priority(TITLE_BGM); title_music.should_loop(); let title_channel = mixer.play_sound(title_music).unwrap(); diff --git a/examples/the-hat-chooses-the-wizard/src/lib.rs b/examples/the-hat-chooses-the-wizard/src/lib.rs index d7ddd3b0..ef6fe5b8 100644 --- a/examples/the-hat-chooses-the-wizard/src/lib.rs +++ b/examples/the-hat-chooses-the-wizard/src/lib.rs @@ -20,6 +20,7 @@ use agb::{ sound::mixer::Frequency, }; use alloc::boxed::Box; +use sfx::SfxPlayer; mod enemies; mod level_display; @@ -693,7 +694,7 @@ impl<'a, 'b> PlayingLevel<'a, 'b> { fn update_frame( &mut self, - sfx_player: &mut sfx::SfxPlayer, + sfx_player: &mut SfxPlayer, vram: &mut VRamManager, controller: &'a ObjectController, ) -> UpdateState { @@ -798,13 +799,17 @@ pub fn main(mut agb: agb::Gba) -> ! { } } + let mut mixer = agb.mixer.mixer(Frequency::Hz10512); + + mixer.enable(); + let mut sfx = sfx::SfxPlayer::new(&mut mixer); + world_display.commit(&mut vram); world_display.show(); splash_screen::show_splash_screen( splash_screen::SplashScreen::Start, - None, - None, + &mut sfx, &mut splash_screen, &mut vram, ); @@ -816,10 +821,6 @@ pub fn main(mut agb: agb::Gba) -> ! { vram.set_background_palettes(tile_sheet::PALETTES); let object = agb.display.object.get(); - let mut mixer = agb.mixer.mixer(Frequency::Hz10512); - - mixer.enable(); - let mut music_box = sfx::MusicBox::new(); let vblank = agb::interrupt::VBlank::get(); let mut current_level = 0; @@ -829,8 +830,7 @@ pub fn main(mut agb: agb::Gba) -> ! { break; } - music_box.before_frame(&mut mixer); - mixer.frame(); + sfx.frame(); vblank.wait_for_vblank(); level_display::write_level( @@ -844,8 +844,7 @@ pub fn main(mut agb: agb::Gba) -> ! { world_display.commit(&mut vram); world_display.show(); - music_box.before_frame(&mut mixer); - mixer.frame(); + sfx.frame(); vblank.wait_for_vblank(); let map_current_level = current_level; @@ -889,20 +888,17 @@ pub fn main(mut agb: agb::Gba) -> ! { ); while level.background.init_background(&mut vram) != PartialUpdateStatus::Done { - music_box.before_frame(&mut mixer); - mixer.frame(); + sfx.frame(); vblank.wait_for_vblank(); } while level.background.init_foreground(&mut vram) != PartialUpdateStatus::Done { - music_box.before_frame(&mut mixer); - mixer.frame(); + sfx.frame(); vblank.wait_for_vblank(); } for _ in 0..20 { - music_box.before_frame(&mut mixer); - mixer.frame(); + sfx.frame(); vblank.wait_for_vblank(); } @@ -913,17 +909,12 @@ pub fn main(mut agb: agb::Gba) -> ! { world_display.hide(); loop { - match level.update_frame( - &mut sfx::SfxPlayer::new(&mut mixer, &music_box), - &mut vram, - &object, - ) { + match level.update_frame(&mut sfx, &mut vram, &object) { UpdateState::Normal => {} UpdateState::Dead => { level.dead_start(); while level.dead_update(&object) { - music_box.before_frame(&mut mixer); - mixer.frame(); + sfx.frame(); vblank.wait_for_vblank(); object.commit(); } @@ -935,8 +926,7 @@ pub fn main(mut agb: agb::Gba) -> ! { } } - music_box.before_frame(&mut mixer); - mixer.frame(); + sfx.frame(); vblank.wait_for_vblank(); object.commit(); } @@ -949,8 +939,7 @@ pub fn main(mut agb: agb::Gba) -> ! { splash_screen::show_splash_screen( splash_screen::SplashScreen::End, - Some(&mut mixer), - Some(&mut music_box), + &mut sfx, &mut splash_screen, &mut vram, ); diff --git a/examples/the-hat-chooses-the-wizard/src/sfx.rs b/examples/the-hat-chooses-the-wizard/src/sfx.rs index f471ae57..033b1a82 100644 --- a/examples/the-hat-chooses-the-wizard/src/sfx.rs +++ b/examples/the-hat-chooses-the-wizard/src/sfx.rs @@ -37,40 +37,14 @@ mod effects { pub const SNAIL_DEATH: &[u8] = agb::include_wav!("sfx/snail-death.wav"); } -pub struct MusicBox { - frame: i32, -} - -impl MusicBox { - pub fn new() -> Self { - MusicBox { frame: 0 } - } - - pub fn before_frame(&mut self, mixer: &mut Mixer) { - if self.frame == 0 { - // play the introduction - mixer.play_sound(SoundChannel::new_high_priority(music_data::INTRO_MUSIC)); - } else if self.frame == music_data::TRIGGER_MUSIC_POINT - || (self.frame - music_data::TRIGGER_MUSIC_POINT) % music_data::LOOP_MUSIC == 0 - { - mixer.play_sound(SoundChannel::new_high_priority(music_data::LOOP)); - } - - self.frame += 1; - } -} - pub struct SfxPlayer<'a> { - mixer: &'a mut Mixer, + mixer: &'a mut Mixer<'a>, frame: i32, } impl<'a> SfxPlayer<'a> { - pub fn new(mixer: &'a mut Mixer, music_box: &MusicBox) -> Self { - SfxPlayer { - mixer, - frame: music_box.frame, - } + pub fn new(mixer: &'a mut Mixer<'a>) -> Self { + SfxPlayer { mixer, frame: 0 } } pub fn catch(&mut self) { @@ -120,7 +94,24 @@ impl<'a> SfxPlayer<'a> { fn play_random(&mut self, effect: &[&'static [u8]]) { self.mixer.play_sound(SoundChannel::new( - effect[(self.frame as usize) % effect.len()], + effect[agb::rng::gen() as usize % effect.len()], )); } + + pub fn frame(&mut self) { + if self.frame == 0 { + // play the introduction + self.mixer + .play_sound(SoundChannel::new_high_priority(music_data::INTRO_MUSIC)); + } else if self.frame == music_data::TRIGGER_MUSIC_POINT + || (self.frame - music_data::TRIGGER_MUSIC_POINT) % music_data::LOOP_MUSIC == 0 + { + self.mixer + .play_sound(SoundChannel::new_high_priority(music_data::LOOP)); + } + + self.frame += 1; + + self.mixer.frame(); + } } diff --git a/examples/the-hat-chooses-the-wizard/src/splash_screen.rs b/examples/the-hat-chooses-the-wizard/src/splash_screen.rs index 12991514..80883647 100644 --- a/examples/the-hat-chooses-the-wizard/src/splash_screen.rs +++ b/examples/the-hat-chooses-the-wizard/src/splash_screen.rs @@ -1,8 +1,5 @@ -use super::sfx::MusicBox; -use agb::{ - display::tiled::{RegularMap, TileFormat, TileSet, TileSetting, TiledMap, VRamManager}, - sound::mixer::Mixer, -}; +use super::sfx::SfxPlayer; +use agb::display::tiled::{RegularMap, TileFormat, TileSet, TileSetting, TiledMap, VRamManager}; agb::include_gfx!("gfx/splash_screens.toml"); @@ -13,8 +10,7 @@ pub enum SplashScreen { pub fn show_splash_screen( which: SplashScreen, - mut mixer: Option<&mut Mixer>, - mut music_box: Option<&mut MusicBox>, + sfx: &mut SfxPlayer, map: &mut RegularMap, vram: &mut VRamManager, ) { @@ -32,13 +28,7 @@ pub fn show_splash_screen( let mut input = agb::input::ButtonController::new(); - if let Some(ref mut mixer) = mixer { - if let Some(ref mut music_box) = music_box { - music_box.before_frame(mixer); - } - mixer.frame(); - } - + sfx.frame(); vblank.wait_for_vblank(); for y in 0..20u16 { @@ -51,13 +41,7 @@ pub fn show_splash_screen( ); } - if let Some(ref mut mixer) = mixer { - if let Some(ref mut music_box) = music_box { - music_box.before_frame(mixer); - } - mixer.frame(); - } - + sfx.frame(); vblank.wait_for_vblank(); } @@ -75,12 +59,8 @@ pub fn show_splash_screen( ) { break; } - if let Some(mixer) = &mut mixer { - if let Some(music_box) = &mut music_box { - music_box.before_frame(mixer); - } - mixer.frame(); - } + + sfx.frame(); vblank.wait_for_vblank(); } diff --git a/examples/the-purple-night/src/lib.rs b/examples/the-purple-night/src/lib.rs index 21491cd7..d77ee71e 100644 --- a/examples/the-purple-night/src/lib.rs +++ b/examples/the-purple-night/src/lib.rs @@ -533,7 +533,7 @@ struct Player<'a> { } impl<'a> Player<'a> { - fn new(object_controller: &'a ObjectController) -> Player { + fn new(object_controller: &'a ObjectController<'a>) -> Player { let mut entity = Entity::new( object_controller, Rect::new((0_u16, 0_u16).into(), (4_u16, 12_u16).into()), diff --git a/examples/the-purple-night/src/sfx.rs b/examples/the-purple-night/src/sfx.rs index 0e8ac5be..445dd148 100644 --- a/examples/the-purple-night/src/sfx.rs +++ b/examples/the-purple-night/src/sfx.rs @@ -27,11 +27,11 @@ const BLUE_SPIRIT: &[u8] = agb::include_wav!("sfx/03 - Blue Spirit (Main Loop).w pub struct Sfx<'a> { bgm: Option, - mixer: &'a mut Mixer, + mixer: &'a mut Mixer<'a>, } impl<'a> Sfx<'a> { - pub fn new(mixer: &'a mut Mixer) -> Self { + pub fn new(mixer: &'a mut Mixer<'a>) -> Self { Self { mixer, bgm: None } }