- allow retroactive substitution of cluster texts

This is needed to localize Harmony without swapping out the MAPINFO.
This commit is contained in:
Christoph Oelckers 2019-04-09 00:21:06 +02:00
parent c788da46fb
commit f1408bfb5b
3 changed files with 52 additions and 3 deletions

View File

@ -765,12 +765,30 @@ void FMapInfoParser::ParseCluster()
ParseAssign(); ParseAssign();
if (ParseLookupName(clusterinfo->EnterText)) if (ParseLookupName(clusterinfo->EnterText))
clusterinfo->flags |= CLUSTER_LOOKUPENTERTEXT; clusterinfo->flags |= CLUSTER_LOOKUPENTERTEXT;
else
{
FStringf testlabel("CLUSTERENTER%d", clusterinfo->cluster);
if (GStrings.MatchDefaultString(testlabel, clusterinfo->EnterText))
{
clusterinfo->EnterText = testlabel;
clusterinfo->flags |= CLUSTER_LOOKUPENTERTEXT;
}
}
} }
else if (sc.Compare("exittext")) else if (sc.Compare("exittext"))
{ {
ParseAssign(); ParseAssign();
if (ParseLookupName(clusterinfo->ExitText)) if (ParseLookupName(clusterinfo->ExitText))
clusterinfo->flags |= CLUSTER_LOOKUPEXITTEXT; clusterinfo->flags |= CLUSTER_LOOKUPEXITTEXT;
else
{
FStringf testlabel("CLUSTEREXIT%d", clusterinfo->cluster);
if (GStrings.MatchDefaultString(testlabel, clusterinfo->ExitText))
{
clusterinfo->ExitText = testlabel;
clusterinfo->flags |= CLUSTER_LOOKUPEXITTEXT;
}
}
} }
else if (sc.Compare("music")) else if (sc.Compare("music"))
{ {
@ -1933,8 +1951,8 @@ level_info_t *FMapInfoParser::ParseMapHeader(level_info_t &defaultinfo)
// Workaround to allow localizazion of IWADs which do not have a string label here (e.g. HACX.WAD) // Workaround to allow localizazion of IWADs which do not have a string label here (e.g. HACX.WAD)
// This checks for a string labelled with the MapName and if that is identical to what got parsed here // This checks for a string labelled with the MapName and if that is identical to what got parsed here
// the string table entry will be used. // the string table entry will be used.
auto c = GStrings.GetLanguageString(levelinfo->MapName, FStringTable::default_table);
if (c && !strcmp(c, sc.String)) if (GStrings.MatchDefaultString(levelinfo->MapName, sc.String))
{ {
levelinfo->flags |= LEVEL_LOOKUPLEVELNAME; levelinfo->flags |= LEVEL_LOOKUPLEVELNAME;
levelinfo->LevelName = levelinfo->MapName; levelinfo->LevelName = levelinfo->MapName;

View File

@ -250,6 +250,10 @@ bool FStringTable::ParseLanguageCSV(const TArray<uint8_t> &buffer)
{ {
InsertString(langentry.second, strName, str); InsertString(langentry.second, strName, str);
} }
else
{
DeleteString(langentry.second, strName);
}
} }
} }
} }
@ -372,6 +376,17 @@ void FStringTable::LoadLanguage (const TArray<uint8_t> &buffer)
// //
//========================================================================== //==========================================================================
void FStringTable::DeleteString(int langid, FName label)
{
allStrings[langid].Remove(label);
}
//==========================================================================
//
//
//
//==========================================================================
void FStringTable::InsertString(int langid, FName label, const FString &string) void FStringTable::InsertString(int langid, FName label, const FString &string)
{ {
const char *strlangid = (const char *)&langid; const char *strlangid = (const char *)&langid;
@ -386,7 +401,7 @@ void FStringTable::InsertString(int langid, FName label, const FString &string)
break; break;
} }
FString macroname(te.strings[0].GetChars() + index + 2, endindex - index - 2); FString macroname(te.strings[0].GetChars() + index + 2, endindex - index - 2);
FStringf lookupstr("%s/%s", strlangid, macroname.GetChars()); FStringf lookupstr("%s/%s", strlangid, macroname.GetChars());
FStringf replacee("@[%s]", macroname.GetChars()); FStringf replacee("@[%s]", macroname.GetChars());
FName lookupname(lookupstr, true); FName lookupname(lookupstr, true);
auto replace = allMacros.CheckKey(lookupname); auto replace = allMacros.CheckKey(lookupname);
@ -550,6 +565,20 @@ const char *FStringTable::GetLanguageString(const char *name, uint32_t langtable
return nullptr; return nullptr;
} }
bool FStringTable::MatchDefaultString(const char *name, const char *content) const
{
// This only compares the first line to avoid problems with bad linefeeds. For the few cases where this feature is needed it is sufficient.
auto c = GetLanguageString(name, FStringTable::default_table);
if (!c) return false;
// Check a secondary key, in case the text comparison cannot be done due to needed orthographic fixes (see Harmony's exit text)
FStringf checkkey("%s_CHECK", name);
auto cc = GetLanguageString(checkkey, FStringTable::default_table);
if (cc) c = cc;
return (c && !strnicmp(c, content, strcspn(content, "\n\r\t")));
}
//========================================================================== //==========================================================================
// //
// Finds a string by name and returns its value. If the string does // Finds a string by name and returns its value. If the string does

View File

@ -89,6 +89,7 @@ public:
} }
const char *GetLanguageString(const char *name, uint32_t langtable, int gender = -1) const; 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 *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 char *name) const; // Never returns NULL
const char *operator[] (const char *name) const const char *operator[] (const char *name) const
@ -110,6 +111,7 @@ private:
bool LoadLanguageFromSpreadsheet(int lumpnum, const TArray<uint8_t> &buffer); bool LoadLanguageFromSpreadsheet(int lumpnum, const TArray<uint8_t> &buffer);
bool readMacros(int lumpnum); bool readMacros(int lumpnum);
void InsertString(int langid, FName label, const FString &string); void InsertString(int langid, FName label, const FString &string);
void DeleteString(int langid, FName label);
static size_t ProcessEscapes (char *str); static size_t ProcessEscapes (char *str);
}; };