From b0eb97fa5328d4f8154c931397c66a0a3333ae62 Mon Sep 17 00:00:00 2001 From: Fussmatte Date: Fri, 17 Feb 2023 16:02:30 -0500 Subject: [PATCH 1/3] Added custom sound effect functionality to `playef()` --- desktop_version/src/Music.cpp | 40 ++++++++++++++++++++++++++++++++++ desktop_version/src/Music.h | 2 ++ desktop_version/src/Script.cpp | 9 +++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/desktop_version/src/Music.cpp b/desktop_version/src/Music.cpp index 9c9ee0aa..b7b676a0 100644 --- a/desktop_version/src/Music.cpp +++ b/desktop_version/src/Music.cpp @@ -121,6 +121,7 @@ public: format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; format.cbSize = 0; valid = true; + name = std::string(SDL_strrchr(fileName, '/') + 1); end: VVV_free(mem); } @@ -244,6 +245,8 @@ end: static FAudioSourceVoice** voices; static float volume; + + std::string name; }; FAudioSourceVoice** SoundTrack::voices = NULL; float SoundTrack::volume = 0.0f; @@ -657,6 +660,29 @@ void musicclass::init(void) soundTracks.push_back(SoundTrack( "sounds/trophy.wav" )); soundTracks.push_back(SoundTrack( "sounds/rescue.wav" )); + //Here's where we find all the custom sounds in a level's assets folder + EnumHandle handle = {}; + const char* item; + while ((item = FILESYSTEM_enumerateAssets("sounds/", &handle)) != NULL) + { + const std::string str_item = item; + bool match; + for (int j = 0; j < soundTracks.size(); j++) + { + match = (str_item == soundTracks[j].name); + if (match) + { + break; + } + } + if (!match) + { + soundTracks.push_back(SoundTrack( ("sounds/" + str_item).c_str() )); + } + } + FILESYSTEM_freeEnumerate(&handle); + + #ifdef VVV_COMPILEMUSIC binaryBlob musicWriteBlob; #define FOREACH_TRACK(blob, track_name) blob.AddFileToBinaryBlob("data/" track_name); @@ -1144,6 +1170,20 @@ void musicclass::playef(int t) soundTracks[t].Play(); } +void musicclass::playef_name(std::string& t) +{ + for (int i = 0; i < soundTracks.size(); i++) + { + size_t lastindex = soundTracks[i].name.find_last_of('.'); + std::string rawname = soundTracks[i].name.substr(0, lastindex); + if (t == rawname) + { + soundTracks[i].Play(); + return; + } + } +} + void musicclass::pauseef(void) { SoundTrack::Pause(); diff --git a/desktop_version/src/Music.h b/desktop_version/src/Music.h index ce2aed30..c7d4ebad 100644 --- a/desktop_version/src/Music.h +++ b/desktop_version/src/Music.h @@ -2,6 +2,7 @@ #define MUSIC_H #include "BinaryBlob.h" +#include #define musicroom(rx, ry) ((rx) + ((ry) * 20)) @@ -38,6 +39,7 @@ public: int currentsong; void playef(int t); + void playef_name(std::string& t); void pauseef(void); void resumeef(void); diff --git a/desktop_version/src/Script.cpp b/desktop_version/src/Script.cpp index 9e710b43..4bb0d240 100644 --- a/desktop_version/src/Script.cpp +++ b/desktop_version/src/Script.cpp @@ -355,7 +355,14 @@ void scriptclass::run(void) } if (words[0] == "playef") { - music.playef(ss_toi(words[1])); + if (words[1] != "0" && ss_toi(words[1]) == 0) + { + music.playef_name(raw_words[1]); + } + else + { + music.playef(ss_toi(words[1])); + } } if (words[0] == "play") { From 92f86079a09577fc41171714f731bca90a5c268e Mon Sep 17 00:00:00 2001 From: Fussmatte Date: Sun, 19 Feb 2023 11:41:34 -0500 Subject: [PATCH 2/3] Refined criteria for choosing custom sound effects Previously, any number would be interpreted as a stock sound effect ID, causing the side effect of being able to call custom sound effects using numbers over 27 (which is unreliable). Now only numbers that correspond to a stock sound effect ID will be considered (leading zeroes work as well), and everything else will be interpreted as a custom sound effect file name. --- desktop_version/src/Music.cpp | 4 ++++ desktop_version/src/Music.h | 2 ++ desktop_version/src/Script.cpp | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/desktop_version/src/Music.cpp b/desktop_version/src/Music.cpp index b7b676a0..dcb724db 100644 --- a/desktop_version/src/Music.cpp +++ b/desktop_version/src/Music.cpp @@ -614,6 +614,8 @@ musicclass::musicclass(void) quick_fade = true; usingmmmmmm = false; + + stockSoundTracks = 0; } void musicclass::init(void) @@ -659,6 +661,8 @@ void musicclass::init(void) soundTracks.push_back(SoundTrack( "sounds/newrecord.wav" )); soundTracks.push_back(SoundTrack( "sounds/trophy.wav" )); soundTracks.push_back(SoundTrack( "sounds/rescue.wav" )); + + stockSoundTracks = soundTracks.size(); //Here's where we find all the custom sounds in a level's assets folder EnumHandle handle = {}; diff --git a/desktop_version/src/Music.h b/desktop_version/src/Music.h index c7d4ebad..1a4a7a66 100644 --- a/desktop_version/src/Music.h +++ b/desktop_version/src/Music.h @@ -65,6 +65,8 @@ public: bool mmmmmm; bool usingmmmmmm; + int stockSoundTracks; + binaryBlob pppppp_blob; binaryBlob mmmmmm_blob; int num_pppppp_tracks; diff --git a/desktop_version/src/Script.cpp b/desktop_version/src/Script.cpp index 4bb0d240..0b3efd27 100644 --- a/desktop_version/src/Script.cpp +++ b/desktop_version/src/Script.cpp @@ -355,13 +355,13 @@ void scriptclass::run(void) } if (words[0] == "playef") { - if (words[1] != "0" && ss_toi(words[1]) == 0) + if (is_number(words[1].c_str()) && ss_toi(words[1]) >= 0 && ss_toi(words[1]) < music.stockSoundTracks) { - music.playef_name(raw_words[1]); + music.playef(ss_toi(words[1])); } else { - music.playef(ss_toi(words[1])); + music.playef_name(raw_words[1]); } } if (words[0] == "play") From 8623cf227a80f15d1bd13ea52a5546011d8a681a Mon Sep 17 00:00:00 2001 From: Fussmatte Date: Mon, 28 Aug 2023 15:59:45 -0400 Subject: [PATCH 3/3] Fixed custom OGGs not being played with playef() When OGG files got loaded, they weren't given a name in the function LoadOGG(). This caused playef_name() to fail since it couldn't match any of the custom pushed OGGs' filenames with what the user called using playef. This was fixed by copying the name definition from LoadWAV(). --- desktop_version/src/Music.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/desktop_version/src/Music.cpp b/desktop_version/src/Music.cpp index 8803710a..29e28335 100644 --- a/desktop_version/src/Music.cpp +++ b/desktop_version/src/Music.cpp @@ -171,6 +171,7 @@ end: ogg_file = mem; valid = true; + name = std::string(SDL_strrchr(fileName, '/') + 1); } void Dispose(void)