rabbit review

This commit is contained in:
Isaac0-dev 2026-05-18 00:47:38 +10:00
parent 082047c605
commit 8ce886883e
2 changed files with 62 additions and 11 deletions

View file

@ -40,12 +40,12 @@ void DynOS_Audio_ResetMods() {
audio_init();
for (s32 i = 0; i < MAX_AUDIO_OVERRIDE; i++) {
#ifdef VERSION_EU
if (!sAudioOverrides[i].pack.enabled || sAudioOverrides[i].mod.enabled) {
if (!sAudioOverrides[i].pack.enabled && sAudioOverrides[i].mod.enabled) {
if (i >= SEQ_EVENT_CUTSCENE_LAKITU) {
sBackgroundMusicDefaultVolume[i] = 75;
return;
} else {
sBackgroundMusicDefaultVolume[i] = sBackgroundMusicDefaultVolumeDefault[i];
}
sBackgroundMusicDefaultVolume[i] = sBackgroundMusicDefaultVolumeDefault[i];
} else if (sAudioOverrides[i].pack.enabled) {
// keep pack override default volume
sBackgroundMusicDefaultVolume[i] = sAudioOverrides[i].pack.defaultVolume;
@ -68,6 +68,7 @@ static bool DynOS_Audio_LoadEntry(AudioOverrideEntry* aOverride, u8 aSequenceId,
if (gOverrideBank > -1) { aOverride->bank = gOverrideBank; }
if (aOverride->loaded) {
sound_set_background_music_default_volume(aSequenceId, aOverride->defaultVolume);
*aSeqData = aOverride->buffer;
*aBankId = aOverride->bank;
return true;
@ -149,20 +150,44 @@ static void DynOS_Audio_HotSwapIfActive(u8 aSequenceId) {
void DynOS_Audio_ActivateOverride(AudioOverrideEntry* aOverride) {
if (aOverride == NULL || aOverride->enabled) { return; }
aOverride->enabled = true;
sound_set_background_music_default_volume(aOverride->sequenceId, aOverride->defaultVolume);
DynOS_Audio_HotSwapIfActive(aOverride->sequenceId);
}
void DynOS_Audio_DeactivateOverride(AudioOverrideEntry* aOverride) {
if (aOverride == NULL || !aOverride->enabled) { return; }
aOverride->enabled = false;
if (sAudioOverrides[aOverride->sequenceId].mod.enabled) {
sound_set_background_music_default_volume(
aOverride->sequenceId,
sAudioOverrides[aOverride->sequenceId].mod.defaultVolume
);
} else {
sound_reset_background_music_default_volume(aOverride->sequenceId);
}
DynOS_Audio_HotSwapIfActive(aOverride->sequenceId);
}
AudioOverrideEntry* DynOS_Audio_CreateOverride(u8 aSequenceId, u8 aBankId, u8 aDefaultVolume, const char *aFilepath, bool aIsPack) {
if (aSequenceId >= MAX_AUDIO_OVERRIDE) { return NULL; }
if (aSequenceId >= MAX_AUDIO_OVERRIDE) {
PrintError("Invalid sequenceId while creating override: %d", aSequenceId);
return NULL;
}
if (aBankId >= 64) {
PrintError("Invalid bankId while creating override: %d", aBankId);
return NULL;
}
AudioOverrideEntry* override = aIsPack ? &sAudioOverrides[aSequenceId].pack : &sAudioOverrides[aSequenceId].mod;
if (override->enabled) { audio_init(); }
if (override->enabled) {
if (aIsPack) {
PrintError("Pack sequence override already exists for sequence ID %d", aSequenceId);
return NULL;
}
audio_init();
}
DynOS_Audio_ResetEntry(override);
Print("Loading audio: %s", aFilepath);
override->sequenceId = aSequenceId;

View file

@ -1,5 +1,6 @@
#include <deque>
#include <regex>
#include <charconv>
#include "dynos.cpp.h"
extern "C" {
#include "engine/graph_node.h"
@ -10,6 +11,23 @@ static std::deque<PackData>& DynosPacks() {
return sDynosPacks;
}
static bool ParseU8(const std::string& s, u8& out) {
unsigned int value = 0;
auto [ptr, ec] = std::from_chars(s.data(), s.data() + s.size(), value);
// Reject:
// - parse errors
// - overflow
// - trailing junk
// - values outside u8 range
if (ec != std::errc() || ptr != s.data() + s.size() || value > 0xFF) {
return false;
}
out = static_cast<u8>(value);
return true;
}
static void ScanPackBins(struct PackData* aPack) {
DIR *_PackDir = opendir(aPack->mPath.c_str());
if (!_PackDir) { return; }
@ -45,13 +63,21 @@ static void ScanPackBins(struct PackData* aPack) {
std::regex re(".*_(\\d+)_(\\d+)_(\\d+)$");
std::smatch match;
if (std::regex_match(seqName, match, re) && match.size() == 4) {
u8 sequenceId = static_cast<u8>(std::stoi(match[1].str()));
u8 bankId = static_cast<u8>(std::stoi(match[2].str()));
u8 defaultVolume = static_cast<u8>(std::stoi(match[3].str()));
AudioOverrideEntry* audioOverride = DynOS_Audio_CreateOverride(sequenceId, bankId, defaultVolume, _FileName.c_str(), true);
if (audioOverride) {
aPack->mAudioOverrides.push_back(audioOverride);
u8 sequenceId, bankId, defaultVolume;
if (ParseU8(match[1].str(), sequenceId) &&
ParseU8(match[2].str(), bankId) &&
ParseU8(match[3].str(), defaultVolume)
) {
AudioOverrideEntry* audioOverride = DynOS_Audio_CreateOverride(sequenceId, bankId, defaultVolume, _FileName.c_str(), true);
if (audioOverride) {
aPack->mAudioOverrides.push_back(audioOverride);
}
}
} else {
PrintError(
"Invalid sequence override filename (expected format: <name>_<sequenceId>_<bankId>_<defaultVolume>.m64): '%s.m64'",
_SeqName.begin()
);
}
}
}