StringTable cleanup and improvements

cleaned up function interface to avoid referencing the file system in the worker functions.
replaced StringTable's operators with functions.. The main reason is that these are far easier to look up when browsing the source.
This also fixes a premature translation in SBARINFO that was done in the parsing stage, not the printing stage.
This commit is contained in:
Christoph Oelckers 2024-04-21 10:07:14 +02:00
parent f4a42dae1d
commit ebd4ebf298
50 changed files with 245 additions and 246 deletions

View file

@ -216,19 +216,19 @@ CCMD(am_togglefollow)
am_followplayer = !am_followplayer;
if (primaryLevel && primaryLevel->automap)
primaryLevel->automap->ResetFollowLocation();
Printf("%s\n", GStrings(am_followplayer ? "AMSTR_FOLLOWON" : "AMSTR_FOLLOWOFF"));
Printf("%s\n", GStrings.GetString(am_followplayer ? "AMSTR_FOLLOWON" : "AMSTR_FOLLOWOFF"));
}
CCMD(am_togglegrid)
{
am_showgrid = !am_showgrid;
Printf("%s\n", GStrings(am_showgrid ? "AMSTR_GRIDON" : "AMSTR_GRIDOFF"));
Printf("%s\n", GStrings.GetString(am_showgrid ? "AMSTR_GRIDON" : "AMSTR_GRIDOFF"));
}
CCMD(am_toggletexture)
{
am_textured = !am_textured;
Printf("%s\n", GStrings(am_textured ? "AMSTR_TEXON" : "AMSTR_TEXOFF"));
Printf("%s\n", GStrings.GetString(am_textured ? "AMSTR_TEXON" : "AMSTR_TEXOFF"));
}
CCMD(am_setmark)
@ -238,7 +238,7 @@ CCMD(am_setmark)
int m = primaryLevel->automap->addMark();
if (m >= 0)
{
Printf("%s %d\n", GStrings("AMSTR_MARKEDSPOT"), m);
Printf("%s %d\n", GStrings.GetString("AMSTR_MARKEDSPOT"), m);
}
}
}
@ -247,7 +247,7 @@ CCMD(am_clearmarks)
{
if (primaryLevel && primaryLevel->automap && primaryLevel->automap->clearMarks())
{
Printf("%s\n", GStrings("AMSTR_MARKSCLEARED"));
Printf("%s\n", GStrings.GetString("AMSTR_MARKSCLEARED"));
}
}

View file

@ -261,7 +261,7 @@ bool AnnounceKill (AActor *killer, AActor *killee)
playSound |= killer->CheckLocalView();
}
message = GStrings(choice->Message);
message = GStrings.GetString(choice->Message);
if (message != NULL)
{
char assembled[1024];
@ -293,7 +293,7 @@ bool AnnounceTelefrag (AActor *killer, AActor *killee)
if (cl_bbannounce && multiplayer)
{
const char *message = GStrings("OB_MPTELEFRAG");
const char *message = GStrings.GetString("OB_MPTELEFRAG");
if (message != NULL)
{
char assembled[1024];

View file

@ -380,7 +380,7 @@ void DrawText(F2DDrawer *drawer, FFont* font, int normalcolor, double x, double
{
return;
}
const char *txt = (parms.localize && string[0] == '$') ? GStrings(&string[1]) : string;
const char *txt = (parms.localize && string[0] == '$') ? GStrings.GetString(&string[1]) : string;
DrawTextCommon(drawer, font, normalcolor, x, y, (const uint8_t*)string, parms);
}
@ -419,7 +419,7 @@ void DrawText(F2DDrawer *drawer, FFont *font, int normalcolor, double x, double
{
return;
}
const char *txt = (parms.localize && string[0] == '$') ? GStrings(&string[1]) : string.GetChars();
const char *txt = (parms.localize && string[0] == '$') ? GStrings.GetString(&string[1]) : string.GetChars();
DrawTextCommon(drawer, font, normalcolor, x, y, (uint8_t*)txt, parms);
}

View file

@ -80,7 +80,7 @@ CCMD (print)
Printf ("print <name>: Print a string from the string table\n");
return;
}
const char *str = GStrings[argv[1]];
const char *str = GStrings.CheckString(argv[1]);
if (str == NULL)
{
Printf ("%s unknown\n", argv[1]);
@ -304,7 +304,7 @@ CCMD(printlocalized)
return;
}
}
Printf("%s\n", GStrings(argv[1]));
Printf("%s\n", GStrings.GetString(argv[1]));
}
}

View file

