From f7a4f001778738e08af8a060b9803e1ab6620af3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 9 Jan 2024 17:22:59 +0100 Subject: [PATCH] adapted string table so that it can be initialized without full game data being available. This is for the IWAD picker which runs before many things are known. --- src/common/engine/stringtable.cpp | 17 ++++++++++------- src/common/engine/stringtable.h | 3 ++- src/common/platform/posix/sdl/i_system.cpp | 1 - src/d_iwad.cpp | 5 +++++ src/d_main.cpp | 6 +++--- src/launcher/launcherwindow.cpp | 7 ++++--- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/common/engine/stringtable.cpp b/src/common/engine/stringtable.cpp index 5fd020ed04..52d1f35437 100644 --- a/src/common/engine/stringtable.cpp +++ b/src/common/engine/stringtable.cpp @@ -47,27 +47,29 @@ // //========================================================================== -void FStringTable::LoadStrings (const char *language) +void FStringTable::LoadStrings (FileSys::FileSystem& fileSystem_, const char *language) { int lastlump, lump; + fileSystem = &fileSystem_; allStrings.Clear(); lastlump = 0; - while ((lump = fileSystem.FindLump("LMACROS", &lastlump)) != -1) + while ((lump = fileSystem->FindLump("LMACROS", &lastlump)) != -1) { readMacros(lump); } lastlump = 0; - while ((lump = fileSystem.FindLump ("LANGUAGE", &lastlump)) != -1) + while ((lump = fileSystem->FindLump ("LANGUAGE", &lastlump)) != -1) { - auto lumpdata = fileSystem.ReadFile(lump); + auto lumpdata = fileSystem->ReadFile(lump); if (!ParseLanguageCSV(lump, lumpdata.string(), lumpdata.size())) LoadLanguage (lump, lumpdata.string(), lumpdata.size()); } UpdateLanguage(language); allMacros.Clear(); + fileSystem = nullptr; } @@ -159,9 +161,10 @@ TArray> FStringTable::parseCSV(const char* buffer, size_t size) bool FStringTable::readMacros(int lumpnum) { - auto lumpdata = fileSystem.ReadFile(lumpnum); + auto lumpdata = fileSystem->ReadFile(lumpnum); auto data = parseCSV(lumpdata.string(), lumpdata.size()); + allMacros.Clear(); for (unsigned i = 1; i < data.Size(); i++) { auto macroname = data[i][0]; @@ -410,7 +413,7 @@ void FStringTable::DeleteForLabel(int lumpnum, FName label) { decltype(allStrings)::Iterator it(allStrings); decltype(allStrings)::Pair *pair; - auto filenum = fileSystem.GetFileContainer(lumpnum); + auto filenum = fileSystem->GetFileContainer(lumpnum); while (it.NextPair(pair)) { @@ -432,7 +435,7 @@ void FStringTable::DeleteForLabel(int lumpnum, FName label) void FStringTable::InsertString(int lumpnum, int langid, FName label, const FString &string) { const char *strlangid = (const char *)&langid; - TableElement te = { fileSystem.GetFileContainer(lumpnum), { string, string, string, string } }; + TableElement te = { fileSystem->GetFileContainer(lumpnum), { string, string, string, string } }; ptrdiff_t index; while ((index = te.strings[0].IndexOf("@[")) >= 0) { diff --git a/src/common/engine/stringtable.h b/src/common/engine/stringtable.h index 57827aa04b..0e0476353b 100644 --- a/src/common/engine/stringtable.h +++ b/src/common/engine/stringtable.h @@ -84,7 +84,7 @@ public: using LangMap = TMap; using StringMacroMap = TMap; - void LoadStrings(const char *language); + void LoadStrings(FileSys::FileSystem& fileSystem, const char *language); void UpdateLanguage(const char* language); StringMap GetDefaultStrings() { return allStrings[default_table]; } // Dehacked needs these for comparison void SetOverrideStrings(StringMap & map) @@ -108,6 +108,7 @@ public: private: + FileSys::FileSystem* fileSystem; FString activeLanguage; StringMacroMap allMacros; LangMap allStrings; diff --git a/src/common/platform/posix/sdl/i_system.cpp b/src/common/platform/posix/sdl/i_system.cpp index b563ed37a3..c6d3df291a 100644 --- a/src/common/platform/posix/sdl/i_system.cpp +++ b/src/common/platform/posix/sdl/i_system.cpp @@ -69,7 +69,6 @@ #ifndef NO_GTK bool I_GtkAvailable (); -int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad, int& autoloadflags); void I_ShowFatalError_Gtk(const char* errortext); #elif defined(__APPLE__) int I_PickIWad_Cocoa (WadStuff *wads, int numwads, bool showwin, int defaultiwad); diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 49586fd06e..f1495febcd 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -49,6 +49,7 @@ #include "fs_findfile.h" #include "findfile.h" #include "i_interface.h" +#include "gstrings.h" EXTERN_CVAR(Bool, queryiwad); EXTERN_CVAR(String, defaultiwad); @@ -56,6 +57,7 @@ EXTERN_CVAR(Bool, disableautoload) EXTERN_CVAR(Bool, autoloadlights) EXTERN_CVAR(Bool, autoloadbrightmaps) EXTERN_CVAR(Bool, autoloadwidescreen) +EXTERN_CVAR(String, language) //========================================================================== // @@ -313,12 +315,15 @@ FIWadManager::FIWadManager(const char *firstfn, const char *optfn) if (check.InitMultipleFiles(fns, &lfi, nullptr)) { + // this is for the IWAD picker. As we have a filesystem open here that contains the base files, it is the easiest place to load the strings early. + GStrings.LoadStrings(check, language); int num = check.CheckNumForName("IWADINFO"); if (num >= 0) { auto data = check.ReadFile(num); ParseIWadInfo("IWADINFO", data.string(), (int)data.size()); } + } } diff --git a/src/d_main.cpp b/src/d_main.cpp index 496bb6d270..d225066bf6 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2641,7 +2641,7 @@ int StrTable_GetGender() bool StrTable_ValidFilter(const char* str) { if (gameinfo.gametype == GAME_Strife && (gameinfo.flags & GI_SHAREWARE) && !stricmp(str, "strifeteaser")) return true; - return stricmp(str, GameNames[gameinfo.gametype]) == 0; + return gameinfo.gametype == 0 || stricmp(str, GameNames[gameinfo.gametype]) == 0; } bool System_WantGuiCapture() @@ -3238,8 +3238,8 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector& allw exec = NULL; } - // [RH] Initialize localizable strings. - GStrings.LoadStrings (language); + // [RH] Initialize localizable strings. + GStrings.LoadStrings(fileSystem, language); V_InitFontColors (); diff --git a/src/launcher/launcherwindow.cpp b/src/launcher/launcherwindow.cpp index 220169272d..304a565490 100644 --- a/src/launcher/launcherwindow.cpp +++ b/src/launcher/launcherwindow.cpp @@ -2,6 +2,7 @@ #include "v_video.h" #include "version.h" #include "i_interface.h" +#include "gstrings.h" #include #include #include @@ -83,9 +84,9 @@ LauncherWindow::LauncherWindow(WadStuff* wads, int numwads, int defaultiwad, int OpenGLCheckbox = new CheckboxLabel(this); GLESCheckbox = new CheckboxLabel(this); BackendLabel->SetText("Render Backend"); - VulkanCheckbox->SetText("Vulkan"); - OpenGLCheckbox->SetText("OpenGL"); - GLESCheckbox->SetText("OpenGL ES"); + VulkanCheckbox->SetText(GStrings("OPTVAL_VULKAN")); + OpenGLCheckbox->SetText(GStrings("OPTVAL_OPENGL")); + GLESCheckbox->SetText(GStrings("OPTVAL_OPENGLES")); #endif FString welcomeText, versionText;