Browse Source

Split loading of MPQs to handle translations and voice packs (#3922)

pull/3920/head
Andrew James 4 years ago committed by GitHub
parent
commit
d3aedf5df1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      Source/diablo.cpp
  2. 43
      Source/init.cpp
  3. 5
      Source/init.h
  4. 2
      Source/options.cpp

9
Source/diablo.cpp

@ -1629,10 +1629,17 @@ int DiabloMain(int argc, char **argv)
DiabloParseFlags(argc, argv);
InitKeymapActions();
init_archives();
// Need to ensure devilutionx.mpq (and fonts.mpq if available) are loaded before attempting to read translation settings
LoadCoreArchives();
was_archives_init = true;
// Read settings including translation next. This will use the presence of fonts.mpq and look for assets in devilutionx.mpq
LoadOptions();
// Then look for a voice pack file based on the selected translation
LoadLanguageArchive();
// Finally load game data
LoadGameArchives();
DiabloInit();

43
Source/init.cpp

@ -60,13 +60,13 @@ std::optional<MpqArchive> font_mpq;
namespace {
std::optional<MpqArchive> LoadMPQ(const std::vector<std::string> &paths, const char *mpqName)
std::optional<MpqArchive> LoadMPQ(const std::vector<std::string> &paths, string_view mpqName)
{
std::optional<MpqArchive> archive;
std::string mpqAbsPath;
std::int32_t error = 0;
for (const auto &path : paths) {
mpqAbsPath = path + mpqName;
mpqAbsPath = path + mpqName.data();
if ((archive = MpqArchive::Open(mpqAbsPath.c_str(), error))) {
LogVerbose(" Found: {} in {}", mpqName, path);
paths::SetMpqDir(path);
@ -125,18 +125,6 @@ std::vector<std::string> GetMPQSearchPaths()
return paths;
}
void init_language_archives(const std::vector<std::string> &paths)
{
string_view code = *sgOptions.Language.code;
if (code != "en") {
char langMpqName[10] = {};
CopyUtf8(langMpqName, code.data(), sizeof(langMpqName));
strncat(langMpqName, ".mpq", sizeof(langMpqName) - strlen(langMpqName) - 1);
lang_mpq = LoadMPQ(paths, langMpqName);
}
}
} // namespace
void init_cleanup()
@ -160,7 +148,7 @@ void init_cleanup()
NetClose();
}
void init_archives()
void LoadCoreArchives()
{
auto paths = GetMPQSearchPaths();
@ -169,8 +157,25 @@ void init_archives()
devilutionx_mpq = LoadMPQ(paths, "devilutionx.mpq");
#endif
font_mpq = LoadMPQ(paths, "fonts.mpq"); // Extra fonts
}
init_language_archives(paths);
void LoadLanguageArchive()
{
lang_mpq = std::nullopt;
string_view code = *sgOptions.Language.code;
if (code != "en") {
std::string langMpqName { code };
langMpqName.append(".mpq");
auto paths = GetMPQSearchPaths();
lang_mpq = LoadMPQ(paths, langMpqName);
}
}
void LoadGameArchives()
{
auto paths = GetMPQSearchPaths();
diabdat_mpq = LoadMPQ(paths, "DIABDAT.MPQ");
if (!diabdat_mpq) {
@ -212,12 +217,6 @@ void init_archives()
}
}
void init_language_archives()
{
lang_mpq = std::nullopt;
init_language_archives(GetMPQSearchPaths());
}
void init_create_window()
{
if (!SpawnWindow(PROJECT_NAME))

5
Source/init.h

@ -30,8 +30,9 @@ extern std::optional<MpqArchive> lang_mpq;
extern std::optional<MpqArchive> devilutionx_mpq;
void init_cleanup();
void init_archives();
void init_language_archives();
void LoadCoreArchives();
void LoadLanguageArchive();
void LoadGameArchives();
void init_create_window();
void MainWndProc(uint32_t Msg);
WNDPROC SetWindowProc(WNDPROC NewProc);

2
Source/options.cpp

@ -271,7 +271,7 @@ void OptionShowFPSChanged()
void OptionLanguageCodeChanged()
{
LanguageInitialize();
init_language_archives();
LoadLanguageArchive();
}
void OptionGameModeChanged()

Loading…
Cancel
Save