Browse Source

MpqArchives: Order by decreasing priority

pull/8009/head
Gleb Mazovetskiy 11 months ago committed by Anders Jenbo
parent
commit
af5431875f
  1. 14
      Source/engine/assets.cpp
  2. 4
      Source/engine/assets.hpp

14
Source/engine/assets.cpp

@ -3,6 +3,7 @@
#include <algorithm>
#include <cstdint>
#include <cstring>
#include <functional>
#include <vector>
#include "appfat.h"
@ -24,7 +25,7 @@
namespace devilution {
std::vector<std::string> OverridePaths;
std::map<int, MpqArchiveT> MpqArchives;
std::map<int, MpqArchiveT, std::greater<>> MpqArchives;
bool HasHellfireMpq;
namespace {
@ -32,10 +33,8 @@ namespace {
#ifdef UNPACKED_MPQS
char *FindUnpackedMpqFile(char *relativePath)
{
// Iterate over archives in reverse order to prefer files from high priority archives
char *path = nullptr;
for (auto rit = MpqArchives.rbegin(); rit != MpqArchives.rend(); ++rit) {
const std::string_view unpackedDir = rit->second;
for (const auto &[_, unpackedDir] : MpqArchives) {
path = relativePath - unpackedDir.size();
std::memcpy(path, unpackedDir.data(), unpackedDir.size());
if (FileExists(path)) break;
@ -62,10 +61,9 @@ bool FindMpqFile(std::string_view filename, MpqArchive **archive, uint32_t *file
{
const MpqFileHash fileHash = CalculateMpqFileHash(filename);
// Iterate over archives in reverse order to prefer files from high priority archives
for (auto rit = MpqArchives.rbegin(); rit != MpqArchives.rend(); ++rit) {
if (rit->second.GetFileNumber(fileHash, *fileNumber)) {
*archive = &rit->second;
for (auto &[_, mpqArchive] : MpqArchives) {
if (mpqArchive.GetFileNumber(fileHash, *fileNumber)) {
*archive = &mpqArchive;
return true;
}
}

4
Source/engine/assets.hpp

@ -3,8 +3,8 @@
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <functional>
#include <map>
#include <optional>
#include <span>
#include <string>
#include <string_view>
@ -285,7 +285,7 @@ using MpqArchiveT = std::string;
using MpqArchiveT = MpqArchive;
#endif
extern DVL_API_FOR_TEST std::map<int, MpqArchiveT> MpqArchives;
extern DVL_API_FOR_TEST std::map<int, MpqArchiveT, std::greater<>> MpqArchives;
constexpr int MainMpqPriority = 1000;
constexpr int DevilutionXMpqPriority = 9000;
constexpr int LangMpqPriority = 9100;

Loading…
Cancel
Save