Music: six more dungeon pieces and six surface pieces with flute, harp, birdsong and wind
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
86c707e151
commit
d54de78f37
19 files changed
+166
-16
No files matched your search
+5
-1
@@ -21,6 +21,8 @@ pub enum Category {
|
||||
Temple,
|
||||
Victory,
|
||||
Defeat,
|
||||
Surface, // above ground: flute, harp, birdsong
|
||||
SurfaceBattle, // fighting above ground
|
||||
}
|
||||
|
||||
// indices of all tracks of a category, in play order
|
||||
@@ -221,7 +223,9 @@ mod tests {
|
||||
dc_audio_init(48000.0);
|
||||
let build = tracks_in(Category::Build);
|
||||
let battle = tracks_in(Category::Battle);
|
||||
assert_eq!(build.len(), 15);
|
||||
assert_eq!(build.len(), 19);
|
||||
assert_eq!(tracks_in(Category::Surface).len(), 4);
|
||||
assert_eq!(tracks_in(Category::SurfaceBattle).len(), 2);
|
||||
play_music(build[0], 0.0);
|
||||
let mut peak = 0.0f32;
|
||||
for k in 0..200 {
|
||||
|
||||
+28
-2
@@ -487,6 +487,19 @@ impl MusicDirector {
|
||||
}
|
||||
n >= 4
|
||||
};
|
||||
// the camera looks at the land above ground: the music of the surface
|
||||
let above = {
|
||||
let (cx, cz) = (cam.0 as i32, cam.1 as i32);
|
||||
let mut n = 0;
|
||||
for y in (cz - 4..=cz + 4).step_by(2) {
|
||||
for x in (cx - 4..=cx + 4).step_by(2) {
|
||||
if map::inb(x, y) && g.map.sky(map::idx(x, y)) {
|
||||
n += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
n >= 13
|
||||
};
|
||||
let want = if title {
|
||||
C::Title
|
||||
} else if g.state == 1 {
|
||||
@@ -508,11 +521,24 @@ impl MusicDirector {
|
||||
} else {
|
||||
C::Build
|
||||
};
|
||||
let rotate = matches!(want, C::Build | C::Title) && self.current == Some(want) && audio::music_loops() >= 2;
|
||||
let want = match want {
|
||||
C::Battle if above => C::SurfaceBattle,
|
||||
C::Build | C::Torture | C::Temple if above => C::Surface,
|
||||
w => w,
|
||||
};
|
||||
let rotate = matches!(want, C::Build | C::Title | C::Surface) && self.current == Some(want) && audio::music_loops() >= 2;
|
||||
if self.current != Some(want) || rotate || audio::current_track().is_none() {
|
||||
let before = self.current;
|
||||
self.current = Some(want);
|
||||
let t = self.pick(want);
|
||||
let fade = if matches!(want, C::Victory | C::Defeat) { 1.0 } else { 2.5 };
|
||||
// between the dungeon and the surface the music changes slowly
|
||||
let fade = if matches!(want, C::Victory | C::Defeat) {
|
||||
1.0
|
||||
} else if matches!((before, want), (Some(C::Surface | C::SurfaceBattle), _) | (_, C::Surface | C::SurfaceBattle)) {
|
||||
4.0
|
||||
} else {
|
||||
2.5
|
||||
};
|
||||
audio::play_music(t, fade);
|
||||
}
|
||||
}
|
||||
|
||||
+13
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
use crate::audio::Category;
|
||||
|
||||
pub const TRACKS: [(&str, Category, &[u8]); 35] = [
|
||||
pub const TRACKS: [(&str, Category, &[u8]); 47] = [
|
||||
("title", Category::Title, include_bytes!("../assets/music/title.xm")),
|
||||
("title2", Category::Title, include_bytes!("../assets/music/title2.xm")),
|
||||
("build1", Category::Build, include_bytes!("../assets/music/build1.xm")),
|
||||
@@ -28,6 +28,18 @@ pub const TRACKS: [(&str, Category, &[u8]); 35] = [
|
||||
("battle6", Category::Battle, include_bytes!("../assets/music/battle6.xm")),
|
||||
("battle7", Category::Battle, include_bytes!("../assets/music/battle7.xm")),
|
||||
("battle8", Category::Battle, include_bytes!("../assets/music/battle8.xm")),
|
||||
("build16", Category::Build, include_bytes!("../assets/music/build16.xm")),
|
||||
("build17", Category::Build, include_bytes!("../assets/music/build17.xm")),
|
||||
("build18", Category::Build, include_bytes!("../assets/music/build18.xm")),
|
||||
("build19", Category::Build, include_bytes!("../assets/music/build19.xm")),
|
||||
("battle9", Category::Battle, include_bytes!("../assets/music/battle9.xm")),
|
||||
("battle10", Category::Battle, include_bytes!("../assets/music/battle10.xm")),
|
||||
("surface1", Category::Surface, include_bytes!("../assets/music/surface1.xm")),
|
||||
("surface2", Category::Surface, include_bytes!("../assets/music/surface2.xm")),
|
||||
("surface3", Category::Surface, include_bytes!("../assets/music/surface3.xm")),
|
||||
("surface4", Category::Surface, include_bytes!("../assets/music/surface4.xm")),
|
||||
("surface_battle1", Category::SurfaceBattle, include_bytes!("../assets/music/surface_battle1.xm")),
|
||||
("surface_battle2", Category::SurfaceBattle, include_bytes!("../assets/music/surface_battle2.xm")),
|
||||
("battle2", Category::Assault, include_bytes!("../assets/music/battle2.xm")),
|
||||
("assault2", Category::Assault, include_bytes!("../assets/music/assault2.xm")),
|
||||
("assault3", Category::Assault, include_bytes!("../assets/music/assault3.xm")),
|
||||
|
||||
@@ -1130,7 +1130,7 @@ mod tests {
|
||||
fn render_all_songs() {
|
||||
for (k, (name, _, data)) in crate::tracks::TRACKS.iter().enumerate() {
|
||||
let m = Rc::new(load(data).expect("load"));
|
||||
assert_eq!(m.channels, 8, "{}", name);
|
||||
assert!(m.channels == 8 || (m.channels == 10 && name.starts_with("surface")), "{} {}", name, m.channels);
|
||||
let mut p = Player::new(m, 48000.0);
|
||||
let mut buf = vec![0.0f32; 48000 * 2];
|
||||
let mut peak = 0.0f32;
|
||||
|
||||
Reference in new issue
Block a user