From 51a2334a707da177cf4672098c219125a40dda49 Mon Sep 17 00:00:00 2001
From: Garrett Cox <garrettjcox@gmail.com>
Date: Fri, 12 Jan 2024 10:25:40 -0600
Subject: [PATCH] Fix issue with dlists referencing offsets outside of their
 own file

---
 OTRExporter/DisplayListExporter.cpp | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/OTRExporter/DisplayListExporter.cpp b/OTRExporter/DisplayListExporter.cpp
index 0fc9bec..5aca607 100644
--- a/OTRExporter/DisplayListExporter.cpp
+++ b/OTRExporter/DisplayListExporter.cpp
@@ -454,9 +454,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++)