summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2026-05-11 22:18:07 -0600
committerKiritoDv <kiritodev01@gmail.com>2026-05-11 22:18:07 -0600
commitc478d07b981eea98acc897d5eff2003f61138272 (patch)
tree659737de25291842ba097eb650f6187b2b8691b5
parentf373d80d3cdb76ac77e9574687f58e303936f6f9 (diff)
Fixed samples being duplicated among other assets probably
-rw-r--r--src/Companion.cpp8
-rw-r--r--src/factories/naudio/v1/AudioTableFactory.cpp27
-rw-r--r--src/factories/naudio/v1/SampleFactory.cpp5
3 files changed, 33 insertions, 7 deletions
diff --git a/src/Companion.cpp b/src/Companion.cpp
index 743368f..93aefbc 100644
--- a/src/Companion.cpp
+++ b/src/Companion.cpp
@@ -666,6 +666,11 @@ void Companion::ProcessFile(YAML::Node root) {
void Companion::ProcessFile(YAML::Node root, std::atomic<size_t>& assetCount) {
assetCount++;
+ // Reset per-file state so segment/offset settings from a previous file don't
+ // bleed into this file's Phase 1 gAddrMap registration.
+ gCurrentSegmentNumber = 0;
+ gCurrentFileOffset = 0;
+ gCurrentCompressionType = CompressionType::None;
// Set compressed file offsets and compression type
if (auto segments = root[":config"]["segments"]) {
if (segments.IsSequence() && segments.size() > 0) {
@@ -711,7 +716,8 @@ void Companion::ProcessFile(YAML::Node root, std::atomic<size_t>& assetCount) {
node["path"] = gCurrentVirtualPath;
}
- this->gAddrMap[this->gCurrentFile][node["offset"].as<uint32_t>()] = std::make_tuple(output, node);
+ auto off = node["offset"].as<uint32_t>();
+ this->gAddrMap[this->gCurrentFile][off] = std::make_tuple(output, node);
}
// Stupid hack because the iteration broke the assets
diff --git a/src/factories/naudio/v1/AudioTableFactory.cpp b/src/factories/naudio/v1/AudioTableFactory.cpp
index a41bad1..be80f08 100644
--- a/src/factories/naudio/v1/AudioTableFactory.cpp
+++ b/src/factories/naudio/v1/AudioTableFactory.cpp
@@ -141,23 +141,38 @@ std::optional<std::shared_ptr<IParsedData>> AudioTableFactory::parse(std::vector
auto explicitSamples = Companion::Instance->GetNodesByType("NAUDIO:V1:SAMPLE");
if (explicitSamples.has_value()) {
auto& fontBuf = AudioContext::tables[AudioTableType::FONT_TABLE].buffer;
- for (auto& [path, node] : explicitSamples.value()) {
- auto sampleOffset = GetSafeNode<uint32_t>(node, "offset");
- auto sampleBankId = GetSafeNode<uint32_t>(node, "sampleBankId");
- // Read physical sampleAddr (second u32 in the Sample struct) from
- // the font-table buffer. flags is first, sampleAddr is second.
- if (sampleOffset + 8 > fontBuf.size()) {
+ size_t prePopCount = 0;
+ size_t skippedCount = 0;
+ SPDLOG_INFO("Pre-populating sampleDedup from {} explicit NAUDIO:V1:SAMPLE entries (fontBuf size=0x{:X})",
+ explicitSamples->size(), fontBuf.size());
+ for (auto& [path, sampleNode] : explicitSamples.value()) {
+ uint32_t sampleOffset = 0, sampleBankId = 0;
+ try {
+ sampleOffset = GetSafeNode<uint32_t>(sampleNode, "offset");
+ sampleBankId = GetSafeNode<uint32_t>(sampleNode, "sampleBankId");
+ } catch (...) {
+ SPDLOG_WARN("sampleDedup pre-pop: skipping {} — missing offset or sampleBankId", path);
+ skippedCount++;
+ continue;
+ }
+ if (sampleOffset == 0 || sampleOffset + 8 > fontBuf.size()) {
+ SPDLOG_WARN("sampleDedup pre-pop: skipping {} — offset 0x{:X} out of fontBuf bounds (0x{:X})",
+ path, sampleOffset, fontBuf.size());
+ skippedCount++;
continue;
}
auto sReader = AudioContext::MakeReader(AudioTableType::FONT_TABLE, sampleOffset);
sReader.ReadUInt32(); // skip flags
uint32_t sampleAddr = sReader.ReadUInt32();
if (sampleAddr == 0) {
+ skippedCount++;
continue;
}
uint64_t key = ((uint64_t)sampleBankId << 32) | (uint64_t)sampleAddr;
AudioContext::sampleDedup[key] = path;
+ prePopCount++;
}
+ SPDLOG_INFO("sampleDedup pre-pop done: {} registered, {} skipped", prePopCount, skippedCount);
}
}
diff --git a/src/factories/naudio/v1/SampleFactory.cpp b/src/factories/naudio/v1/SampleFactory.cpp
index 47f971f..d72f79d 100644
--- a/src/factories/naudio/v1/SampleFactory.cpp
+++ b/src/factories/naudio/v1/SampleFactory.cpp
@@ -51,6 +51,11 @@ ExportResult NSampleBinaryExporter::Export(std::ostream& write, std::shared_ptr<
ExportResult NSampleModdingExporter::Export(std::ostream& write, std::shared_ptr<IParsedData> raw,
std::string& entryName, YAML::Node& node, std::string* replacement) {
+ // Skip unnamed auto-generated samples — only explicitly declared (aliased) samples
+ // are useful for modding replacement.
+ if (GetSafeNode<bool>(node, "autogen", false)) {
+ return std::nullopt;
+ }
auto aiff = LUS::BinaryWriter();
auto data = std::static_pointer_cast<NSampleData>(raw);