@ -47,29 +47,29 @@
//
//==========================================================================
void FStringTable::LoadStrings (FileSys::FileSystem& fileSystem_, 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);
auto lumpdata = fileSystem.ReadFile(lump);
readMacros(lumpdata.string(), lumpdata.size());
}
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);
auto filenum = fileSystem.GetFileContainer(lump);
if (!ParseLanguageCSV(lump, lumpdata.string(), lumpdata.size()))
LoadLanguage (lump, lumpdata.string(), lumpdata.size());
if (!ParseLanguageCSV(filenum, lumpdata.string(), lumpdata.size()))
LoadLanguage (filenum, lumpdata.string(), lumpdata.size());
}
UpdateLanguage(language);
allMacros.Clear();
fileSystem = nullptr;
}
@ -159,13 +159,12 @@ TArray<TArray<FString>> FStringTable::parseCSV(const char* buffer, size_t size)
//
//==========================================================================
bool FStringTable::readMacros(int lumpnum)
bool FStringTable::readMacros(const char* buffer, size_t size)
{
auto lumpdata = fileSystem->ReadFile(lumpnum);
auto data = parseCSV(lumpdata.string(), lumpdata.size());
auto data = parseCSV(buffer, size);
allMacros.Clear();
for (unsigned i = 1; i < data.Size(); i++)
for (unsigned i = 1; i < size; i++)
{
auto macroname = data[i][0];
FName name = macroname.GetChars();
@ -187,7 +186,7 @@ bool FStringTable::readMacros(int lumpnum)
//
//==========================================================================
bool FStringTable::ParseLanguageCSV(int lumpnum, const char* buffer, size_t size)
bool FStringTable::ParseLanguageCSV(int filenum, const char* buffer, size_t size)
{
if (size < 11) return false;
if (strnicmp(buffer, "default,", 8) && strnicmp(buffer, "identifier,", 11 )) return false;
@ -258,14 +257,14 @@ bool FStringTable::ParseLanguageCSV(int lumpnum, const char* buffer, size_t size
FName strName = row[labelcol].GetChars();
if (hasDefaultEntry)
{
DeleteForLabel(lumpnum, strName);
DeleteForLabel(filenum, strName);
}
for (auto &langentry : langrows)
{
auto str = row[langentry.first];
if (str.Len() > 0)
{
InsertString(lumpnum, langentry.second, strName, str);
InsertString(filenum, langentry.second, strName, str);
}
else
{
@ -409,11 +408,10 @@ void FStringTable::DeleteString(int langid, FName label)
//
//==========================================================================
void FStringTable::DeleteForLabel(int lumpnum, FName label)
void FStringTable::DeleteForLabel(int filenum, FName label)
{
decltype(allStrings)::Iterator it(allStrings);
decltype(allStrings)::Pair *pair;
auto filenum = fileSystem->GetFileContainer(lumpnum);
while (it.NextPair(pair))
{
@ -432,10 +430,10 @@ void FStringTable::DeleteForLabel(int lumpnum, FName label)
//
//==========================================================================
void FStringTable::InsertString(int lumpnum, int langid, FName label, const FString &string)
void FStringTable::InsertString(int filenum, int langid, FName label, const FString &string)
{
const char *strlangid = (const char *)&langid;
TableElement te = { fileSystem->GetFileContainer(lumpnum), { string, string, string, string } };
TableElement te = { filenum, { string, string, string, string } };
ptrdiff_t index;
while ((index = te.strings[0].IndexOf("@[")) >= 0)
{
@ -579,7 +577,7 @@ bool FStringTable::exists(const char *name)
//
//==========================================================================
const char *FStringTable::GetString(const char *name, uint32_t *langtable, int gender) const
const char *FStringTable::CheckString(const char *name, uint32_t *langtable, int gender) const
{
if (name == nullptr || *name == 0)
{
@ -590,15 +588,22 @@ const char *FStringTable::GetString(const char *name, uint32_t *langtable, int g
FName nm(name, true);
if (nm != NAME_None)
{
TableElement* bestItem = nullptr;
for (auto map : currentLanguageSet)
{
auto item = map.second->CheckKey(nm);
if (item)
{
if (bestItem && bestItem->filenum > item->filenum)
{
// prioritize content from later files, even if the language doesn't fully match.
// This is mainly for Dehacked content.
continue;
}
if (langtable) *langtable = map.first;
auto c = item->strings[gender].GetChars();
if (c && *c == '$' && c[1] == '$')
return GetString(c + 2, langtable, gender);
c = CheckString(c + 2, langtable, gender);
return c;
}
}
@ -608,7 +613,7 @@ const char *FStringTable::GetString(const char *name, uint32_t *langtable, int g
//==========================================================================
//
// Finds a string by name in a given language
// Finds a string by name in a given language without attempting any substitution
//
//==========================================================================
@ -655,9 +660,9 @@ bool FStringTable::MatchDefaultString(const char *name, const char *content) con
//
//==========================================================================
const char *FStringTable::operator() (const char *name) const
const char *FStringTable::GetString(const char *name) const
{
const char *str = operator[] (name);
const char *str = CheckString(name, nullptr);
return str ? str : name;
}

View file

@ -95,20 +95,15 @@ public:
const char *GetLanguageString(const char *name, uint32_t langtable, int gender = -1) const;
bool MatchDefaultString(const char *name, const char *content) const;
const char *GetString(const char *name, uint32_t *langtable, int gender = -1) const;
const char *operator() (const char *name) const; // Never returns NULL
const char* operator() (const FString& name) const { return operator()(name.GetChars()); }
const char *operator[] (const char *name) const
{
return GetString(name, nullptr);
}
const char *CheckString(const char *name, uint32_t *langtable = nullptr, int gender = -1) const;
const char* GetString(const char* name) const;
const char* GetString(const FString& name) const { return GetString(name.GetChars()); }
bool exists(const char *name);
void InsertString(int lumpnum, int langid, FName label, const FString& string);
void InsertString(int filenum, int langid, FName label, const FString& string);
private:
FileSys::FileSystem* fileSystem;
FString activeLanguage;
StringMacroMap allMacros;
LangMap allStrings;
@ -116,11 +111,11 @@ private:
void LoadLanguage (int lumpnum, const char* buffer, size_t size);
TArray<TArray<FString>> parseCSV(const char* buffer, size_t size);
bool ParseLanguageCSV(int lumpnum, const char* buffer, size_t size);
bool ParseLanguageCSV(int filenum, const char* buffer, size_t size);
bool readMacros(int lumpnum);
bool readMacros(const char* buffer, size_t size);
void DeleteString(int langid, FName label);
void DeleteForLabel(int lumpnum, FName label);
void DeleteForLabel(int filenum, FName label);
static size_t ProcessEscapes (char *str);
public:
@ -138,7 +133,7 @@ public:
const char* localize(const char* str)
{
return *str == '$' ? operator()(str + 1) : str;
return *str == '$' ? GetString(str + 1) : str;
}
};

View file

@ -271,12 +271,12 @@ bool CheckFontComplete(FFont* font)
{
// Also check if the SmallFont contains all characters this language needs.
// If not, switch back to the original one.
return font->CanPrint(GStrings["REQUIRED_CHARACTERS"]);
return font->CanPrint(GStrings.CheckString("REQUIRED_CHARACTERS"));
}
void UpdateGenericUI(bool cvar)
{
auto switchstr = GStrings["USE_GENERIC_FONT"];
auto switchstr = GStrings.CheckString("USE_GENERIC_FONT");
generic_ui = (cvar || (switchstr && strtoll(switchstr, nullptr, 0)));
if (!generic_ui)
{
@ -311,7 +311,7 @@ void UpdateGenericUI(bool cvar)
}
}
// Turkish i crap. What a mess, just to save two code points... :(
switchstr = GStrings["REQUIRED_CHARACTERS"];
switchstr = GStrings.CheckString("REQUIRED_CHARACTERS");
special_i = switchstr && strstr(switchstr, "\xc4\xb0") != nullptr; // capital dotted i (İ).
if (special_i)
{

View file

@ -470,7 +470,7 @@ DEFINE_ACTION_FUNCTION(FSavegameManager, GetSavegame)
void FSavegameManagerBase::InsertNewSaveNode()
{
NewSaveNode.SaveTitle = GStrings("NEWSAVE");
NewSaveNode.SaveTitle = GStrings.GetString("NEWSAVE");
NewSaveNode.bNoDelete = true;
SaveGames.Insert(0, &NewSaveNode);
}

View file

@ -282,9 +282,9 @@ DEFINE_ACTION_FUNCTION(FStringStruct, DeleteLastCharacter)
static void LocalizeString(const FString &label, bool prefixed, FString *result)
{
if (!prefixed) *result = GStrings(label);
if (!prefixed) *result = GStrings.GetString(label);
else if (label[0] != '$') *result = label;
else *result = GStrings(&label[1]);
else *result = GStrings.GetString(&label[1]);
}
DEFINE_ACTION_FUNCTION_NATIVE(FStringTable, Localize, LocalizeString)

View file

@ -670,7 +670,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetBottomAlignOffset, GetBottomAlignOffset)
static int StringWidth(FFont *font, const FString &str, int localize)
{
const char *txt = (localize && str[0] == '$') ? GStrings(&str[1]) : str.GetChars();
const char *txt = (localize && str[0] == '$') ? GStrings.GetString(&str[1]) : str.GetChars();
return font->StringWidth(txt);
}
@ -684,7 +684,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, StringWidth, StringWidth)
static int GetMaxAscender(FFont* font, const FString& str, int localize)
{
const char* txt = (localize && str[0] == '$') ? GStrings(&str[1]) : str.GetChars();
const char* txt = (localize && str[0] == '$') ? GStrings.GetString(&str[1]) : str.GetChars();
return font->GetMaxAscender(txt);
}
@ -698,7 +698,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FFont, GetMaxAscender, GetMaxAscender)
static int CanPrint(FFont *font, const FString &str, int localize)
{
const char *txt = (localize && str[0] == '$') ? GStrings(&str[1]) : str.GetChars();
const char *txt = (localize && str[0] == '$') ? GStrings.GetString(&str[1]) : str.GetChars();
return font->CanPrint(txt);
}

View file

@ -111,7 +111,7 @@ FEndoomScreen::FEndoomScreen(int loading_lump)
StartupBitmap.Create(80 * 8, 26 * 16); // line 26 is for our own 'press any key to quit' message.
DrawTextScreen(StartupBitmap, endoom_screen);
ClearBlock(StartupBitmap, {0, 0, 0, 255}, 0, 25*16, 640, 16);
DrawString(StartupBitmap, 0, 25, GStrings("TXT_QUITENDOOM"), { 128, 128, 128 ,255}, { 0, 0, 0, 255});
DrawString(StartupBitmap, 0, 25, GStrings.GetString("TXT_QUITENDOOM"), { 128, 128, 128 ,255}, { 0, 0, 0, 255});
lastUpdateTime = I_msTime();
// Does this screen need blinking?

View file

@ -607,7 +607,7 @@ bool FStartScreen::NetInit(const char* message, int numplayers)
{
NetMaxPos = numplayers;
NetCurPos = 0;
NetMessageString.Format("%s %s", message, GStrings("TXT_NET_PRESSESC"));
NetMessageString.Format("%s %s", message, GStrings.GetString("TXT_NET_PRESSESC"));
NetProgress(1); // You always know about yourself
return true;
}

View file

@ -378,7 +378,7 @@ FGameTexture *FTextureManager::FindGameTexture(const char *texname, ETextureType
bool FTextureManager::OkForLocalization(FTextureID texnum, const char *substitute, int locmode)
{
uint32_t langtable = 0;
if (*substitute == '$') substitute = GStrings.GetString(substitute+1, &langtable);
if (*substitute == '$') substitute = GStrings.CheckString(substitute+1, &langtable);
else return true; // String literals from the source data should never override graphics from the same definition.
if (substitute == nullptr) return true; // The text does not exist.

View file

@ -313,7 +313,7 @@ CCMD (idclev)
return;
// So be it.
Printf ("%s\n", GStrings("STSTR_CLEV"));
Printf ("%s\n", GStrings.GetString("STSTR_CLEV"));
G_DeferedInitNew (mapname.GetChars());
//players[0].health = 0; // Force reset
}
@ -337,7 +337,7 @@ CCMD (hxvisit)
if (P_CheckMapData(mapname.GetChars()))
{
// So be it.
Printf ("%s\n", GStrings("STSTR_CLEV"));
Printf ("%s\n", GStrings.GetString("STSTR_CLEV"));
G_DeferedInitNew (mapname.GetChars());
return;
}
@ -1067,7 +1067,7 @@ static void PrintSecretString(const char *string, bool thislevel)
else colstr = TEXTCOLOR_GREEN;
}
}
auto brok = V_BreakLines(CurrentConsoleFont, twod->GetWidth()*95/100, *string == '$' ? GStrings(++string) : string);
auto brok = V_BreakLines(CurrentConsoleFont, twod->GetWidth()*95/100, *string == '$' ? GStrings.GetString(++string) : string);
for (auto &line : brok)
{
@ -1200,7 +1200,7 @@ CCMD(idmus)
}
else
{
Printf("%s\n", GStrings("STSTR_NOMUS"));
Printf("%s\n", GStrings.GetString("STSTR_NOMUS"));
return;
}
}
@ -1214,12 +1214,12 @@ CCMD(idmus)
if (info->Music.IsNotEmpty())
{
S_ChangeMusic(info->Music.GetChars(), info->musicorder);
Printf("%s\n", GStrings("STSTR_MUS"));
Printf("%s\n", GStrings.GetString("STSTR_MUS"));
}
}
else
{
Printf("%s\n", GStrings("STSTR_NOMUS"));
Printf("%s\n", GStrings.GetString("STSTR_NOMUS"));
}
}
}

View file

@ -261,7 +261,7 @@ void CT_Drawer (void)
if (!!rv) return;
}
FStringf prompt("%s ", GStrings("TXT_SAY"));
FStringf prompt("%s ", GStrings.GetString("TXT_SAY"));
int x, scalex, y, promptwidth;
y = (viewactive || gamestate != GS_LEVEL) ? -displayfont->GetHeight()-2 : -displayfont->GetHeight() - 22;

View file

@ -260,7 +260,7 @@ CUSTOM_CVAR (Int, fraglimit, 0, CVAR_SERVERINFO)
{
if (playeringame[i] && self <= D_GetFragCount(&players[i]))
{
Printf ("%s\n", GStrings("TXT_FRAGLIMIT"));
Printf ("%s\n", GStrings.GetString("TXT_FRAGLIMIT"));
primaryLevel->ExitLevel (0, false);
break;
}
@ -1097,7 +1097,7 @@ void D_Display ()
if (paused && multiplayer)
{
FFont *font = generic_ui? NewSmallFont : SmallFont;
FString pstring = GStrings("TXT_BY");
FString pstring = GStrings.GetString("TXT_BY");
pstring.Substitute("%s", players[paused - 1].userinfo.GetName());
DrawText(twod, font, CR_RED,
(twod->GetWidth() - font->StringWidth(pstring)*CleanXfac) / 2,
@ -1295,7 +1295,7 @@ void D_PageDrawer (void)
if (Subtitle != nullptr)
{
FFont* font = generic_ui ? NewSmallFont : SmallFont;
DrawFullscreenSubtitle(font, GStrings[Subtitle]);
DrawFullscreenSubtitle(font, GStrings.CheckString(Subtitle));
}
if (Advisory.isValid())
{
@ -2162,7 +2162,7 @@ static void CheckCmdLine()
if (devparm)
{
Printf ("%s", GStrings("D_DEVSTR"));
Printf ("%s", GStrings.GetString("D_DEVSTR"));
}
// turbo option // [RH] (now a cvar)
@ -3456,7 +3456,7 @@ static int D_InitGame(const FIWADInfo* iwad_info, std::vector<std::string>& allw
for (int p = 0; p < 5; ++p)
{
// At this point we cannot use the player's gender info yet so force 'male' here.
const char *str = GStrings.GetString(startupString[p], nullptr, 0);
const char *str = GStrings.CheckString(startupString[p], nullptr, 0);
if (str != NULL && str[0] != '\0')
{
Printf("%s\n", str);

View file

@ -2260,7 +2260,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player)
cht_Give (&players[player], s, ReadInt32 (stream));
if (player != consoleplayer)
{
FString message = GStrings("TXT_X_CHEATS");
FString message = GStrings.GetString("TXT_X_CHEATS");
message.Substitute("%s", players[player].userinfo.GetName());
Printf("%s: give %s\n", message.GetChars(), s);
}

View file

@ -321,7 +321,7 @@ static void UpdateTeam (int pnum, int team, bool update)
if ((dmflags2 & DF2_NO_TEAM_SWITCH) && (alwaysapplydmflags || deathmatch) && TeamLibrary.IsValidTeam (info->GetTeam()))
{
Printf ("%s\n", GStrings("TXT_NO_TEAM_CHANGE"));
Printf ("%s\n", GStrings.GetString("TXT_NO_TEAM_CHANGE"));
return;
}
@ -339,12 +339,12 @@ static void UpdateTeam (int pnum, int team, bool update)
FString message;
if (TeamLibrary.IsValidTeam (team))
{
message = GStrings("TXT_JOINED_TEAM");
message = GStrings.GetString("TXT_JOINED_TEAM");
message.Substitute("%t", Teams[team].GetName());
}
else
{
message = GStrings("TXT_LONER");
message = GStrings.GetString("TXT_LONER");
}
message.Substitute("%s", info->GetName());
Printf("%s\n", message.GetChars());

View file

@ -1825,7 +1825,7 @@ void G_DoPlayerPop(int playernum)
{
playeringame[playernum] = false;
FString message = GStrings(deathmatch? "TXT_LEFTWITHFRAGS" : "TXT_LEFTTHEGAME");
FString message = GStrings.GetString(deathmatch? "TXT_LEFTWITHFRAGS" : "TXT_LEFTTHEGAME");
message.Substitute("%s", players[playernum].userinfo.GetName());
message.Substitute("%d", FStringf("%d", players[playernum].fragcount));
Printf("%s\n", message.GetChars());
@ -1903,7 +1903,7 @@ static bool CheckSingleWad (const char *name, bool &printRequires, bool printwar
{
if (!printRequires)
{
Printf ("%s:\n%s", GStrings("TXT_SAVEGAMENEEDS"), name);
Printf ("%s:\n%s", GStrings.GetString("TXT_SAVEGAMENEEDS"), name);
}
else
{
@ -1941,7 +1941,7 @@ bool G_CheckSaveGameWads (FSerializer &arc, bool printwarn)
static void LoadGameError(const char *label, const char *append = "")
{
FString message = GStrings(label);
FString message = GStrings.GetString(label);
message.Substitute("%s", savename);
Printf ("%s %s\n", message.GetChars(), append);
}
@ -2060,12 +2060,12 @@ void G_DoLoadGame ()
FString message;
if (SaveVersion < MINSAVEVER)
{
message = GStrings("TXT_TOOOLDSG");
message = GStrings.GetString("TXT_TOOOLDSG");
message.Substitute("%e", FStringf("%d", MINSAVEVER));
}
else
{
message = GStrings("TXT_TOONEWSG");
message = GStrings.GetString("TXT_TOONEWSG");
message.Substitute("%e", FStringf("%d", SAVEVER));
}
message.Substitute("%d", FStringf("%d", SaveVersion));
@ -2175,19 +2175,19 @@ void G_SaveGame (const char *filename, const char *description)
{
if (sendsave || gameaction == ga_savegame)
{
Printf ("%s\n", GStrings("TXT_SAVEPENDING"));
Printf ("%s\n", GStrings.GetString("TXT_SAVEPENDING"));
}
else if (!usergame)
{
Printf ("%s\n", GStrings("TXT_NOTSAVEABLE"));
Printf ("%s\n", GStrings.GetString("TXT_NOTSAVEABLE"));
}
else if (gamestate != GS_LEVEL)
{
Printf ("%s\n", GStrings("TXT_NOTINLEVEL"));
Printf ("%s\n", GStrings.GetString("TXT_NOTINLEVEL"));
}
else if (players[consoleplayer].health <= 0 && !multiplayer)
{
Printf ("%s\n", GStrings("TXT_SPPLAYERDEAD"));
Printf ("%s\n", GStrings.GetString("TXT_SPPLAYERDEAD"));
}
else
{
@ -2311,7 +2311,7 @@ static void PutSaveComment (FSerializer &arc)
comment.Format("%s - %s\n", primaryLevel->MapName.GetChars(), primaryLevel->LevelName.GetChars());
// Append elapsed time
const char *const time = GStrings("SAVECOMMENT_TIME");
const char *const time = GStrings.GetString("SAVECOMMENT_TIME");
levelTime = primaryLevel->time / TICRATE;
comment.AppendFormat("%s: %02d:%02d:%02d", time, levelTime/3600, (levelTime%3600)/60, levelTime%60);
@ -2463,12 +2463,12 @@ void G_DoSaveGame (bool okForQuicksave, bool forceQuicksave, FString filename, c
savegameManager.NotifyNewSave(filename, description, okForQuicksave, forceQuicksave);
BackupSaveName = filename;
if (longsavemessages) Printf("%s (%s)\n", GStrings("GGSAVED"), filename.GetChars());
else Printf("%s\n", GStrings("GGSAVED"));
if (longsavemessages) Printf("%s (%s)\n", GStrings.GetString("GGSAVED"), filename.GetChars());
else Printf("%s\n", GStrings.GetString("GGSAVED"));
}
else
{
Printf(PRINT_HIGH, "%s\n", GStrings("TXT_SAVEFAILED"));
Printf(PRINT_HIGH, "%s\n", GStrings.GetString("TXT_SAVEFAILED"));
}

View file

@ -132,7 +132,7 @@ void G_LeavingHub(FLevelLocals *Level, int mode, cluster_info_t * cluster, wbsta
{
if (cluster->flags & CLUSTER_LOOKUPNAME)
{
wbs->thisname = GStrings(cluster->ClusterName);
wbs->thisname = GStrings.GetString(cluster->ClusterName);
}
else
{

View file

@ -2450,7 +2450,7 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GetClusterName)
if (cluster)
{
if (cluster->flags & CLUSTER_LOOKUPNAME)
retval = GStrings(cluster->ClusterName);
retval = GStrings.GetString(cluster->ClusterName);
else
retval = cluster->ClusterName;
}

View file

@ -824,10 +824,7 @@ class CommandDrawString : public SBarInfoCommand
{
strValue = CONSTANT;
sc.MustGetToken(TK_StringConst);
if(sc.String[0] == '$')
str = GStrings[sc.String+1];
else
str = sc.String;
label = sc.String;
}
}
void Reset()
@ -923,9 +920,10 @@ class CommandDrawString : public SBarInfoCommand
break;
}
case LOGTEXT:
str = GStrings(statusBar->CPlayer->LogText);
str = GStrings.GetString(statusBar->CPlayer->LogText);
break;
default:
str = GStrings.localize(label.GetChars());
break;
}
}
@ -993,6 +991,7 @@ class CommandDrawString : public SBarInfoCommand
StringValueType strValue;
int valueArgument;
FString str;
FString label;
StringAlignment alignment;
private:

View file

@ -550,7 +550,7 @@ void DBaseStatusBar::DoDrawAutomapHUD(int crdefault, int highlight)
if (!generic_ui)
{
// If the original font does not have accents this will strip them - but a fallback to the VGA font is not desirable here for such cases.
if (!font->CanPrint(GStrings("AM_MONSTERS")) || !font->CanPrint(GStrings("AM_SECRETS")) || !font->CanPrint(GStrings("AM_ITEMS"))) font2 = OriginalSmallFont;
if (!font->CanPrint(GStrings.GetString("AM_MONSTERS")) || !font->CanPrint(GStrings.GetString("AM_SECRETS")) || !font->CanPrint(GStrings.GetString("AM_ITEMS"))) font2 = OriginalSmallFont;
}
if (am_showtime)
@ -575,14 +575,14 @@ void DBaseStatusBar::DoDrawAutomapHUD(int crdefault, int highlight)
y = 0;
if (am_showmonsters)
{
textbuffer.Format("%s\34%c %d/%d", GStrings("AM_MONSTERS"), crdefault + 65, primaryLevel->killed_monsters, primaryLevel->total_monsters);
textbuffer.Format("%s\34%c %d/%d", GStrings.GetString("AM_MONSTERS"), crdefault + 65, primaryLevel->killed_monsters, primaryLevel->total_monsters);
DrawText(twod, font2, highlight, textdist, y, textbuffer.GetChars(), DTA_KeepRatio, true, DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight, TAG_DONE);
y += fheight;
}
if (am_showsecrets)
{
textbuffer.Format("%s\34%c %d/%d", GStrings("AM_SECRETS"), crdefault + 65, primaryLevel->found_secrets, primaryLevel->total_secrets);
textbuffer.Format("%s\34%c %d/%d", GStrings.GetString("AM_SECRETS"), crdefault + 65, primaryLevel->found_secrets, primaryLevel->total_secrets);
DrawText(twod, font2, highlight, textdist, y, textbuffer.GetChars(), DTA_KeepRatio, true, DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight, TAG_DONE);
y += fheight;
}
@ -590,7 +590,7 @@ void DBaseStatusBar::DoDrawAutomapHUD(int crdefault, int highlight)
// Draw item count
if (am_showitems)
{
textbuffer.Format("%s\34%c %d/%d", GStrings("AM_ITEMS"), crdefault + 65, primaryLevel->found_items, primaryLevel->total_items);
textbuffer.Format("%s\34%c %d/%d", GStrings.GetString("AM_ITEMS"), crdefault + 65, primaryLevel->found_items, primaryLevel->total_items);
DrawText(twod, font2, highlight, textdist, y, textbuffer.GetChars(), DTA_KeepRatio, true, DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight, TAG_DONE);
y += fheight;
}
@ -1121,7 +1121,7 @@ void DBaseStatusBar::DrawLog ()
FFont *font = (generic_ui || log_vgafont)? NewSmallFont : SmallFont;
int linelen = hudwidth<640? Scale(hudwidth,9,10)-40 : 560;
auto lines = V_BreakLines (font, linelen, text[0] == '$'? GStrings(text.GetChars()+1) : text.GetChars());
auto lines = V_BreakLines (font, linelen, text[0] == '$'? GStrings.GetString(text.GetChars()+1) : text.GetChars());
int height = 20;
for (unsigned i = 0; i < lines.Size(); i++) height += font->GetHeight ();

View file

@ -218,7 +218,7 @@ static void PrintMessage (const char *str)
{
if (str[0]=='$')
{
str = GStrings(str+1);
str = GStrings.GetString(str+1);
}
C_MidPrint (nullptr, str);
}

View file

@ -323,7 +323,7 @@ FString level_info_t::LookupLevelName(uint32_t *langtable)
if (flags & LEVEL_LOOKUPLEVELNAME)
{
const char *thename;
const char *lookedup = GStrings.GetString(LevelName.GetChars(), langtable);
const char *lookedup = GStrings.CheckString(LevelName.GetChars(), langtable);
if (lookedup == NULL)
{
thename = LevelName.GetChars();

View file

@ -499,7 +499,7 @@ const char * G_SkillName()
if (pmnm != NULL) name = pmnm->GetChars();
}
if (*name == '$') name = GStrings(name+1);
if (*name == '$') name = GStrings.GetString(name+1);
return name;
}

View file

@ -469,7 +469,7 @@ void STAT_ChangeLevel(const char *newl, FLevelLocals *Level)
section.ToUpper();
const char *ep_name = StartEpisode->mEpisodeName.GetChars();
if (*ep_name == '$') ep_name = GStrings(ep_name+1);
if (*ep_name == '$') ep_name = GStrings.GetString(ep_name+1);
FStatistics *sl = GetStatisticsList(EpisodeStatistics, section.GetChars(), ep_name);
int statvals[6] = {0,0,0,0,0,0};

View file

@ -336,10 +336,10 @@ static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYER
y += (BigFont->GetHeight() + 8) * CleanYfac;
}
const char *text_color = GStrings("SCORE_COLOR"),
*text_frags = GStrings(deathmatch ? "SCORE_FRAGS" : "SCORE_KILLS"),
*text_name = GStrings("SCORE_NAME"),
*text_delay = GStrings("SCORE_DELAY");
const char *text_color = GStrings.GetString("SCORE_COLOR"),
*text_frags = GStrings.GetString(deathmatch ? "SCORE_FRAGS" : "SCORE_KILLS"),
*text_name = GStrings.GetString("SCORE_NAME"),
*text_delay = GStrings.GetString("SCORE_DELAY");
col2 = (displayFont->StringWidth(text_color) + 16) * FontScale;
col3 = col2 + (displayFont->StringWidth(text_frags) + 16) * FontScale;

View file

@ -95,7 +95,7 @@ DEFINE_ACTION_FUNCTION(_Screen, GetTextScreenSize)
void DrawFullscreenSubtitle(FFont* font, const char *text)
{
if (!text || !*text || !inter_subtitles) return;
if (*text == '$') text = GStrings[text + 1];
text = GStrings.localize(text);
// This uses the same scaling as regular HUD messages
auto scale = active_con_scaletext(twod, generic_ui);
@ -170,7 +170,7 @@ void DIntermissionScreen::Init(FIntermissionAction *desc, bool first)
}
else if (*texname == '$')
{
texname = GStrings(texname+1);
texname = GStrings.GetString(texname+1);
}
if (texname[0] != 0)
{
@ -330,7 +330,7 @@ void DIntermissionScreenText::Init(FIntermissionAction *desc, bool first)
{
Super::Init(desc, first);
mText = static_cast<FIntermissionActionTextscreen*>(desc)->mText;
if (mText[0] == '$') mText = GStrings(&mText[1]);
if (mText[0] == '$') mText = GStrings.GetString(&mText[1]);
auto lines = mText.Split("\n");
mText = "";
@ -659,7 +659,7 @@ void DIntermissionScreenCast::Drawer ()
if (name != NULL)
{
auto font = generic_ui ? NewSmallFont : SmallFont;
if (*name == '$') name = GStrings(name+1);
if (*name == '$') name = GStrings.GetString(name+1);
DrawText(twod, font, CR_UNTRANSLATED,
(twod->GetWidth() - font->StringWidth (name) * CleanXfac)/2,
(twod->GetHeight() * 180) / 200,

View file

@ -935,7 +935,7 @@ CCMD(testfinale)
if (argv.argc() == 2)
{
text = GStrings.GetString(argv[1], nullptr);
text = GStrings.CheckString(argv[1], nullptr);
}
else
{

View file

@ -17,7 +17,7 @@ LauncherBanner::LauncherBanner(Widget* parent) : Widget(parent)
void LauncherBanner::UpdateLanguage()
{
FString versionText = GStrings("PICKER_VERSION");
FString versionText = GStrings.GetString("PICKER_VERSION");
versionText.Substitute("%s", GetVersionString());
VersionLabel->SetText(versionText.GetChars());
}

View file

@ -15,8 +15,8 @@ LauncherButtonbar::LauncherButtonbar(LauncherWindow* parent) : Widget(parent)
void LauncherButtonbar::UpdateLanguage()
{
PlayButton->SetText(GStrings("PICKER_PLAY"));
ExitButton->SetText(GStrings("PICKER_EXIT"));
PlayButton->SetText(GStrings.GetString("PICKER_PLAY"));
ExitButton->SetText(GStrings.GetString("PICKER_EXIT"));
}
double LauncherButtonbar::GetPreferredHeight() const

View file

@ -72,8 +72,8 @@ void LauncherWindow::Exit()
void LauncherWindow::UpdateLanguage()
{
Pages->SetTabText(PlayGame, GStrings("PICKER_TAB_PLAY"));
Pages->SetTabText(Settings, GStrings("OPTMNU_TITLE"));
Pages->SetTabText(PlayGame, GStrings.GetString("PICKER_TAB_PLAY"));
Pages->SetTabText(Settings, GStrings.GetString("OPTMNU_TITLE"));
Banner->UpdateLanguage();
PlayGame->UpdateLanguage();
Settings->UpdateLanguage();

View file

@ -52,9 +52,9 @@ int PlayGamePage::GetSelectedGame()
void PlayGamePage::UpdateLanguage()
{
SelectLabel->SetText(GStrings("PICKER_SELECT"));
ParametersLabel->SetText(GStrings("PICKER_ADDPARM"));
FString welcomeText = GStrings("PICKER_WELCOME");
SelectLabel->SetText(GStrings.GetString("PICKER_SELECT"));
ParametersLabel->SetText(GStrings.GetString("PICKER_ADDPARM"));
FString welcomeText = GStrings.GetString("PICKER_WELCOME");
welcomeText.Substitute("%s", GAMENAME);
WelcomeLabel->SetText(welcomeText.GetChars());
}

View file

@ -132,21 +132,21 @@ void SettingsPage::Save()
void SettingsPage::UpdateLanguage()
{
LangLabel->SetText(GStrings("OPTMNU_LANGUAGE"));
GeneralLabel->SetText(GStrings("PICKER_GENERAL"));
ExtrasLabel->SetText(GStrings("PICKER_EXTRA"));
FullscreenCheckbox->SetText(GStrings("PICKER_FULLSCREEN"));
DisableAutoloadCheckbox->SetText(GStrings("PICKER_NOAUTOLOAD"));
DontAskAgainCheckbox->SetText(GStrings("PICKER_DONTASK"));
LightsCheckbox->SetText(GStrings("PICKER_LIGHTS"));
BrightmapsCheckbox->SetText(GStrings("PICKER_BRIGHTMAPS"));
WidescreenCheckbox->SetText(GStrings("PICKER_WIDESCREEN"));
LangLabel->SetText(GStrings.GetString("OPTMNU_LANGUAGE"));
GeneralLabel->SetText(GStrings.GetString("PICKER_GENERAL"));
ExtrasLabel->SetText(GStrings.GetString("PICKER_EXTRA"));
FullscreenCheckbox->SetText(GStrings.GetString("PICKER_FULLSCREEN"));
DisableAutoloadCheckbox->SetText(GStrings.GetString("PICKER_NOAUTOLOAD"));
DontAskAgainCheckbox->SetText(GStrings.GetString("PICKER_DONTASK"));
LightsCheckbox->SetText(GStrings.GetString("PICKER_LIGHTS"));
BrightmapsCheckbox->SetText(GStrings.GetString("PICKER_BRIGHTMAPS"));
WidescreenCheckbox->SetText(GStrings.GetString("PICKER_WIDESCREEN"));
#ifdef RENDER_BACKENDS
BackendLabel->SetText(GStrings("PICKER_PREFERBACKEND"));
VulkanCheckbox->SetText(GStrings("OPTVAL_VULKAN"));
OpenGLCheckbox->SetText(GStrings("OPTVAL_OPENGL"));
GLESCheckbox->SetText(GStrings("OPTVAL_OPENGLES"));
BackendLabel->SetText(GStrings.GetString("PICKER_PREFERBACKEND"));
VulkanCheckbox->SetText(GStrings.GetString("OPTVAL_VULKAN"));
OpenGLCheckbox->SetText(GStrings.GetString("OPTVAL_OPENGL"));
GLESCheckbox->SetText(GStrings.GetString("OPTVAL_OPENGLES"));
#endif
}

View file

@ -66,7 +66,7 @@ void cht_DoMDK(player_t *player, const char *mod)
{
if (player->mo == NULL)
{
Printf("%s\n", GStrings("TXT_WHAT_KILL"));
Printf("%s\n", GStrings.GetString("TXT_WHAT_KILL"));
}
else if (!deathmatch)
{
@ -119,41 +119,41 @@ void cht_DoCheat (player_t *player, int cheat)
case CHT_GOD:
player->cheats ^= CF_GODMODE;
if (player->cheats & CF_GODMODE)
msg = GStrings("STSTR_DQDON");
msg = GStrings.GetString("STSTR_DQDON");
else
msg = GStrings("STSTR_DQDOFF");
msg = GStrings.GetString("STSTR_DQDOFF");
break;
case CHT_BUDDHA:
player->cheats ^= CF_BUDDHA;
if (player->cheats & CF_BUDDHA)
msg = GStrings("TXT_BUDDHAON");
msg = GStrings.GetString("TXT_BUDDHAON");
else
msg = GStrings("TXT_BUDDHAOFF");
msg = GStrings.GetString("TXT_BUDDHAOFF");
break;
case CHT_GOD2:
player->cheats ^= CF_GODMODE2;
if (player->cheats & CF_GODMODE2)
msg = GStrings("STSTR_DQD2ON");
msg = GStrings.GetString("STSTR_DQD2ON");
else
msg = GStrings("STSTR_DQD2OFF");
msg = GStrings.GetString("STSTR_DQD2OFF");
break;
case CHT_BUDDHA2:
player->cheats ^= CF_BUDDHA2;
if (player->cheats & CF_BUDDHA2)
msg = GStrings("TXT_BUDDHA2ON");
msg = GStrings.GetString("TXT_BUDDHA2ON");
else
msg = GStrings("TXT_BUDDHA2OFF");
msg = GStrings.GetString("TXT_BUDDHA2OFF");
break;
case CHT_NOCLIP:
player->cheats ^= CF_NOCLIP;
if (player->cheats & CF_NOCLIP)
msg = GStrings("STSTR_NCON");
msg = GStrings.GetString("STSTR_NCON");
else
msg = GStrings("STSTR_NCOFF");
msg = GStrings.GetString("STSTR_NCOFF");
break;
case CHT_NOCLIP2:
@ -161,12 +161,12 @@ void cht_DoCheat (player_t *player, int cheat)
if (player->cheats & CF_NOCLIP2)
{
player->cheats |= CF_NOCLIP;
msg = GStrings("STSTR_NC2ON");
msg = GStrings.GetString("STSTR_NC2ON");
}
else
{
player->cheats &= ~CF_NOCLIP;
msg = GStrings("STSTR_NC2OFF");
msg = GStrings.GetString("STSTR_NC2OFF");
}
if (player->mo->Vel.X == 0) player->mo->Vel.X = MinVel; // force some lateral movement so that internal variables are up to date
break;
@ -174,9 +174,9 @@ void cht_DoCheat (player_t *player, int cheat)
case CHT_NOVELOCITY:
player->cheats ^= CF_NOVELOCITY;
if (player->cheats & CF_NOVELOCITY)
msg = GStrings("TXT_LEADBOOTSON");
msg = GStrings.GetString("TXT_LEADBOOTSON");
else
msg = GStrings("TXT_LEADBOOTSOFF");
msg = GStrings.GetString("TXT_LEADBOOTSOFF");
break;
case CHT_FLY:
@ -187,13 +187,13 @@ void cht_DoCheat (player_t *player, int cheat)
{
player->mo->flags |= MF_NOGRAVITY;
player->mo->flags2 |= MF2_FLY;
msg = GStrings("TXT_LIGHTER");
msg = GStrings.GetString("TXT_LIGHTER");
}
else
{
player->mo->flags &= ~MF_NOGRAVITY;
player->mo->flags2 &= ~MF2_FLY;
msg = GStrings("TXT_GRAVITY");
msg = GStrings.GetString("TXT_GRAVITY");
}
}
break;
@ -206,25 +206,25 @@ void cht_DoCheat (player_t *player, int cheat)
case CHT_NOTARGET:
player->cheats ^= CF_NOTARGET;
if (player->cheats & CF_NOTARGET)
msg = GStrings("TXT_NOTARGET_ON");
msg = GStrings.GetString("TXT_NOTARGET_ON");
else
msg = GStrings("TXT_NOTARGET_OFF");
msg = GStrings.GetString("TXT_NOTARGET_OFF");
break;
case CHT_ANUBIS:
player->cheats ^= CF_FRIGHTENING;
if (player->cheats & CF_FRIGHTENING)
msg = GStrings("TXT_ANUBIS_ON");
msg = GStrings.GetString("TXT_ANUBIS_ON");
else
msg = GStrings("TXT_ANUBIS_OFF");
msg = GStrings.GetString("TXT_ANUBIS_OFF");
break;
case CHT_CHASECAM:
player->cheats ^= CF_CHASECAM;
if (player->cheats & CF_CHASECAM)
msg = GStrings("TXT_CHASECAM_ON");
msg = GStrings.GetString("TXT_CHASECAM_ON");
else
msg = GStrings("TXT_CHASECAM_OFF");
msg = GStrings.GetString("TXT_CHASECAM_OFF");
R_ResetViewInterpolation ();
break;
@ -236,7 +236,7 @@ void cht_DoCheat (player_t *player, int cheat)
{
player->mo->GiveInventoryType (type);
}
msg = GStrings("STSTR_CHOPPERS");
msg = GStrings.GetString("STSTR_CHOPPERS");
}
// [RH] The original cheat also set powers[pw_invulnerability] to true.
// Since this is a timer and not a boolean, it effectively turned off
@ -251,12 +251,12 @@ void cht_DoCheat (player_t *player, int cheat)
if (item != NULL)
{
item->Destroy ();
msg = GStrings("TXT_CHEATPOWEROFF");
msg = GStrings.GetString("TXT_CHEATPOWEROFF");
}
else
{
player->mo->GiveInventoryType (PClass::FindActor(NAME_PowerWeaponLevel2));
msg = GStrings("TXT_CHEATPOWERON");
msg = GStrings.GetString("TXT_CHEATPOWERON");
}
}
break;
@ -267,7 +267,7 @@ void cht_DoCheat (player_t *player, int cheat)
cht_Give (player, "ammo");
cht_Give (player, "keys");
cht_Give (player, "armor");
msg = GStrings("STSTR_KFAADDED");
msg = GStrings.GetString("STSTR_KFAADDED");
break;
case CHT_IDFA:
@ -275,7 +275,7 @@ void cht_DoCheat (player_t *player, int cheat)
cht_Give (player, "weapons");
cht_Give (player, "ammo");
cht_Give (player, "armor");
msg = GStrings("STSTR_FAADDED");
msg = GStrings.GetString("STSTR_FAADDED");
break;
case CHT_BEHOLDV:
@ -320,7 +320,7 @@ void cht_DoCheat (player_t *player, int cheat)
item->Destroy ();
}
}
msg = GStrings("STSTR_BEHOLDX");
msg = GStrings.GetString("STSTR_BEHOLDX");
break;
case CHT_MASSACRE:
@ -330,12 +330,12 @@ void cht_DoCheat (player_t *player, int cheat)
// killough 3/22/98: make more intelligent about plural
if (killcount == 1)
{
msg = GStrings(cheat == CHT_MASSACRE? "TXT_MONSTER_KILLED" : "TXT_BADDIE_KILLED");
msg = GStrings.GetString(cheat == CHT_MASSACRE? "TXT_MONSTER_KILLED" : "TXT_BADDIE_KILLED");
}
else
{
// Note: Do not use the language string directly as a format template!
smsg = GStrings(cheat == CHT_MASSACRE? "TXT_MONSTERS_KILLED" : "TXT_BADDIES_KILLED");
smsg = GStrings.GetString(cheat == CHT_MASSACRE? "TXT_MONSTERS_KILLED" : "TXT_BADDIES_KILLED");
FStringf countstr("%d", killcount);
smsg.Substitute("%d", countstr);
msg = smsg.GetChars();
@ -347,13 +347,13 @@ void cht_DoCheat (player_t *player, int cheat)
if (player->mo != NULL && player->playerstate == PST_LIVE)
{
player->health = player->mo->health = player->mo->GetDefault()->health;
msg = GStrings("TXT_CHEATHEALTH");
msg = GStrings.GetString("TXT_CHEATHEALTH");
}
break;
case CHT_KEYS:
cht_Give (player, "keys");
msg = GStrings("TXT_CHEATKEYS");
msg = GStrings.GetString("TXT_CHEATKEYS");
break;
// [GRB]
@ -362,7 +362,7 @@ void cht_DoCheat (player_t *player, int cheat)
{
if (player->mo->IsKindOf("PlayerChunk"))
{
Printf("%s\n", GStrings("TXT_NO_RESURRECT"));
Printf("%s\n", GStrings.GetString("TXT_NO_RESURRECT"));
return;
}
else
@ -374,52 +374,52 @@ void cht_DoCheat (player_t *player, int cheat)
case CHT_GIMMIEA:
cht_Give (player, "ArtiInvulnerability");
msg = GStrings("TAG_ARTIINVULNERABILITY");
msg = GStrings.GetString("TAG_ARTIINVULNERABILITY");
break;
case CHT_GIMMIEB:
cht_Give (player, "ArtiInvisibility");
msg = GStrings("TAG_ARTIINVISIBILITY");
msg = GStrings.GetString("TAG_ARTIINVISIBILITY");
break;
case CHT_GIMMIEC:
cht_Give (player, "ArtiHealth");
msg = GStrings("TAG_ARTIHEALTH");
msg = GStrings.GetString("TAG_ARTIHEALTH");
break;
case CHT_GIMMIED:
cht_Give (player, "ArtiSuperHealth");
msg = GStrings("TAG_ARTISUPERHEALTH");
msg = GStrings.GetString("TAG_ARTISUPERHEALTH");
break;
case CHT_GIMMIEE:
cht_Give (player, "ArtiTomeOfPower");
msg = GStrings("TAG_ARTITOMEOFPOWER");
msg = GStrings.GetString("TAG_ARTITOMEOFPOWER");
break;
case CHT_GIMMIEF:
cht_Give (player, "ArtiTorch");
msg = GStrings("TAG_ARTITORCH");
msg = GStrings.GetString("TAG_ARTITORCH");
break;
case CHT_GIMMIEG:
cht_Give (player, "ArtiTimeBomb");
msg = GStrings("TAG_ARTIFIREBOMB");
msg = GStrings.GetString("TAG_ARTIFIREBOMB");
break;
case CHT_GIMMIEH:
cht_Give (player, "ArtiEgg");
msg = GStrings("TAG_ARTIEGG");
msg = GStrings.GetString("TAG_ARTIEGG");
break;
case CHT_GIMMIEI:
cht_Give (player, "ArtiFly");
msg = GStrings("TAG_ARTIFLY");
msg = GStrings.GetString("TAG_ARTIFLY");
break;
case CHT_GIMMIEJ:
cht_Give (player, "ArtiTeleport");
msg = GStrings("TAG_ARTITELEPORT");
msg = GStrings.GetString("TAG_ARTITELEPORT");
break;
case CHT_GIMMIEZ:
@ -427,17 +427,17 @@ void cht_DoCheat (player_t *player, int cheat)
{
cht_Give (player, "artifacts");
}
msg = GStrings("TAG_ALL_ARTIFACTS");
msg = GStrings.GetString("TAG_ALL_ARTIFACTS");
break;
case CHT_TAKEWEAPS:
cht_Takeweaps(player);
msg = GStrings("TXT_CHEATIDKFA");
msg = GStrings.GetString("TXT_CHEATIDKFA");
break;
case CHT_NOWUDIE:
cht_Suicide (player);
msg = GStrings("TXT_CHEATIDDQD");
msg = GStrings.GetString("TXT_CHEATIDDQD");
break;
case CHT_ALLARTI:
@ -445,18 +445,18 @@ void cht_DoCheat (player_t *player, int cheat)
{
cht_Give (player, "artifacts");
}
msg = GStrings("TXT_CHEATARTIFACTS3");
msg = GStrings.GetString("TXT_CHEATARTIFACTS3");
break;
case CHT_PUZZLE:
cht_Give (player, "puzzlepieces");
msg = GStrings("TXT_CHEATARTIFACTS3");
msg = GStrings.GetString("TXT_CHEATARTIFACTS3");
break;
case CHT_MDK:
if (player->mo == nullptr)
{
Printf ("%s\n", GStrings("TXT_WHAT_KILL"));
Printf ("%s\n", GStrings.GetString("TXT_WHAT_KILL"));
return;
}
else if (!deathmatch)
@ -471,7 +471,7 @@ void cht_DoCheat (player_t *player, int cheat)
case CHT_DONNYTRUMP:
cht_Give (player, "HealthTraining");
msg = GStrings("TXT_MIDASTOUCH");
msg = GStrings.GetString("TXT_MIDASTOUCH");
break;
case CHT_LEGO:
@ -507,34 +507,34 @@ void cht_DoCheat (player_t *player, int cheat)
cht_Give (player, "MedPatch");
cht_Give (player, "MedicalKit");
cht_Give (player, "SurgeryKit");
msg = GStrings("TXT_GOTSTUFF");
msg = GStrings.GetString("TXT_GOTSTUFF");
break;
case CHT_PUMPUPP:
cht_Give (player, "AmmoSatchel");
msg = GStrings("TXT_GOTSTUFF");
msg = GStrings.GetString("TXT_GOTSTUFF");
break;
case CHT_PUMPUPS:
cht_Give (player, "UpgradeStamina", 10);
cht_Give (player, "UpgradeAccuracy");
msg = GStrings("TXT_GOTSTUFF");
msg = GStrings.GetString("TXT_GOTSTUFF");
break;
case CHT_CLEARFROZENPROPS:
player->cheats &= ~(CF_FROZEN|CF_TOTALLYFROZEN);
msg = GStrings("TXT_NOT_FROZEN");
msg = GStrings.GetString("TXT_NOT_FROZEN");
break;
case CHT_FREEZE:
globalchangefreeze ^= 1;
if (globalfreeze ^ globalchangefreeze)
{
msg = GStrings("TXT_FREEZEON");
msg = GStrings.GetString("TXT_FREEZEON");
}
else
{
msg = GStrings("TXT_FREEZEOFF");
msg = GStrings.GetString("TXT_FREEZEOFF");
}
break;
}
@ -546,7 +546,7 @@ void cht_DoCheat (player_t *player, int cheat)
Printf ("%s\n", msg);
else if (cheat != CHT_CHASECAM)
{
FString message = GStrings("TXT_X_CHEATS");
FString message = GStrings.GetString("TXT_X_CHEATS");
message.Substitute("%s", player->userinfo.GetName());
Printf("%s: %s\n", message.GetChars(), msg);
}

View file

@ -519,7 +519,7 @@ void WritePNGfile (FileWriter *file, const uint8_t *buffer, const PalEntry *pale
!M_AppendPNGText (file, "Software", software) ||
!M_FinishPNG (file))
{
Printf ("%s\n", GStrings("TXT_SCREENSHOTERR"));
Printf ("%s\n", GStrings.GetString("TXT_SCREENSHOTERR"));
}
}

View file

@ -207,7 +207,7 @@ bool M_SetSpecialMenu(FName& menu, int param)
if ((gameinfo.flags & GI_SHAREWARE) && param > 0)
{
// Only Doom and Heretic have multi-episode shareware versions.
M_StartMessage(GStrings("SWSTRING"), 1);
M_StartMessage(GStrings.GetString("SWSTRING"), 1);
return false;
}
@ -222,7 +222,7 @@ bool M_SetSpecialMenu(FName& menu, int param)
LastSkill = param;
const char *msg = AllSkills[param].MustConfirmText.GetChars();
if (*msg==0) msg = GStrings("NIGHTMARE");
if (*msg==0) msg = GStrings.GetString("NIGHTMARE");
M_StartMessage (msg, 0, NAME_StartgameConfirmed);
return false;
}
@ -248,7 +248,7 @@ bool M_SetSpecialMenu(FName& menu, int param)
if (!usergame || (players[consoleplayer].health <= 0 && !multiplayer) || gamestate != GS_LEVEL)
{
// cannot save outside the game.
M_StartMessage (GStrings("SAVEDEAD"), 1);
M_StartMessage (GStrings.GetString("SAVEDEAD"), 1);
return false;
}
break;
@ -394,11 +394,11 @@ CCMD (menu_quit)
{
if (msg[1] == '*')
{
EndString = GStrings(msg + 2);
EndString = GStrings.GetString(msg + 2);
}
else
{
EndString.Format("%s\n\n%s", GStrings(msg + 1), GStrings("DOSY"));
EndString.Format("%s\n\n%s", GStrings.GetString(msg + 1), GStrings.GetString("DOSY"));
}
}
else EndString = gameinfo.quitmessages[messageindex];
@ -430,7 +430,7 @@ CCMD (menu_quit)
void ActivateEndGameMenu()
{
FString tempstring = GStrings(netgame ? "NETEND" : "ENDGAME");
FString tempstring = GStrings.GetString(netgame ? "NETEND" : "ENDGAME");
DMenu *newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring.GetChars(), 0, false, NAME_None, []()
{
M_ClearMenus();
@ -500,7 +500,7 @@ CCMD (quicksave)
S_Sound(CHAN_VOICE, CHANF_UI, "menu/activate", snd_menuvolume, ATTN_NONE);
FString tempstring = GStrings("QSPROMPT");
FString tempstring = GStrings.GetString("QSPROMPT");
tempstring.Substitute("%s", savegameManager.quickSaveSlot->SaveTitle.GetChars());
DMenu *newmenu = CreateMessageBoxMenu(CurrentMenu, tempstring.GetChars(), 0, false, NAME_None, []()
@ -524,7 +524,7 @@ CCMD (quickload)
if (netgame)
{
M_StartControlPanel(true);
M_StartMessage (GStrings("QLOADNET"), 1);
M_StartMessage (GStrings.GetString("QLOADNET"), 1);
return;
}
@ -543,7 +543,7 @@ CCMD (quickload)
G_LoadGame(savegameManager.quickSaveSlot->Filename.GetChars());
return;
}
FString tempstring = GStrings("QLPROMPT");
FString tempstring = GStrings.GetString("QLPROMPT");
tempstring.Substitute("%s", savegameManager.quickSaveSlot->SaveTitle.GetChars());
M_StartControlPanel(true);
@ -567,13 +567,13 @@ CCMD (togglemessages)
{
if (show_messages)
{
Printf(TEXTCOLOR_RED "%s\n", GStrings("MSGOFF"));
Printf(TEXTCOLOR_RED "%s\n", GStrings.GetString("MSGOFF"));
show_messages = false;
}
else
{
show_messages = true;
Printf(TEXTCOLOR_RED "%s\n", GStrings("MSGON"));
Printf(TEXTCOLOR_RED "%s\n", GStrings.GetString("MSGON"));
}
}
@ -711,7 +711,7 @@ void M_StartupEpisodeMenu(FNewGameStartup *gs)
continue; // We do not measure patch based entries. They are assumed to fit
}
const char *c = AllEpisodes[i].mEpisodeName.GetChars();
if (*c == '$') c = GStrings(c + 1);
if (*c == '$') c = GStrings.GetString(c + 1);
int textwidth = ld->mFont->StringWidth(c);
int textright = posx + textwidth;
if (posx + textright > 320) posx = max(0, 320 - textright);
@ -1261,7 +1261,7 @@ void M_StartupSkillMenu(FNewGameStartup *gs)
continue;
}
const char *c = pItemText ? pItemText->GetChars() : skill.MenuName.GetChars();
if (*c == '$') c = GStrings(c + 1);
if (*c == '$') c = GStrings.GetString(c + 1);
int textwidth = ld->mFont->StringWidth(c);
int textright = posx + textwidth;
if (posx + textright > 320) posx = max(0, 320 - textright);

View file

@ -589,7 +589,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply
const char *log = reply->LogString.GetChars();
if (log[0] == '$')
{
log = GStrings(log + 1);
log = GStrings.GetString(log + 1);
}
player->SetLogText(log);
@ -713,7 +713,7 @@ static void TerminalResponse (const char *str)
// handle string table replacement
if (str[0] == '$')
{
str = GStrings(str + 1);
str = GStrings.GetString(str + 1);
}
if (StatusBar != NULL)

View file

@ -63,7 +63,7 @@ void PrintPickupMessage(bool localview, const FString &str)
StaticLastMessage = str;
const char *pstr = str.GetChars();
if (pstr[0] == '$') pstr = GStrings(pstr + 1);
if (pstr[0] == '$') pstr = GStrings.GetString(pstr + 1);
if (pstr[0] != 0) Printf(PRINT_LOW, "%s\n", pstr);
StatusBar->FlashCrosshair();
}

View file

@ -3248,7 +3248,7 @@ const char *FBehavior::LookupString (uint32_t index, bool forprint) const
token.Truncate(5);
FStringf label("TXT_ACS_%s_%d_%.5s", Level->MapName.GetChars(), index, token.GetChars());
auto p = GStrings[label.GetChars()];
auto p = GStrings.CheckString(label.GetChars());
if (p) return p;
}
@ -8503,7 +8503,7 @@ scriptwait:
lookup = Level->Behaviors.LookupString (STACK(1), true);
if (pcd == PCD_PRINTLOCALIZED)
{
lookup = GStrings(lookup);
lookup = GStrings.GetString(lookup);
}
if (lookup != NULL)
{

View file

@ -1292,7 +1292,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Print)
PARAM_FLOAT (time);
PARAM_NAME (fontname);
if (text[0] == '$') text = GStrings(&text[1]);
if (text[0] == '$') text = GStrings.GetString(&text[1]);
if (self->CheckLocalView() ||
(self->target != NULL && self->target->CheckLocalView()))
{
@ -1330,7 +1330,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_PrintBold)
float saved = con_midtime;
FFont *font = NULL;
if (text[0] == '$') text = GStrings(&text[1]);
if (text[0] == '$') text = GStrings.GetString(&text[1]);
if (fontname != NAME_None)
{
font = V_GetFont(fontname.GetChars());
@ -1359,7 +1359,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Log)
if (local && !self->CheckLocalView()) return 0;
if (text[0] == '$') text = GStrings(&text[1]);
if (text[0] == '$') text = GStrings.GetString(&text[1]);
FString formatted = strbin1(text.GetChars());
Printf("%s\n", formatted.GetChars());
return 0;

View file

@ -249,11 +249,11 @@ void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgf
else
{
lookup.Format("$Obituary_%s_%s", attacker->GetClass()->TypeName.GetChars(), mod.GetChars());
if (GStrings[lookup.GetChars() + 1]) message = lookup.GetChars();
if (GStrings.CheckString(lookup.GetChars() + 1)) message = lookup.GetChars();
else
{
lookup.Format("$Obituary_%s", attacker->GetClass()->TypeName.GetChars());
if (GStrings[lookup.GetChars() + 1]) message = lookup.GetChars();
if (GStrings.CheckString(lookup.GetChars() + 1)) message = lookup.GetChars();
else
{
IFVIRTUALPTR(attacker, AActor, GetObituary)
@ -273,7 +273,7 @@ void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgf
if (message != NULL && message[0] == '$')
{
message = GStrings.GetString(message+1, nullptr, self->player->userinfo.GetGender());
message = GStrings.CheckString(message+1, nullptr, self->player->userinfo.GetGender());
}
if (message == NULL)
@ -283,16 +283,16 @@ void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgf
if (mod == NAME_Melee)
{
FStringf ob("DEFHITOB_%s", cls);
message = GStrings.GetString(ob.GetChars(), nullptr, self->player->userinfo.GetGender());
message = GStrings.CheckString(ob.GetChars(), nullptr, self->player->userinfo.GetGender());
}
if (message == nullptr)
{
FStringf ob("DEFOB_%s", cls);
message = GStrings.GetString(ob.GetChars(), nullptr, self->player->userinfo.GetGender());
message = GStrings.CheckString(ob.GetChars(), nullptr, self->player->userinfo.GetGender());
}
if (message == nullptr)
{
message = GStrings.GetString("OB_DEFAULT", nullptr, self->player->userinfo.GetGender());
message = GStrings.CheckString("OB_DEFAULT", nullptr, self->player->userinfo.GetGender());
}
}
@ -454,7 +454,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf
player->fragcount--;
if (deathmatch && player->spreecount >= 5 && cl_showsprees)
{
PronounMessage (GStrings("SPREEKILLSELF"), buff,
PronounMessage (GStrings.GetString("SPREEKILLSELF"), buff,
player->userinfo.GetGender(), player->userinfo.GetName(),
player->userinfo.GetName());
StatusBar->AttachMessage (Create<DHUDMessageFadeOut>(nullptr, buff,
@ -489,19 +489,19 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf
switch (source->player->spreecount)
{
case 5:
spreemsg = GStrings("SPREE5");
spreemsg = GStrings.GetString("SPREE5");
break;
case 10:
spreemsg = GStrings("SPREE10");
spreemsg = GStrings.GetString("SPREE10");
break;
case 15:
spreemsg = GStrings("SPREE15");
spreemsg = GStrings.GetString("SPREE15");
break;
case 20:
spreemsg = GStrings("SPREE20");
spreemsg = GStrings.GetString("SPREE20");
break;
case 25:
spreemsg = GStrings("SPREE25");
spreemsg = GStrings.GetString("SPREE25");
break;
default:
spreemsg = NULL;
@ -512,7 +512,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf
{
if (!AnnounceSpreeLoss (this))
{
PronounMessage (GStrings("SPREEOVER"), buff, player->userinfo.GetGender(),
PronounMessage (GStrings.GetString("SPREEOVER"), buff, player->userinfo.GetGender(),
player->userinfo.GetName(), source->player->userinfo.GetName());
StatusBar->AttachMessage (Create<DHUDMessageFadeOut> (nullptr, buff,
1.5f, 0.2f, 0, 0, CR_WHITE, 3.f, 0.5f), MAKE_ID('K','S','P','R'));
@ -554,16 +554,16 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf
multimsg = NULL;
break;
case 2:
multimsg = GStrings("MULTI2");
multimsg = GStrings.GetString("MULTI2");
break;
case 3:
multimsg = GStrings("MULTI3");
multimsg = GStrings.GetString("MULTI3");
break;
case 4:
multimsg = GStrings("MULTI4");
multimsg = GStrings.GetString("MULTI4");
break;
default:
multimsg = GStrings("MULTI5");
multimsg = GStrings.GetString("MULTI5");
break;
}
if (multimsg != NULL)
@ -587,7 +587,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf
if (deathmatch && fraglimit &&
fraglimit <= D_GetFragCount (source->player))
{
Printf ("%s\n", GStrings("TXT_FRAGLIMIT"));
Printf ("%s\n", GStrings.GetString("TXT_FRAGLIMIT"));
Level->ExitLevel (0, false);
}
}

View file

@ -3258,7 +3258,7 @@ FUNC(LS_SendToCommunicator)
// Get the message from the LANGUAGE lump.
FString msg;
msg.Format("TXT_COMM%d", arg2);
const char *str = GStrings[msg.GetChars()];
const char *str = GStrings.CheckString(msg.GetChars());
if (str != NULL)
{
Printf (PRINT_CHAT, "%s\n", str);

View file

@ -7700,7 +7700,7 @@ const char *AActor::GetTag(const char *def) const
const char *tag = Tag->GetChars();
if (tag[0] == '$')
{
return GStrings(tag + 1);
return GStrings.GetString(tag + 1);
}
else
{
@ -7730,7 +7730,7 @@ const char *AActor::GetCharacterName() const
const char *cname = Conversation->SpeakerName.GetChars();
if (cname[0] == '$')
{
return GStrings(cname + 1);
return GStrings.GetString(cname + 1);
}
else return cname;
}

View file

@ -619,7 +619,7 @@ void P_GiveSecret(FLevelLocals *Level, AActor *actor, bool printmessage, bool pl
{
if (printmessage)
{
C_MidPrint(nullptr, GStrings["SECRETMESSAGE"]);
C_MidPrint(nullptr, GStrings.CheckString("SECRETMESSAGE"));
if (showsecretsector && sectornum >= 0)
{
Printf(PRINT_HIGH | PRINT_NONOTIFY, "Secret found in sector %d\n", sectornum);
@ -696,7 +696,7 @@ void P_UpdateSpecials (FLevelLocals *Level)
{
if (Level->maptime >= (int)(timelimit * TICRATE * 60))
{
Printf ("%s\n", GStrings("TXT_TIMELIMIT"));
Printf ("%s\n", GStrings.GetString("TXT_TIMELIMIT"));
Level->ExitLevel(0, false);
}
}

View file

@ -376,7 +376,7 @@ void player_t::SetLogNumber (int num)
// First look up TXT_LOGTEXT%d in the string table
mysnprintf(lumpname, countof(lumpname), "$TXT_LOGTEXT%d", num);
auto text = GStrings[lumpname+1];
auto text = GStrings.CheckString(lumpname+1);
if (text)
{
SetLogText(lumpname); // set the label, not the content, so that a language change can be picked up.
@ -394,7 +394,7 @@ void player_t::SetLogNumber (int num)
// If this is an original IWAD text, try looking up its lower priority string version first.
mysnprintf(lumpname, countof(lumpname), "$TXT_ILOG%d", num);
auto text = GStrings[lumpname + 1];
auto text = GStrings.CheckString(lumpname + 1);
if (text)
{
SetLogText(lumpname); // set the label, not the content, so that a language change can be picked up.
@ -422,7 +422,7 @@ void player_t::SetLogText (const char *text)
if (mo && mo->CheckLocalView())
{
// Print log text to console
Printf(PRINT_HIGH | PRINT_NONOTIFY, TEXTCOLOR_GOLD "%s\n", LogText[0] == '$' ? GStrings(text + 1) : text);
Printf(PRINT_HIGH | PRINT_NONOTIFY, TEXTCOLOR_GOLD "%s\n", LogText[0] == '$' ? GStrings.GetString(text + 1) : text);
}
}

View file

@ -2635,7 +2635,7 @@ DEFINE_ACTION_FUNCTION(_Console, MidPrint)
PARAM_STRING(text);
PARAM_BOOL(bold);
const char* txt = text[0] == '$' ? GStrings(&text[1]) : text.GetChars();
const char* txt = text[0] == '$' ? GStrings.GetString(&text[1]) : text.GetChars();
C_MidPrint(fnt, txt, bold);
return 0;
}

View file

@ -154,7 +154,7 @@ static FString LookupMusic(const char* musicname, int& order)
// handle dehacked replacement.
// Any music name defined this way needs to be prefixed with 'D_' because
// Doom.exe does not contain the prefix so these strings don't either.
const char* mus_string = GStrings[musicname + 1];
const char* mus_string = GStrings.CheckString(musicname + 1);
if (mus_string != nullptr)
{
DEH_Music << "D_" << mus_string;

View file

@ -456,7 +456,7 @@ static bool Cht_Music (cheatseq_t *cheat)
static bool Cht_BeholdMenu (cheatseq_t *cheat)
{
Printf ("%s\n", GStrings("STSTR_BEHOLD"));
Printf ("%s\n", GStrings.GetString("STSTR_BEHOLD"));
return false;
}
@ -518,7 +518,7 @@ static bool Cht_MyPos (cheatseq_t *cheat)
static bool Cht_Ticker (cheatseq_t *cheat)
{
ticker = !ticker;
Printf ("%s\n", GStrings(ticker ? "TXT_CHEATTICKERON" : "TXT_CHEATTICKEROFF"));
Printf ("%s\n", GStrings.GetString(ticker ? "TXT_CHEATTICKERON" : "TXT_CHEATTICKEROFF"));
return true;
}