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:
Richard ZinkandClaude Opus 5.5 committed 2026-11-05 22:58:41 +01:00
1 parent 86c707e151
commit d54de78f37
19 files changed
+166 -16

No files matched your search

+5 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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")),
+1 -1
View File
@@ -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;