From f2d7bbea99d1174a63a3a0a4aae302fb2d582bb9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 21 Apr 2024 10:30:40 +0200 Subject: [PATCH] Instead of going through a global callback function set the string table's default gender at the start of each frame This will perform the CVAR lookup only once per frame, not once per string. --- src/common/engine/i_interface.h | 1 - src/common/engine/stringtable.cpp | 6 +++--- src/common/engine/stringtable.h | 2 ++ src/d_main.cpp | 8 ++------ 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/common/engine/i_interface.h b/src/common/engine/i_interface.h index ff35d6286..4289bfeab 100644 --- a/src/common/engine/i_interface.h +++ b/src/common/engine/i_interface.h @@ -31,7 +31,6 @@ struct SystemCallbacks FString(*GetPlayerName)(int i); bool (*DispatchEvent)(event_t* ev); bool (*CheckGame)(const char* nm); - int (*GetGender)(); void (*MenuClosed)(); bool (*CheckMenudefOption)(const char* opt); void (*ConsoleToggled)(int state); diff --git a/src/common/engine/stringtable.cpp b/src/common/engine/stringtable.cpp index c126049d4..707b59b69 100644 --- a/src/common/engine/stringtable.cpp +++ b/src/common/engine/stringtable.cpp @@ -164,7 +164,7 @@ bool FStringTable::readMacros(const char* buffer, size_t size) auto data = parseCSV(buffer, size); allMacros.Clear(); - for (unsigned i = 1; i < size; i++) + for (unsigned i = 1; i < data.Size(); i++) { auto macroname = data[i][0]; FName name = macroname.GetChars(); @@ -583,7 +583,7 @@ const char *FStringTable::CheckString(const char *name, uint32_t *langtable, int { return nullptr; } - if (gender == -1 && sysCallbacks.GetGender) gender = sysCallbacks.GetGender(); + if (gender == -1) gender = defaultgender; if (gender < 0 || gender > 3) gender = 0; FName nm(name, true); if (nm != NAME_None) @@ -623,7 +623,7 @@ const char *FStringTable::GetLanguageString(const char *name, uint32_t langtable { return nullptr; } - if (gender == -1 && sysCallbacks.GetGender) gender = sysCallbacks.GetGender(); + if (gender == -1) gender = defaultgender; if (gender < 0 || gender > 3) gender = 0; FName nm(name, true); if (nm != NAME_None) diff --git a/src/common/engine/stringtable.h b/src/common/engine/stringtable.h index 73867ba39..181d8c7f3 100644 --- a/src/common/engine/stringtable.h +++ b/src/common/engine/stringtable.h @@ -101,6 +101,7 @@ public: bool exists(const char *name); void InsertString(int filenum, int langid, FName label, const FString& string); + void SetDefaultGender(int gender) { defaultgender = gender; } private: @@ -108,6 +109,7 @@ private: StringMacroMap allMacros; LangMap allStrings; TArray> currentLanguageSet; + int defaultgender = 0; void LoadLanguage (int lumpnum, const char* buffer, size_t size); TArray> parseCSV(const char* buffer, size_t size); diff --git a/src/d_main.cpp b/src/d_main.cpp index 3055d2751..723fff388 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1197,6 +1197,8 @@ void D_DoomLoop () { try { + GStrings.SetDefaultGender(players[consoleplayer].userinfo.GetGender()); // cannot be done when the CVAR changes because we don't know if it's for the consoleplayer. + // frame syncronous IO operations if (gametic > lasttic) { @@ -2639,11 +2641,6 @@ void Mlook_ReleaseHandler() } } -int StrTable_GetGender() -{ - return players[consoleplayer].userinfo.GetGender(); -} - bool StrTable_ValidFilter(const char* str) { if (gameinfo.gametype == GAME_Strife && (gameinfo.flags & GI_SHAREWARE) && !stricmp(str, "strifeteaser")) return true; @@ -3647,7 +3644,6 @@ static int D_DoomMain_Internal (void) System_GetPlayerName, System_DispatchEvent, StrTable_ValidFilter, - StrTable_GetGender, nullptr, CheckSkipGameOptionBlock, System_ConsoleToggled,