Added ability to create brand new SCAN/STRG assets. Added ability to update old projects.

This commit is contained in:
Aruki
2019-02-02 17:32:19 -07:00
parent 1e997dac46
commit 56843e214d
33 changed files with 523 additions and 175 deletions

View File

@@ -1,4 +1,5 @@
#include "CStringTable.h"
#include "Core/GameProject/CGameProject.h"
#include <Common/Math/MathUtil.h>
#include <algorithm>
#include <iterator>
@@ -8,27 +9,27 @@
* This is also the order that languages appear in game STRG assets.
*/
// Supported languages in the original NTSC release of Metroid Prime
const ELanguage gkSupportedLanguagesMP1[] =
const std::vector<ELanguage> gkSupportedLanguagesMP1 =
{
ELanguage::English
};
// Supported languages in the PAL version of Metroid Prime, and also Metroid Prime 2
const ELanguage gkSupportedLanguagesMP1PAL[] =
const std::vector<ELanguage> gkSupportedLanguagesMP1PAL =
{
ELanguage::English, ELanguage::French, ELanguage::German,
ELanguage::Spanish, ELanguage::Italian, ELanguage::Japanese
};
// Supported languages in Metroid Prime 3
const ELanguage gkSupportedLanguagesMP3[] =
const std::vector<ELanguage> gkSupportedLanguagesMP3 =
{
ELanguage::English, ELanguage::Japanese, ELanguage::German,
ELanguage::French, ELanguage::Spanish, ELanguage::Italian
};
// Supported languages in DKCR
const ELanguage gkSupportedLanguagesDKCR[] =
const std::vector<ELanguage> gkSupportedLanguagesDKCR =
{
ELanguage::English, ELanguage::Japanese, ELanguage::German,
ELanguage::French, ELanguage::Spanish, ELanguage::Italian,
@@ -36,6 +37,32 @@ const ELanguage gkSupportedLanguagesDKCR[] =
ELanguage::NAFrench, ELanguage::NASpanish
};
// Utility function - retrieve the language array for a given game/region
static const std::vector<ELanguage>& GetSupportedLanguages(EGame Game, ERegion Region)
{
switch (Game)
{
default:
case EGame::PrimeDemo:
case EGame::Prime:
if (Region == ERegion::NTSC)
return gkSupportedLanguagesMP1;
else
return gkSupportedLanguagesMP1PAL;
case EGame::EchoesDemo:
case EGame::Echoes:
case EGame::CorruptionProto:
return gkSupportedLanguagesMP1PAL;
case EGame::Corruption:
return gkSupportedLanguagesMP3;
case EGame::DKCReturns:
return gkSupportedLanguagesDKCR;
}
}
// Utility function - retrieve the index of a given language
static int FindLanguageIndex(const CStringTable* pkInTable, ELanguage InLanguage)
{
@@ -192,10 +219,19 @@ void CStringTable::RemoveString(uint StringIndex)
}
}
/** Configures the string table with default languages for the game/region pairing of the resource */
void CStringTable::ConfigureDefaultLanguages()
/** Initialize new resource data */
void CStringTable::InitializeNewResource()
{
//@todo; this should be called on all newly created string tables
// Initialize data for whatever languages are supported by our game/region
ERegion Region = ( Entry() && Entry()->Project() ? Entry()->Project()->Region() : ERegion::NTSC );
const std::vector<ELanguage>& kLanguageArray = GetSupportedLanguages(Game(), Region);
mLanguages.resize( kLanguageArray.size() );
for (uint i=0; i < kLanguageArray.size(); i++)
{
mLanguages[i].Language = kLanguageArray[i];
mLanguages[i].Strings.resize(1);
}
}
/** Serialize resource data */
@@ -344,36 +380,12 @@ TString CStringTable::StripFormatting(const TString& kInString)
/** Static - Returns whether a given language is supported by the given game/region combination */
bool CStringTable::IsLanguageSupported(ELanguage Language, EGame Game, ERegion Region)
{
// Pick the correct array to iterate based on which game/region was requested.
const ELanguage* pkSupportedLanguages = nullptr;
uint NumLanguages = 0;
if (Game <= EGame::Prime && Region == ERegion::NTSC)
{
return (Language == ELanguage::English);
}
else if (Game <= EGame::CorruptionProto)
{
pkSupportedLanguages = &gkSupportedLanguagesMP1PAL[0];
NumLanguages = ARRAY_SIZE( gkSupportedLanguagesMP1PAL );
}
else if (Game <= EGame::Corruption)
{
pkSupportedLanguages = &gkSupportedLanguagesMP3[0];
NumLanguages = ARRAY_SIZE( gkSupportedLanguagesMP3 );
}
else if (Game <= EGame::DKCReturns)
{
pkSupportedLanguages = &gkSupportedLanguagesDKCR[0];
NumLanguages = ARRAY_SIZE( gkSupportedLanguagesDKCR );
}
ASSERT(pkSupportedLanguages);
ASSERT(NumLanguages > 0);
const std::vector<ELanguage>& kLanguageArray = GetSupportedLanguages(Game, Region);
// Check if the requested language is in the array.
for (uint LanguageIdx = 0; LanguageIdx < NumLanguages; LanguageIdx++)
for (uint LanguageIdx = 0; LanguageIdx < kLanguageArray.size(); LanguageIdx++)
{
if (pkSupportedLanguages[LanguageIdx] == Language)
if (kLanguageArray[LanguageIdx] == Language)
{
return true;
}

View File

@@ -84,14 +84,14 @@ public:
/** Remove a string from the table */
void RemoveString(uint StringIndex);
/** Configures the string table with default languages for the game/region pairing of the resource */
void ConfigureDefaultLanguages();
/** Initialize new resource data */
virtual void InitializeNewResource() override;
/** Serialize resource data */
virtual void Serialize(IArchive& Arc);
virtual void Serialize(IArchive& Arc) override;
/** Build the dependency tree for this resource */
virtual CDependencyTree* BuildDependencyTree() const;
virtual CDependencyTree* BuildDependencyTree() const override;
/** Static - Strip all formatting tags for a given string */
static TString StripFormatting(const TString& kInString);