summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2024-01-14 02:53:34 +0000
committerlouist103 <35883445+louist103@users.noreply.github.com>2024-03-02 12:13:15 -0500
commit906ddd81fd04e9e2b819a16fd6e6c1134c60e3ad (patch)
treebafda8d5abce9e438fe04cae684694afe2cb5e55
parentb6c2ee9cb4aa27eaaf4c87fc59c6dced99871f7a (diff)
Fix issue with dlists referencing offsets outside of their own file (#5)
-rw-r--r--OTRExporter/DisplayListExporter.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/OTRExporter/DisplayListExporter.cpp b/OTRExporter/DisplayListExporter.cpp
index 8f65bf7..5f84abe 100644
--- a/OTRExporter/DisplayListExporter.cpp
+++ b/OTRExporter/DisplayListExporter.cpp
@@ -455,9 +455,24 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
}
else
{
- word0 = 0;
- word1 = 0;
- spdlog::error(StringHelper::Sprintf("dListDecl == nullptr! Addr = {:08X}", GETSEGOFFSET(data)));
+ // If we can't find the display list in this file, try looking in other files based on the segment number
+ uint32_t seg = data & 0xFFFFFFFF;
+ std::string resourceName = "";
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, dList->parent, "", resourceName, res->parent->workerID);
+ if (foundDecl) {
+ ZFile* assocFile = Globals::Instance->GetSegment(GETSEGNUM(seg), res->parent->workerID);
+ std::string assocFileName = assocFile->GetName();
+ std::string fName = GetPathToRes(assocFile->resources[0], resourceName.c_str());
+
+ uint64_t hash = CRC64(fName.c_str());
+
+ word0 = hash >> 32;
+ word1 = hash & 0xFFFFFFFF;
+ } else {
+ word0 = 0;
+ word1 = 0;
+ spdlog::error(StringHelper::Sprintf("dListDecl == nullptr! Addr = {:08X}", GETSEGOFFSET(data)));
+ }
}
for (size_t i = 0; i < dList->otherDLists.size(); i++)