Various crash fixes

This commit is contained in:
Aruki
2019-02-18 03:54:58 -07:00
parent 4e1560a99c
commit 0827c05802
12 changed files with 99 additions and 48 deletions

View File

@@ -19,7 +19,9 @@ void CCollisionRenderData::BuildRenderData(const SCollisionIndexData& kIndexData
mWireframeIndexBuffer.SetPrimitiveType(GL_LINES);
// Build list of triangle indices sorted by material index
std::vector<uint16> SortedTris(kIndexData.TriangleMaterialIndices.size(), 0);
// Apparently some collision meshes have more triangle indices than actual triangles
uint NumTris = Math::Min(kIndexData.TriangleIndices.size() / 3, kIndexData.TriangleMaterialIndices.size());
std::vector<uint16> SortedTris(NumTris, 0);
for (uint16 i=0; i<SortedTris.size(); i++)
{

View File

@@ -156,6 +156,7 @@ void CStringCooker::WriteCorruptionSTRG(IOutputStream& STRG)
uint TotalSize;
};
std::vector<SCookedLanguageData> CookedLanguageData( mpStringTable->NumLanguages() );
int EnglishIdx = -1;
for (uint LanguageIdx = 0; LanguageIdx < mpStringTable->NumLanguages(); LanguageIdx++)
{
@@ -165,6 +166,11 @@ void CStringCooker::WriteCorruptionSTRG(IOutputStream& STRG)
CookedData.Language = kLanguageData.Language;
CookedData.StringOffsets.resize( mpStringTable->NumStrings() );
CookedData.TotalSize = 0;
if (CookedData.Language == ELanguage::English)
{
EnglishIdx = (int) LanguageIdx;
}
}
// Language IDs
@@ -185,9 +191,6 @@ void CStringCooker::WriteCorruptionSTRG(IOutputStream& STRG)
STRG.WriteLong( 0 );
}
// Some of the following code assumes that language 0 is English.
ASSERT( mpStringTable->mLanguages[0].Language == ELanguage::English );
// Strings
uint StringsStart = STRG.Tell();
@@ -201,7 +204,7 @@ void CStringCooker::WriteCorruptionSTRG(IOutputStream& STRG)
// If the "localized" flag is disabled, then we will not write this string. Instead, it will
// reuse the offset for the English text.
if (LanguageIdx == 0 || kStringData.IsLocalized)
if (LanguageIdx == EnglishIdx || kStringData.IsLocalized)
{
CookedData.StringOffsets[StringIdx] = STRG.Tell() - StringsStart;
CookedData.TotalSize += kStringData.String.Size() + 1; // +1 for terminating zero
@@ -210,8 +213,8 @@ void CStringCooker::WriteCorruptionSTRG(IOutputStream& STRG)
}
else
{
CookedData.StringOffsets[StringIdx] = CookedLanguageData[0].StringOffsets[StringIdx];
CookedData.TotalSize += mpStringTable->mLanguages[0].Strings[StringIdx].String.Size() + 1; // +1 for terminating zero
CookedData.StringOffsets[StringIdx] = CookedLanguageData[EnglishIdx].StringOffsets[StringIdx];
CookedData.TotalSize += mpStringTable->mLanguages[EnglishIdx].Strings[StringIdx].String.Size() + 1; // +1 for terminating zero
}
}
}

View File

