1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-14 11:26:40 +00:00

Properly handle duplicated BSA folders

Deduplicate folders first and then add their files to mFiles.
This commit is contained in:
elsid 2025-09-19 13:05:30 +02:00
parent c92e321a08
commit 38f6c5a68b
No known key found for this signature in database
GPG key ID: B845CB9FEE18AB40
2 changed files with 16 additions and 9 deletions

View file

@ -175,19 +175,25 @@ namespace Bsa
for (auto& [folder, filelist] : folders) for (auto& [folder, filelist] : folders)
{ {
std::map<std::uint64_t, FileRecord> fileMap; std::map<std::uint64_t, FileRecord> fileMap;
for (const auto& file : filelist)
for (auto& file : filelist)
fileMap[file.mHash] = std::move(file); fileMap[file.mHash] = std::move(file);
auto& folderMap = mFolders[folder.mHash];
folderMap = FolderRecord{ folder.mCount, folder.mOffset, std::move(fileMap) }; mFolders[folder.mHash] = FolderRecord{ folder.mCount, folder.mOffset, folder.mName, std::move(fileMap) };
for (auto& [hash, fileRec] : folderMap.mFiles) }
for (auto& [folderHash, folderRecord] : mFolders)
{
for (auto& [fileHash, fileRecord] : folderRecord.mFiles)
{ {
FileStruct fileStruct{}; FileStruct fileStruct{};
fileStruct.mFileSize = fileRec.mSize & (~FileSizeFlag_Compression); fileStruct.mFileSize = fileRecord.mSize & (~FileSizeFlag_Compression);
fileStruct.mOffset = fileRec.mOffset; fileStruct.mOffset = fileRecord.mOffset;
fileStruct.mNameOffset = 0; fileStruct.mNameOffset = 0;
fileStruct.mNameSize = fileRec.mName.empty() ? 0 : static_cast<uint32_t>(fileRec.mName.size() - 1); fileStruct.mNameSize
fileStruct.mNamesBuffer = &fileRec.mName; = fileRecord.mName.empty() ? 0 : static_cast<uint32_t>(fileRecord.mName.size() - 1);
mFiles.emplace_back(fileStruct); fileStruct.mNamesBuffer = &fileRecord.mName;
mFiles.push_back(fileStruct);
} }
} }

View file

@ -103,6 +103,7 @@ namespace Bsa
{ {
std::uint32_t mCount; std::uint32_t mCount;
std::int64_t mOffset; std::int64_t mOffset;
std::string mName;
std::map<std::uint64_t, FileRecord> mFiles; std::map<std::uint64_t, FileRecord> mFiles;
}; };