diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2026-05-11 22:18:07 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2026-05-11 22:18:07 -0600 |
| commit | c478d07b981eea98acc897d5eff2003f61138272 (patch) | |
| tree | 659737de25291842ba097eb650f6187b2b8691b5 | |
| parent | f373d80d3cdb76ac77e9574687f58e303936f6f9 (diff) | |
Fixed samples being duplicated among other assets probably
| -rw-r--r-- | src/Companion.cpp | 8 | ||||
| -rw-r--r-- | src/factories/naudio/v1/AudioTableFactory.cpp | 27 | ||||
| -rw-r--r-- | src/factories/naudio/v1/SampleFactory.cpp | 5 |
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); |