@@ -38,6 +38,7 @@ void CStringLoader::LoadPrimeSTRG(IInputStream& STRG)
// Language definitions
mpStringTable->mLanguages.resize(NumLanguages);
std::vector<uint> LanguageOffsets(NumLanguages);
int EnglishIdx = -1;
for (uint LanguageIdx = 0; LanguageIdx < NumLanguages; LanguageIdx++)
{
@@ -49,10 +50,13 @@ void CStringLoader::LoadPrimeSTRG(IInputStream& STRG)
{
STRG.Skip(4);
}
}
// Some of the following code assumes that language 0 is English
ASSERT( mpStringTable->mLanguages[0].Language == ELanguage::English );
if (mpStringTable->mLanguages[LanguageIdx].Language == ELanguage::English)
{
EnglishIdx = (int) LanguageIdx;
}
}
ASSERT(EnglishIdx != -1);
// String names
if (mVersion >= EGame::EchoesDemo)
@@ -89,16 +93,24 @@ void CStringLoader::LoadPrimeSTRG(IInputStream& STRG)
{
STRG.GoTo( StringOffsets[StringIdx] );
TString String = STRG.Read16String().ToUTF8();
Language.Strings[StringIdx].String = String;
}
}
// Set "localized" flags on strings
const CStringTable::SLanguageData& kEnglishData = mpStringTable->mLanguages[EnglishIdx];
for (uint LanguageIdx = 0; LanguageIdx < NumLanguages; LanguageIdx++)
{
CStringTable::SLanguageData& LanguageData = mpStringTable->mLanguages[LanguageIdx];
for (uint StringIdx = 0; StringIdx < NumStrings; StringIdx++)
{
// Flag the string as localized if it is different than the English
// version of the same string.
const TString& kEnglishString = (StringIdx == 0 ? String :
mpStringTable->mLanguages[0].Strings[StringIdx].String);
bool IsLocalized = (LanguageIdx == 0 || String != kEnglishString);
Language.Strings[StringIdx].String = String;
Language.Strings[StringIdx].IsLocalized = IsLocalized;
const TString& kLocalString = LanguageData.Strings[StringIdx].String;
const TString& kEnglishString = kEnglishData.Strings[StringIdx].String;
LanguageData.Strings[StringIdx].IsLocalized = (LanguageIdx == EnglishIdx || kLocalString != kEnglishString);
}
}
}
@@ -116,11 +128,18 @@ void CStringLoader::LoadCorruptionSTRG(IInputStream& STRG)
// Language definitions
mpStringTable->mLanguages.resize(NumLanguages);
std::vector< std::vector<uint> > LanguageOffsets(NumLanguages);
int EnglishIdx = -1;
for (uint LanguageIdx = 0; LanguageIdx < NumLanguages; LanguageIdx++)
{
mpStringTable->mLanguages[LanguageIdx].Language = (ELanguage) STRG.ReadFourCC();
if (mpStringTable->mLanguages[LanguageIdx].Language == ELanguage::English)
{
EnglishIdx = (int) LanguageIdx;
}
}
ASSERT(EnglishIdx != -1);
for (uint LanguageIdx = 0; LanguageIdx < NumLanguages; LanguageIdx++)
{
@@ -133,9 +152,6 @@ void CStringLoader::LoadCorruptionSTRG(IInputStream& STRG)
}
}
// Some of the following code assumes that language 0 is English
ASSERT( mpStringTable->mLanguages[0].Language == ELanguage::English );
// Strings
uint StringsStart = STRG.Tell();
@@ -151,8 +167,8 @@ void CStringLoader::LoadCorruptionSTRG(IInputStream& STRG)
Language.Strings[StringIdx].String = STRG.ReadString();
// Flag the string as localized if it has a different offset than the English string
Language.Strings[StringIdx].IsLocalized = (LanguageIdx == 0 ||
LanguageOffsets[LanguageIdx][StringIdx] != LanguageOffsets[0][StringIdx]);
Language.Strings[StringIdx].IsLocalized = (LanguageIdx == EnglishIdx ||
LanguageOffsets[LanguageIdx][StringIdx] != LanguageOffsets[EnglishIdx][StringIdx]);
}
}
}

View File

@@ -96,12 +96,13 @@ TString CStringTable::GetString(ELanguage Language, uint StringIndex) const
void CStringTable::SetString(ELanguage Language, uint StringIndex, const TString& kNewString)
{
int LanguageIdx = FindLanguageIndex(this, Language);
int EnglishIdx = FindLanguageIndex(this, ELanguage::English);
if (LanguageIdx >= 0 && mLanguages[LanguageIdx].Strings.size() > StringIndex)
{
mLanguages[LanguageIdx].Strings[StringIndex].String = kNewString;
mLanguages[LanguageIdx].Strings[StringIndex].IsLocalized =
(LanguageIdx == 0 || kNewString != mLanguages[0].Strings[StringIndex].String);
(LanguageIdx == EnglishIdx || kNewString != mLanguages[EnglishIdx].Strings[StringIndex].String);
}
}