mirror of
https://github.com/OpenMW/openmw.git
synced 2025-10-14 06:26:36 +00:00
Properly handle duplicated BSA folders
Deduplicate folders first and then add their files to mFiles.
This commit is contained in:
parent
c92e321a08
commit
38f6c5a68b
2 changed files with 16 additions and 9 deletions
|
@ -175,19 +175,25 @@ namespace Bsa
|
|||
for (auto& [folder, filelist] : folders)
|
||||
{
|
||||
std::map<std::uint64_t, FileRecord> fileMap;
|
||||
for (const auto& file : filelist)
|
||||
|
||||
for (auto& file : filelist)
|
||||
fileMap[file.mHash] = std::move(file);
|
||||
auto& folderMap = mFolders[folder.mHash];
|
||||
folderMap = FolderRecord{ folder.mCount, folder.mOffset, std::move(fileMap) };
|
||||
for (auto& [hash, fileRec] : folderMap.mFiles)
|
||||
|
||||
mFolders[folder.mHash] = FolderRecord{ folder.mCount, folder.mOffset, folder.mName, std::move(fileMap) };
|
||||
}
|
||||
|
||||
for (auto& [folderHash, folderRecord] : mFolders)
|
||||
{
|
||||
for (auto& [fileHash, fileRecord] : folderRecord.mFiles)
|
||||
{
|
||||
FileStruct fileStruct{};
|
||||
fileStruct.mFileSize = fileRec.mSize & (~FileSizeFlag_Compression);
|
||||
fileStruct.mOffset = fileRec.mOffset;
|
||||
fileStruct.mFileSize = fileRecord.mSize & (~FileSizeFlag_Compression);
|
||||
fileStruct.mOffset = fileRecord.mOffset;
|
||||
fileStruct.mNameOffset = 0;
|
||||
fileStruct.mNameSize = fileRec.mName.empty() ? 0 : static_cast<uint32_t>(fileRec.mName.size() - 1);
|
||||
fileStruct.mNamesBuffer = &fileRec.mName;
|
||||
mFiles.emplace_back(fileStruct);
|
||||
fileStruct.mNameSize
|
||||
= fileRecord.mName.empty() ? 0 : static_cast<uint32_t>(fileRecord.mName.size() - 1);
|
||||
fileStruct.mNamesBuffer = &fileRecord.mName;
|
||||
mFiles.push_back(fileStruct);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -103,6 +103,7 @@ namespace Bsa
|
|||
{
|
||||
std::uint32_t mCount;
|
||||
std::int64_t mOffset;
|
||||
std::string mName;
|
||||
std::map<std::uint64_t, FileRecord> mFiles;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue