Finished the template writer and regenerated templates (most of the template changes are just automated formatting changes)

This commit is contained in:
parax0 2016-02-14 01:03:17 -07:00
parent 3296948bea
commit 34eb7c436e
681 changed files with 2645 additions and 2037 deletions

View File

@ -5,6 +5,7 @@
#include <tinyxml2.h>
using namespace tinyxml2;
TString CTemplateWriter::smTemplatesDir = "../templates/";
CTemplateWriter::CTemplateWriter()
{
@ -14,12 +15,14 @@ void CTemplateWriter::SaveAllTemplates()
{
// Create directory
std::list<CMasterTemplate*> MasterList = CMasterTemplate::GetMasterList();
TString Out = "../templates/";
boost::filesystem::create_directory(Out.ToStdString());
boost::filesystem::create_directory(smTemplatesDir.ToStdString());
// Resave property list
SavePropertyList();
// Resave master templates
for (auto it = MasterList.begin(); it != MasterList.end(); it++)
SaveGameTemplates(*it, Out);
SaveGameTemplates(*it);
// Resave game list
XMLDocument GameList;
@ -31,6 +34,10 @@ void CTemplateWriter::SaveAllTemplates()
pBase->SetAttribute("version", 4);
GameList.LinkEndChild(pBase);
XMLElement *pProperties = GameList.NewElement("properties");
pProperties->SetText("Properties.xml");
pBase->LinkEndChild(pProperties);
for (auto it = MasterList.begin(); it != MasterList.end(); it++)
{
CMasterTemplate *pMaster = *it;
@ -52,20 +59,24 @@ void CTemplateWriter::SaveAllTemplates()
pGame->LinkEndChild(pTempPath);
}
TString GameListName = Out + "GameList.xml";
TString GameListName = smTemplatesDir + "GameList.xml";
GameList.SaveFile(*GameListName);
}
void CTemplateWriter::SaveGameTemplates(CMasterTemplate *pMaster, const TString& rkDir)
void CTemplateWriter::SaveGameTemplates(CMasterTemplate *pMaster)
{
// Create directory
TString OutFile = rkDir + pMaster->mSourceFile;
TString OutFile = smTemplatesDir + pMaster->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
boost::filesystem::create_directory(OutDir.ToStdString());
// Resave script templates
for (auto it = pMaster->mTemplates.begin(); it != pMaster->mTemplates.end(); it++)
SaveScriptTemplate(it->second, OutDir);
SaveScriptTemplate(it->second);
// Resave struct templates
for (auto it = pMaster->mStructTemplates.begin(); it != pMaster->mStructTemplates.end(); it++)
SaveStructTemplate(it->second, pMaster);
// Resave master template
XMLDocument Master;
@ -77,16 +88,6 @@ void CTemplateWriter::SaveGameTemplates(CMasterTemplate *pMaster, const TString&
pBase->SetAttribute("version", 4);
Master.LinkEndChild(pBase);
// Write property list
if (!pMaster->smPropertyNames.empty())
{
SavePropertyList(OutDir);
XMLElement *pPropList = Master.NewElement("properties");
pPropList->SetText("Properties.xml");
pBase->LinkEndChild(pPropList);
}
// Write versions
if (!pMaster->mGameVersions.empty())
{
@ -97,7 +98,7 @@ void CTemplateWriter::SaveGameTemplates(CMasterTemplate *pMaster, const TString&
{
XMLElement *pVersion = Master.NewElement("version");
pVersion->SetText(*(*it));
pBase->LinkEndChild(pVersion);
pVersionsBlock->LinkEndChild(pVersion);
}
}
@ -147,7 +148,7 @@ void CTemplateWriter::SaveGameTemplates(CMasterTemplate *pMaster, const TString&
Master.SaveFile(*OutFile);
}
void CTemplateWriter::SavePropertyList(const TString& rkDir)
void CTemplateWriter::SavePropertyList()
{
// Create XML
XMLDocument List;
@ -171,16 +172,18 @@ void CTemplateWriter::SavePropertyList(const TString& rkDir)
pBase->LinkEndChild(pElem);
}
TString OutFile = rkDir + "Properties.xml";
TString OutFile = smTemplatesDir + "Properties.xml";
List.SaveFile(*OutFile);
}
void CTemplateWriter::SaveScriptTemplate(CScriptTemplate *pTemp, const TString& rkDir)
void CTemplateWriter::SaveScriptTemplate(CScriptTemplate *pTemp)
{
CMasterTemplate *pMaster = pTemp->MasterTemplate();
// Create directory
TString OutFile = rkDir + pTemp->mSourceFile;
TString outDir = OutFile.GetFileDirectory();
boost::filesystem::create_directory(*outDir);
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
boost::filesystem::create_directory(*OutDir);
// Create new document
XMLDocument ScriptXML;
@ -199,7 +202,14 @@ void CTemplateWriter::SaveScriptTemplate(CScriptTemplate *pTemp, const TString&
pRoot->LinkEndChild(pName);
// Write properties
SaveProperties(&ScriptXML, pRoot, pTemp->mpBaseStruct, pTemp->MasterTemplate(), rkDir);
SaveProperties(&ScriptXML, pRoot, pTemp->mpBaseStruct, pMaster);
// States/Messages [todo]
XMLElement *pStates = ScriptXML.NewElement("states");
pRoot->LinkEndChild(pStates);
XMLElement *pMessages = ScriptXML.NewElement("messages");
pRoot->LinkEndChild(pMessages);
// Write editor properties
XMLElement *pEditor = ScriptXML.NewElement("editor");
@ -248,12 +258,12 @@ void CTemplateWriter::SaveScriptTemplate(CScriptTemplate *pTemp, const TString&
}
s32 Force = -1;
if (it->AssetSource == CScriptTemplate::SEditorAsset::eAnimParams)
if (it->AssetType == CScriptTemplate::SEditorAsset::eAnimParams)
Force = it->ForceNodeIndex;
XMLElement *pAsset = ScriptXML.NewElement(*Type);
pAsset->SetAttribute("source", *Source);
if (Force >= 0) pAsset->SetAttribute("force", std::to_string(Force).c_str());
if (Force >= 0) pAsset->SetAttribute("force", *TString::FromInt32(Force, 0, 10));
pAsset->SetText(*it->AssetLocation);
pAssets->LinkEndChild(pAsset);
}
@ -314,7 +324,7 @@ void CTemplateWriter::SaveScriptTemplate(CScriptTemplate *pTemp, const TString&
// Write conditions
for (auto it = pTemp->mVolumeConditions.begin(); it != pTemp->mVolumeConditions.end(); it++)
{
// Value should be an integer, or a boolean condition?
// Value should be an integer, or a boolean condition
TString StrVal;
if (pProp->Type() == eBoolProperty)
@ -335,10 +345,10 @@ void CTemplateWriter::SaveScriptTemplate(CScriptTemplate *pTemp, const TString&
ScriptXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveStructTemplate(CStructTemplate *pTemp, CMasterTemplate *pMaster, const TString& rkDir)
void CTemplateWriter::SaveStructTemplate(CStructTemplate *pTemp, CMasterTemplate *pMaster)
{
// Create directory
TString OutFile = rkDir + pTemp->mSourceFile;
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
TString Name = OutFile.GetFileName(false);
boost::filesystem::create_directory(OutDir.ToStdString());
@ -354,14 +364,14 @@ void CTemplateWriter::SaveStructTemplate(CStructTemplate *pTemp, CMasterTemplate
pRoot->SetAttribute("type", (pTemp->IsSingleProperty() ? "single" : "multi"));
StructXML.LinkEndChild(pRoot);
SaveProperties(&StructXML, pRoot, pTemp, pMaster, rkDir);
SaveProperties(&StructXML, pRoot, pTemp, pMaster);
StructXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveEnumTemplate(CEnumTemplate *pTemp, const TString& rkDir)
void CTemplateWriter::SaveEnumTemplate(CEnumTemplate *pTemp, CMasterTemplate *pMaster)
{
// Create directory
TString OutFile = rkDir + pTemp->mSourceFile;
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
TString Name = OutFile.GetFileName(false);
boost::filesystem::create_directory(*OutDir);
@ -380,10 +390,10 @@ void CTemplateWriter::SaveEnumTemplate(CEnumTemplate *pTemp, const TString& rkDi
EnumXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveBitfieldTemplate(CBitfieldTemplate *pTemp, const TString& rkDir)
void CTemplateWriter::SaveBitfieldTemplate(CBitfieldTemplate *pTemp, CMasterTemplate *pMaster)
{
// Create directory
TString OutFile = rkDir + pTemp->mSourceFile;
TString OutFile = smTemplatesDir + pMaster->GetDirectory() + pTemp->mSourceFile;
TString OutDir = OutFile.GetFileDirectory();
TString Name = pTemp->mSourceFile.GetFileName(false);
boost::filesystem::create_directory(*OutDir);
@ -402,7 +412,7 @@ void CTemplateWriter::SaveBitfieldTemplate(CBitfieldTemplate *pTemp, const TStri
BitfieldXML.SaveFile(*OutFile);
}
void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CStructTemplate *pTemp, CMasterTemplate *pMaster, const TString& rkDir)
void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CStructTemplate *pTemp, CMasterTemplate *pMaster)
{
// Create base element
XMLElement *pPropsBlock = pDoc->NewElement("properties");
@ -429,20 +439,15 @@ void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CSt
else
pElem = pDoc->NewElement("property");
pPropsBlock->LinkEndChild(pElem);
// Set common property parameters, starting with ID
pElem->SetAttribute("ID", *StrID);
// Type
if (pProp->Type() == eStructProperty)
pElem->SetAttribute("type", (static_cast<CStructTemplate*>(pProp)->mIsSingleProperty ? "single" : "multi"));
else if (TString(pElem->Name()) == "property")
pElem->SetAttribute("type", *PropEnumToPropString(pProp->Type()));
// Name
TString Name = pProp->Name();
if (pMaster->GetGame() >= eEchoesDemo)
if (pMaster->GetGame() >= eEchoesDemo && ID > 0xFF)
{
TString MasterName = CMasterTemplate::GetPropertyName(ID);
@ -453,14 +458,53 @@ void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CSt
else
pElem->SetAttribute("name", *Name);
// Type
if (pProp->Type() == eStructProperty)
{
CStructTemplate *pStruct = static_cast<CStructTemplate*>(pProp);
if (pStruct->mSourceFile.IsEmpty())
pElem->SetAttribute("type", (pStruct->mIsSingleProperty ? "single" : "multi"));
}
else if (TString(pElem->Name()) == "property")
pElem->SetAttribute("type", *PropEnumToPropString(pProp->Type()));
// Versions
u32 NumVersions = pProp->mAllowedVersions.size();
if (NumVersions > 0 && NumVersions != pMaster->mGameVersions.size())
{
XMLElement *pVersions = pDoc->NewElement("versions");
pElem->LinkEndChild(pVersions);
for (u32 iVer = 0; iVer < pMaster->mGameVersions.size(); iVer++)
{
if (pProp->IsInVersion(iVer))
{
XMLElement *pVersion = pDoc->NewElement("version");
pVersion->SetText(*pMaster->mGameVersions[iVer]);
pVersions->LinkEndChild(pVersion);
}
}
}
// Default
if (pProp->CanHaveDefault())
if (pProp->CanHaveDefault() && pMaster->GetGame() >= eEchoesDemo)
{
XMLElement *pDefault = pDoc->NewElement("default");
pDefault->SetText(*pProp->DefaultToString());
pElem->LinkEndChild(pDefault);
}
// Description
if (!pProp->Description().IsEmpty())
{
XMLElement *pDesc = pDoc->NewElement("description");
pDesc->SetText(*pProp->Description());
pElem->LinkEndChild(pDesc);
}
// Range
if (pProp->IsNumerical() && pProp->HasValidRange())
{
@ -502,7 +546,8 @@ void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CSt
for (auto it = rkExtensions.begin(); it != rkExtensions.end(); it++)
ExtensionsString += *it + ",";
ExtensionsString.ChopBack(1); // Remove extra comma
ExtensionsString = ExtensionsString.ChopBack(1); // Remove extra comma
if (ExtensionsString.IsEmpty()) ExtensionsString = "UNKN";
pElem->SetAttribute("extensions", *ExtensionsString);
}
@ -516,7 +561,7 @@ void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CSt
else
{
SaveEnumTemplate(pEnum, rkDir);
SaveEnumTemplate(pEnum, pMaster);
pElem->SetAttribute("template", *pEnum->mSourceFile);
}
}
@ -531,28 +576,167 @@ void CTemplateWriter::SaveProperties(XMLDocument *pDoc, XMLElement *pParent, CSt
else
{
SaveBitfieldTemplate(pBitfield, rkDir);
SaveBitfieldTemplate(pBitfield, pMaster);
pElem->SetAttribute("template", *pBitfield->mSourceFile);
}
}
// Struct/array-specific parameters
if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
else if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
{
// Element Name
if (pProp->Type() == eArrayProperty)
{
CArrayTemplate *pArray = static_cast<CArrayTemplate*>(pProp);
if (!pArray->ElementName().IsEmpty())
{
XMLElement *pElement = pDoc->NewElement("element_name");
pElement->SetText(*static_cast<CArrayTemplate*>(pProp)->ElementName());
pElem->LinkEndChild(pElement);
}
}
// Sub-properties
CStructTemplate *pStruct = static_cast<CStructTemplate*>(pProp);
if (pStruct->mSourceFile.IsEmpty())
SaveProperties(pDoc, pElem, pStruct, pMaster, rkDir);
SaveProperties(pDoc, pElem, pStruct, pMaster);
else
{
SaveStructTemplate(pStruct, pMaster, rkDir);
auto it = pMaster->mStructTemplates.find(pStruct->mSourceFile);
if (it != pMaster->mStructTemplates.end())
SavePropertyOverrides(pDoc, pElem, pStruct, it->second);
pElem->SetAttribute("template", *pStruct->mSourceFile);
}
}
}
}
void CTemplateWriter::SavePropertyOverrides(XMLDocument *pDoc, XMLElement *pParent, CStructTemplate *pStruct, CStructTemplate *pOriginal)
{
if (!pStruct->StructDataMatches(pOriginal))
{
// Create base element
XMLElement *pPropsBlock = pDoc->NewElement("properties");
pParent->LinkEndChild(pPropsBlock);
for (u32 iProp = 0; iProp < pStruct->Count(); iProp++)
{
IPropertyTemplate *pProp = pStruct->PropertyByIndex(iProp);
IPropertyTemplate *pSource = pOriginal->PropertyByIndex(iProp);
if (!pProp->Matches(pSource))
{
// Create element
XMLElement *pElem;
if (pProp->Type() == eStructProperty)
pElem = pDoc->NewElement("struct");
else if (pProp->Type() == eEnumProperty)
pElem = pDoc->NewElement("enum");
else if (pProp->Type() == eBitfieldProperty)
pElem = pDoc->NewElement("bitfield");
else if (pProp->Type() == eArrayProperty)
pElem = pDoc->NewElement("array");
else
pElem = pDoc->NewElement("property");
pPropsBlock->LinkEndChild(pElem);
// ID
u32 ID = pProp->PropertyID();
pElem->SetAttribute("ID", *TString::HexString(pProp->PropertyID(), true, true, (ID > 0xFF ? 8 : 2)));
// Name
if (pProp->Name() != pSource->Name())
pElem->SetAttribute("name", *pProp->Name());
// Default
if (pProp->CanHaveDefault() && !pProp->RawDefaultValue()->Matches(pSource->RawDefaultValue()))
{
XMLElement *pDefault = pDoc->NewElement("default");
pDefault->SetText(*pProp->DefaultToString());
pElem->LinkEndChild(pDefault);
}
// Description
if (pProp->Description() != pSource->Description())
{
XMLElement *pDesc = pDoc->NewElement("description");
pDesc->SetText(*pProp->Description());
pElem->LinkEndChild(pDesc);
}
// Range
if (pProp->IsNumerical())
{
TString Range = pProp->RangeToString();
if (Range != pSource->RangeToString())
{
XMLElement *pRange = pDoc->NewElement("range");
pRange->SetText(*Range);
pElem->LinkEndChild(pRange);
}
}
// Suffix
if (pProp->Suffix() != pSource->Suffix())
{
XMLElement *pSuffix = pDoc->NewElement("suffix");
pSuffix->SetText(*pProp->Suffix());
pElem->LinkEndChild(pSuffix);
}
// Cook Pref
if (pProp->CookPreference() != pSource->CookPreference())
{
XMLElement *pCookPref = pDoc->NewElement("should_cook");
TString PrefStr;
if (pProp->CookPreference() == eAlwaysCook) PrefStr = "always";
else if (pProp->CookPreference() == eNeverCook) PrefStr = "never";
else PrefStr = "nopref";
pCookPref->SetText(*PrefStr);
pElem->LinkEndChild(pCookPref);
}
// File-specific parameters
if (pProp->Type() == eFileProperty)
{
CFileTemplate *pFile = static_cast<CFileTemplate*>(pProp);
CFileTemplate *pSourceFile = static_cast<CFileTemplate*>(pSource);
if (pFile->Extensions() != pSourceFile->Extensions())
{
TString ExtensionsString;
for (auto it = pFile->Extensions().begin(); it != pFile->Extensions().end(); it++)
ExtensionsString += *it + ",";
ExtensionsString = ExtensionsString.ChopBack(1);
if (ExtensionsString.IsEmpty()) ExtensionsString = "UNKN";
pElem->SetAttribute("extensions", *ExtensionsString);
}
}
// Struct/array-specific parameters
else if (pProp->Type() == eStructProperty || pProp->Type() == eArrayProperty)
{
CStructTemplate *pStruct = static_cast<CStructTemplate*>(pProp);
CStructTemplate *pSourceStruct = static_cast<CStructTemplate*>(pSource);
SavePropertyOverrides(pDoc, pElem, pStruct, pSourceStruct);
}
}
}
}
}
void CTemplateWriter::SaveEnumerators(XMLDocument *pDoc, XMLElement *pParent, CEnumTemplate *pTemp)
{
XMLElement *pEnumerators = pDoc->NewElement("enumerators");
@ -562,7 +746,7 @@ void CTemplateWriter::SaveEnumerators(XMLDocument *pDoc, XMLElement *pParent, CE
{
XMLElement *pElem = pDoc->NewElement("enumerator");
u32 EnumerID = pTemp->EnumeratorID(iEnum);
pElem->SetAttribute("ID", *TString::HexString(EnumerID, true, true, (EnumerID > 0xFF ? 8 : 0)));
pElem->SetAttribute("ID", *TString::HexString(EnumerID, true, true, (EnumerID > 0xFF ? 8 : 2)));
pElem->SetAttribute("name", *pTemp->EnumeratorName(iEnum));
pEnumerators->LinkEndChild(pElem);
}

View File

@ -8,16 +8,18 @@
class CTemplateWriter
{
CTemplateWriter();
static TString smTemplatesDir;
public:
static void SaveAllTemplates();
static void SaveGameTemplates(CMasterTemplate *pMaster, const TString& rkDir);
static void SavePropertyList(const TString& rkDir);
static void SaveScriptTemplate(CScriptTemplate *pTemp, const TString& rkDir);
static void SaveStructTemplate(CStructTemplate *pTemp, CMasterTemplate *pMaster, const TString& rkDir);
static void SaveEnumTemplate(CEnumTemplate *pTemp, const TString& rkDir);
static void SaveBitfieldTemplate(CBitfieldTemplate *pTemp, const TString& rkDir);
static void SaveProperties(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CStructTemplate *pTemp, CMasterTemplate *pMaster, const TString& rkDir);
static void SaveGameTemplates(CMasterTemplate *pMaster);
static void SavePropertyList();
static void SaveScriptTemplate(CScriptTemplate *pTemp);
static void SaveStructTemplate(CStructTemplate *pTemp, CMasterTemplate *pMaster);
static void SaveEnumTemplate(CEnumTemplate *pTemp, CMasterTemplate *pMaster);
static void SaveBitfieldTemplate(CBitfieldTemplate *pTemp, CMasterTemplate *pMaster);
static void SaveProperties(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CStructTemplate *pTemp, CMasterTemplate *pMaster);
static void SavePropertyOverrides(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CStructTemplate *pStruct, CStructTemplate *pOriginal);
static void SaveEnumerators(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CEnumTemplate *pTemp);
static void SaveBitFlags(tinyxml2::XMLDocument *pDoc, tinyxml2::XMLElement *pParent, CBitfieldTemplate *pTemp);
};

View File

@ -20,7 +20,7 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CStructTempl
// Get ID + name
if (IDAttr.IsEmpty())
{
Log::Error("Error reading " + rkTemplateName + "; ran into a property with no ID");
Log::Error(rkTemplateName + ": ran into a property with no ID");
return nullptr;
}
@ -33,7 +33,7 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CStructTempl
Name = CMasterTemplate::GetPropertyName(ID);
else
{
Log::Error("Error reading " + rkTemplateName + " property " + TString::HexString(ID, true, true, 8) + "; this property doesn't have a name either in the template itself nor in the master list");
Log::Error(rkTemplateName + ": Property " + TString::HexString(ID, true, true, 8) + " doesn't have a name either in the template itself nor in the master list");
return nullptr;
}
@ -53,9 +53,9 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CStructTempl
if (Type == eInvalidProperty)
{
if (TypeStr.IsEmpty())
Log::Error("Error reading " + rkTemplateName + " property " + TString::HexString(ID, true, true, 8) + "; this property doesn't have a valid type set");
Log::Error(rkTemplateName + ": Property " + TString::HexString(ID, true, true, 8) + " doesn't have a type set");
else
Log::Error("Error reading " + rkTemplateName + " property " + TString::HexString(ID, true, true, 8) + "; this property has an invalid type set: " + TypeStr);
Log::Error(rkTemplateName + ": Property " + TString::HexString(ID, true, true, 8) + " has an invalid type set: " + TypeStr);
return nullptr;
}
@ -64,7 +64,7 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CStructTempl
if (!pProp)
{
Log::Error("Error reading " + rkTemplateName + " property " + TString::HexString(ID, true, true, 8) + "; seem to have attempted to load a valid but unsupported property type? (" + TypeStr + ")");
Log::Error(rkTemplateName + ": Property " + TString::HexString(ID, true, true, 8) + " seems to be using a valid but unsupported property type? (" + TypeStr + ")");
return nullptr;
}
}
@ -90,7 +90,7 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CStructTempl
u32 VerIdx = mpMaster->GetGameVersion(VerName);
if (VerIdx == -1)
Log::Error("Error reading " + rkTemplateName + " property " + TString::HexString(ID, true, true, 8) + "; invalid version \"" + VerName + "\"");
Log::Error(rkTemplateName + ": Property " + TString::HexString(ID, true, true, 8) + " has invalid version \"" + VerName + "\"");
else
pProp->mAllowedVersions.push_back(VerIdx);
@ -156,15 +156,16 @@ IPropertyTemplate* CTemplateLoader::LoadProperty(XMLElement *pElem, CStructTempl
LoadStructTemplate(TemplateAttr, pStruct);
if (IsNewProperty && TemplateAttr.IsEmpty() && Type == eStructProperty)
pStruct->mIsSingleProperty = (TypeAttr == "single" ? true : false);
pStruct->mIsSingleProperty = (TypeAttr == "single");
// Load sub-properties
// Load sub-properties and parameter overrides
XMLElement *pProperties = pElem->FirstChildElement("properties");
if (pProperties)
LoadProperties(pProperties, pStruct, rkTemplateName);
}
CMasterTemplate::AddProperty(pProp, mMasterDir + rkTemplateName);
return pProp;
}
@ -184,7 +185,7 @@ IPropertyTemplate* CTemplateLoader::CreateProperty(u32 ID, EPropertyType Type, c
case eVector3Property: pOut = CREATE_PROP_TEMP(TVector3Template); break;
case eColorProperty: pOut = CREATE_PROP_TEMP(TColorTemplate); break;
case eFileProperty: pOut = CREATE_PROP_TEMP(CFileTemplate); break;
case eCharacterProperty: pOut = CREATE_PROP_TEMP(CCharacterTemplate); break;
case eCharacterProperty: pOut = CREATE_PROP_TEMP(TCharacterTemplate); break;
case eEnumProperty: pOut = CREATE_PROP_TEMP(CEnumTemplate); break;
case eBitfieldProperty: pOut = CREATE_PROP_TEMP(CBitfieldTemplate); break;
case eArrayProperty: pOut = CREATE_PROP_TEMP(CArrayTemplate); break;
@ -199,60 +200,81 @@ IPropertyTemplate* CTemplateLoader::CreateProperty(u32 ID, EPropertyType Type, c
void CTemplateLoader::LoadStructTemplate(const TString& rkTemplateFileName, CStructTemplate *pStruct)
{
XMLDocument Doc;
OpenXML(mMasterDir + rkTemplateFileName, Doc);
// Check whether this struct has already been read
auto it = mpMaster->mStructTemplates.find(rkTemplateFileName);
CStructTemplate *pSource = (it == mpMaster->mStructTemplates.end() ? nullptr : it->second);
if (!Doc.Error())
// If the source hasn't been read yet, then we read it and add it to master's list
if (!pSource)
{
XMLElement *pRootElem;
XMLDocument Doc;
OpenXML(mskTemplatesDir + mMasterDir + rkTemplateFileName, Doc);
if (pStruct->Type() == eStructProperty)
if (!Doc.Error())
{
pRootElem = Doc.FirstChildElement("struct");
XMLElement *pRootElem;
if (!pRootElem)
if (pStruct->Type() == eStructProperty)
{
Log::Error("Error reading struct template " + rkTemplateFileName + ": there is no root \"struct\" element");
return;
pSource = new CStructTemplate(-1, nullptr);
pRootElem = Doc.FirstChildElement("struct");
if (!pRootElem)
{
Log::Error(rkTemplateFileName + ": There is no root \"struct\" element");
return;
}
TString TypeAttr = TString(pRootElem->Attribute("type")).ToLower();
if (TypeAttr.IsEmpty())
{
Log::Error(rkTemplateFileName + ": There is no struct type specified");
return;
}
pSource->mIsSingleProperty = (TypeAttr == "single" ? true : false);
}
TString TypeAttr = TString(pRootElem->Attribute("type")).ToLower();
if (TypeAttr.IsEmpty())
else if (pStruct->Type() == eArrayProperty)
{
Log::Error("Error reading struct template " + rkTemplateFileName + "; there is no struct type specified");
return;
pRootElem = Doc.FirstChildElement("array");
if (!pRootElem)
{
Log::Error(rkTemplateFileName + ": There is no root \"array\" element");
return;
}
}
pStruct->mIsSingleProperty = (TypeAttr == "single" ? true : false);
}
// Read sub-properties
XMLElement *pSubPropsElem = pRootElem->FirstChildElement("properties");
else if (pStruct->Type() == eArrayProperty)
{
pRootElem = Doc.FirstChildElement("array");
if (!pRootElem)
if (pSubPropsElem)
{
Log::Error("Error reading array template " + rkTemplateFileName + "; there is no root \"array\" element");
return;
LoadProperties(pSubPropsElem, pSource, rkTemplateFileName);
mpMaster->mStructTemplates[rkTemplateFileName] = pSource;
pSource->mSourceFile = rkTemplateFileName;
}
else
{
Log::Error(rkTemplateFileName + ": There is no \"properties\" block element");
delete pSource;
pSource = nullptr;
}
}
// Read sub-properties
XMLElement *pSubPropsElem = pRootElem->FirstChildElement("properties");
if (pSubPropsElem)
LoadProperties(pSubPropsElem, pStruct, rkTemplateFileName);
else
Log::Error("Error reading " + TString(pStruct->Type() == eStructProperty ? "struct" : "array") + " template " + rkTemplateFileName + "; there's no \"properties\" block element");
}
// Copy source to the new struct template
if (pSource)
pStruct->CopyStructData(pSource);
}
void CTemplateLoader::LoadEnumTemplate(const TString& rkTemplateFileName, CEnumTemplate *pEnum)
{
XMLDocument Doc;
OpenXML(mMasterDir + rkTemplateFileName, Doc);
OpenXML(mskTemplatesDir + mMasterDir + rkTemplateFileName, Doc);
if (!Doc.Error())
{
@ -260,7 +282,7 @@ void CTemplateLoader::LoadEnumTemplate(const TString& rkTemplateFileName, CEnumT
if (!pRootElem)
{
Log::Error("Error reading enum template " + rkTemplateFileName + "; there is no root \"enum\" element");
Log::Error(rkTemplateFileName + ": There is no root \"enum\" element");
return;
}
@ -270,14 +292,16 @@ void CTemplateLoader::LoadEnumTemplate(const TString& rkTemplateFileName, CEnumT
LoadEnumerators(pEnumers, pEnum, rkTemplateFileName);
else
Log::Error("Error reading enum template " + rkTemplateFileName + "; there is no \"enumerators\" block element");
Log::Error(rkTemplateFileName + ": There is no \"enumerators\" block element");
pEnum->mSourceFile = rkTemplateFileName;
}
}
void CTemplateLoader::LoadBitfieldTemplate(const TString& rkTemplateFileName, CBitfieldTemplate *pBitfield)
{
XMLDocument Doc;
OpenXML(mMasterDir + rkTemplateFileName, Doc);
OpenXML(mskTemplatesDir + mMasterDir + rkTemplateFileName, Doc);
if (!Doc.Error())
{
@ -285,7 +309,7 @@ void CTemplateLoader::LoadBitfieldTemplate(const TString& rkTemplateFileName, CB
if (!pRootElem)
{
Log::Error("Error reading bitfield template " + rkTemplateFileName + "; there is no root \"bitfield\" element");
Log::Error(rkTemplateFileName + ": There is no root \"bitfield\" element");
return;
}
@ -295,7 +319,9 @@ void CTemplateLoader::LoadBitfieldTemplate(const TString& rkTemplateFileName, CB
LoadBitFlags(pFlags, pBitfield, rkTemplateFileName);
else
Log::Error("Error reading bitfield template " + rkTemplateFileName + "; there is no \"flags\" block element");
Log::Error(rkTemplateFileName + ": There is no \"flags\" block element");
pBitfield->mSourceFile = rkTemplateFileName;
}
}
@ -309,7 +335,7 @@ void CTemplateLoader::LoadProperties(XMLElement *pPropertiesElem, CStructTemplat
if ( (NodeType != "property") && (NodeType != "struct") && (NodeType != "enum") && (NodeType != "bitfield") && (NodeType != "array") )
{
Log::Error("Error reading " + rkTemplateName + "; a node in a properties block has an invalid name: " + NodeType);
Log::Error(rkTemplateName + ": A node in a properties block has an invalid name: " + NodeType);
}
// LoadProperty adds newly created properties to the struct, so we don't need to do anything other than call it for each sub-element.
@ -339,7 +365,7 @@ void CTemplateLoader::LoadEnumerators(XMLElement *pEnumeratorsElem, CEnumTemplat
else
{
TString LogErrorBase = "Couldn't parse enumerator in " + rkTemplateName + "; ";
TString LogErrorBase = rkTemplateName + ": Couldn't parse enumerator; ";
if (!pkID && pkName) Log::Error(LogErrorBase + "no valid ID (" + pkName + ")");
else if (pkID && !pkName) Log::Error(LogErrorBase + "no valid name (ID " + pkID + ")");
@ -364,7 +390,7 @@ void CTemplateLoader::LoadBitFlags(XMLElement *pFlagsElem, CBitfieldTemplate *pT
else
{
TString LogErrorBase = "Couldn't parse bit flag in " + templateName + "; ";
TString LogErrorBase = templateName + ": Couldn't parse bit flag; ";
if (!pkMask && pkName) Log::Error(LogErrorBase + "no mask (" + pkName + ")");
else if (pkMask && !pkName) Log::Error(LogErrorBase + "no name (mask " + pkMask + ")");
@ -381,6 +407,7 @@ CScriptTemplate* CTemplateLoader::LoadScriptTemplate(XMLDocument *pDoc, const TS
CScriptTemplate *pScript = new CScriptTemplate(mpMaster);
pScript->mObjectID = ObjectID;
pScript->mpBaseStruct = new CStructTemplate(-1, nullptr);
pScript->mSourceFile = rkTemplateName;
XMLElement *pRoot = pDoc->FirstChildElement("ScriptTemplate");
@ -399,7 +426,7 @@ CScriptTemplate* CTemplateLoader::LoadScriptTemplate(XMLDocument *pDoc, const TS
if (pPropsElem)
LoadProperties(pPropsElem, pScript->mpBaseStruct, rkTemplateName);
else
Log::Error("Error reading script template " + rkTemplateName + "; there is no properties block");
Log::Error(rkTemplateName + ": There is no \"properties\" block element");
// Editor Parameters
XMLElement *pEditor = pRoot->FirstChildElement("editor");
@ -413,7 +440,7 @@ CScriptTemplate* CTemplateLoader::LoadScriptTemplate(XMLDocument *pDoc, const TS
while (pEdProp)
{
TString Name = TString(pEdProp->Attribute("name")).ToLower();
TString ID = TString(pEdProp->Attribute("ID")).ToLower();
TString ID = TString(pEdProp->Attribute("ID"));
if (!Name.IsEmpty() && !ID.IsEmpty())
{
@ -489,7 +516,7 @@ CScriptTemplate* CTemplateLoader::LoadScriptTemplate(XMLDocument *pDoc, const TS
{
if (!pScript->mpBaseStruct->HasProperty(Asset.AssetLocation))
{
Log::Error("Error reading script template " + rkTemplateName + "; invalid property for " + Type + " asset: " + ID);
Log::Error(rkTemplateName + ": Invalid property for " + Type + " asset: " + ID);
pAsset = pAsset->NextSiblingElement();
continue;
}
@ -501,7 +528,7 @@ CScriptTemplate* CTemplateLoader::LoadScriptTemplate(XMLDocument *pDoc, const TS
TString Path = "../resources/" + ID;
if (!boost::filesystem::exists(*Path))
{
Log::Error("Error reading script template " + rkTemplateName + "; invalid file for " + Type + " asset: " + ID);
Log::Error(rkTemplateName + ": Invalid file for " + Type + " asset: " + ID);
pAsset = pAsset->NextSiblingElement();
continue;
}
@ -625,7 +652,7 @@ CScriptTemplate* CTemplateLoader::LoadScriptTemplate(XMLDocument *pDoc, const TS
void CTemplateLoader::LoadMasterTemplate(XMLDocument *pDoc, CMasterTemplate *pMaster)
{
mpMaster = pMaster;
mMasterDir = mskTemplatesDir + pMaster->mSourceFile.GetFileDirectory();
mMasterDir = pMaster->mSourceFile.GetFileDirectory();
XMLElement *pRoot = pDoc->FirstChildElement("MasterTemplate");
mpMaster->mVersion = TString(pRoot->Attribute("version")).ToInt32();
@ -668,17 +695,14 @@ void CTemplateLoader::LoadMasterTemplate(XMLDocument *pDoc, CMasterTemplate *pMa
TString TemplateName = pObj->Attribute("template");
XMLDocument ScriptXML;
OpenXML(mMasterDir + TemplateName, ScriptXML);
OpenXML(mskTemplatesDir + mMasterDir + TemplateName, ScriptXML);
if (!ScriptXML.Error())
{
CScriptTemplate *pTemp = LoadScriptTemplate(&ScriptXML, TemplateName, ID);
if (pTemp)
{
pTemp->mSourceFile = TemplateName;
mpMaster->mTemplates[ID] = pTemp;
}
}
pObj = pObj->NextSiblingElement("object");
@ -773,7 +797,7 @@ void CTemplateLoader::OpenXML(const TString& rkPath, XMLDocument& rDoc)
if (rDoc.Error())
{
TString Name = AbsPath.GetFileName();
Log::Error("Error when opening template XML " + Name + ": " + ErrorName(rDoc.ErrorID()));
Log::Error("Error opening " + Name + ": " + ErrorName(rDoc.ErrorID()));
}
}
@ -781,27 +805,27 @@ TString CTemplateLoader::ErrorName(XMLError Error)
{
switch (Error)
{
case XML_SUCCESS: return "Success";
case XML_NO_ATTRIBUTE: return "No attribute";
case XML_WRONG_ATTRIBUTE_TYPE: return "Wrong attribute type";
case XML_ERROR_FILE_NOT_FOUND: return "File not found";
case XML_ERROR_FILE_COULD_NOT_BE_OPENED: return "File could not be opened";
case XML_ERROR_FILE_READ_ERROR: return "File read error";
case XML_ERROR_ELEMENT_MISMATCH: return "Element mismatch";
case XML_ERROR_PARSING_ELEMENT: return "Parsing element";
case XML_ERROR_PARSING_ATTRIBUTE: return "Parsing attribute";
case XML_ERROR_IDENTIFYING_TAG: return "Identifying tag";
case XML_ERROR_PARSING_TEXT: return "Parsing text";
case XML_ERROR_PARSING_CDATA: return "Parsing CData";
case XML_ERROR_PARSING_COMMENT: return "Parsing comment";
case XML_ERROR_PARSING_DECLARATION: return "Parsing declaration";
case XML_ERROR_PARSING_UNKNOWN: return "Parsing unknown";
case XML_ERROR_EMPTY_DOCUMENT: return "Empty document";
case XML_ERROR_MISMATCHED_ELEMENT: return "Mismatched element";
case XML_ERROR_PARSING: return "Parsing";
case XML_CAN_NOT_CONVERT_TEXT: return "Cannot convert text";
case XML_NO_TEXT_NODE: return "No text node";
default: return "Unknown error";
case XML_SUCCESS: return "Success";
case XML_NO_ATTRIBUTE: return "No attribute";
case XML_WRONG_ATTRIBUTE_TYPE: return "Wrong attribute type";
case XML_ERROR_FILE_NOT_FOUND: return "File not found";
case XML_ERROR_FILE_COULD_NOT_BE_OPENED: return "File could not be opened";
case XML_ERROR_FILE_READ_ERROR: return "File read error";
case XML_ERROR_ELEMENT_MISMATCH: return "Element mismatch";
case XML_ERROR_PARSING_ELEMENT: return "Parsing element";
case XML_ERROR_PARSING_ATTRIBUTE: return "Parsing attribute";
case XML_ERROR_IDENTIFYING_TAG: return "Identifying tag";
case XML_ERROR_PARSING_TEXT: return "Parsing text";
case XML_ERROR_PARSING_CDATA: return "Parsing CData";
case XML_ERROR_PARSING_COMMENT: return "Parsing comment";
case XML_ERROR_PARSING_DECLARATION: return "Parsing declaration";
case XML_ERROR_PARSING_UNKNOWN: return "Parsing unknown";
case XML_ERROR_EMPTY_DOCUMENT: return "Empty document";
case XML_ERROR_MISMATCHED_ELEMENT: return "Mismatched element";
case XML_ERROR_PARSING: return "Parsing";
case XML_CAN_NOT_CONVERT_TEXT: return "Cannot convert text";
case XML_NO_TEXT_NODE: return "No text node";
default: return "Unknown error";
}
}
@ -861,7 +885,7 @@ void CTemplateLoader::LoadGameTemplates(EGame Game)
{
CMasterTemplate *pMaster = *it;
if (pMaster->GetGame() == Game)
if (pMaster->GetGame() == Game && !pMaster->IsLoadedSuccessfully())
{
XMLDocument MasterXML;
OpenXML(mskTemplatesDir + pMaster->mSourceFile, MasterXML);
@ -878,12 +902,35 @@ void CTemplateLoader::LoadGameTemplates(EGame Game)
}
}
void CTemplateLoader::LoadAllGames()
{
std::list<CMasterTemplate*> MasterList = CMasterTemplate::GetMasterList();
for (auto it = MasterList.begin(); it != MasterList.end(); it++)
{
CMasterTemplate *pMaster = *it;
if (!pMaster->IsLoadedSuccessfully())
{
XMLDocument MasterXML;
OpenXML(mskTemplatesDir + pMaster->mSourceFile, MasterXML);
if (!MasterXML.Error())
{
CTemplateLoader Loader(mskTemplatesDir);
Loader.mGame = pMaster->GetGame();
Loader.LoadMasterTemplate(&MasterXML, pMaster);
}
}
}
}
void CTemplateLoader::LoadPropertyList(XMLDocument *pDoc, const TString& ListName)
{
XMLElement *pRootElem = pDoc->FirstChildElement("Properties");
if (!pRootElem)
Log::Error("Error reading property list at " + ListName + "; there is no root \"Properties\" block element");
Log::Error(ListName + ": There is no root \"Properties\" block element");
else
{

View File

@ -45,6 +45,7 @@ class CTemplateLoader
public:
static void LoadGameList();
static void LoadGameTemplates(EGame Game);
static void LoadAllGames();
static void LoadPropertyList(tinyxml2::XMLDocument *pDoc, const TString& rkListName);
};

View File

@ -99,6 +99,11 @@ TString CMasterTemplate::MessageByIndex(u32 Index)
return (std::next(it, Index))->second;
}
TString CMasterTemplate::GetDirectory() const
{
return mSourceFile.GetFileDirectory();
}
bool CMasterTemplate::IsLoadedSuccessfully()
{
return mFullyLoaded;
@ -135,6 +140,79 @@ TString CMasterTemplate::GetPropertyName(u32 PropertyID)
return "Unknown";
}
void CMasterTemplate::AddProperty(IPropertyTemplate *pTemp, const TString& rkTemplateName)
{
auto it = smIDMap.find(pTemp->PropertyID());
// Add this property/template to existing ID info
if (it != smIDMap.end())
{
SPropIDInfo& rInfo = it->second;
bool NewTemplate = true;
for (u32 iTemp = 0; iTemp < rInfo.XMLList.size(); iTemp++)
{
if (rInfo.XMLList[iTemp] == rkTemplateName)
{
NewTemplate = false;
break;
}
}
if (NewTemplate)
rInfo.XMLList.push_back(rkTemplateName);
it->second.PropertyList.push_back(pTemp);
}
// Create new ID info
else
{
SPropIDInfo Info;
Info.XMLList.push_back(rkTemplateName);
Info.PropertyList.push_back(pTemp);
smIDMap[pTemp->PropertyID()] = Info;
}
}
void CMasterTemplate::RenameProperty(u32 ID, const TString& rkNewName)
{
auto NameIt = smPropertyNames.find(ID);
TString CurName = (NameIt == smPropertyNames.end() ? "" : NameIt->second);
auto InfoIt = smIDMap.find(ID);
if (InfoIt != smIDMap.end())
{
const SPropIDInfo& rkInfo = InfoIt->second;
for (u32 iTemp = 0; iTemp < rkInfo.PropertyList.size(); iTemp++)
{
IPropertyTemplate *pTemp = rkInfo.PropertyList[iTemp];
if (pTemp->Name() == CurName)
pTemp->SetName(rkNewName);
}
}
if (NameIt != smPropertyNames.end())
smPropertyNames[ID] = rkNewName;
}
std::vector<TString> CMasterTemplate::GetTemplatesUsingID(u32 ID)
{
auto InfoIt = smIDMap.find(ID);
if (InfoIt != smIDMap.end())
{
const SPropIDInfo& rkInfo = InfoIt->second;
return rkInfo.XMLList;
}
else
return std::vector<TString>();
}
std::map<u32, CMasterTemplate::SPropIDInfo> CMasterTemplate::smIDMap;
std::map<EGame, CMasterTemplate*> CMasterTemplate::smMasterMap;
std::map<u32, TString> CMasterTemplate::smPropertyNames;
u32 CMasterTemplate::smGameListVersion;

View File

@ -18,11 +18,18 @@ class CMasterTemplate
bool mFullyLoaded;
std::vector<TString> mGameVersions;
std::map<TString, CStructTemplate*> mStructTemplates;
std::map<u32, CScriptTemplate*> mTemplates;
std::map<u32, TString> mStates;
std::map<u32, TString> mMessages;
struct SPropIDInfo
{
std::vector<TString> XMLList; // List of script/struct templates that use this ID
std::vector<IPropertyTemplate*> PropertyList; // List of all properties that use this ID
};
static std::map<u32, SPropIDInfo> smIDMap;
static std::map<EGame, CMasterTemplate*> smMasterMap;
static std::map<u32, TString> smPropertyNames;
static u32 smGameListVersion;
@ -45,11 +52,15 @@ public:
TString MessageByID(u32 MessageID);
TString MessageByID(const CFourCC& MessageID);
TString MessageByIndex(u32 Index);
TString GetDirectory() const;
bool IsLoadedSuccessfully();
static CMasterTemplate* GetMasterForGame(EGame Game);
static std::list<CMasterTemplate*> GetMasterList();
static TString GetPropertyName(u32 PropertyID);
static void AddProperty(IPropertyTemplate *pTemp, const TString& rkTemplateName);
static void RenameProperty(u32 ID, const TString& rkNewName);
static std::vector<TString> GetTemplatesUsingID(u32 ID);
};
// ************ INLINE ************

View File

@ -41,7 +41,7 @@ public:
IPropertyTemplate(u32 ID, CStructTemplate *pParent = 0)
: mID(ID)
, mpParent(pParent)
, mName("Unknown")
, mName("UNSET PROPERTY NAME")
, mCookPreference(eNoCookPreference)
{
}
@ -130,7 +130,7 @@ public:
// TTypedPropertyTemplate - Template property class that allows for tracking
// a default value. Typedefs are set up for a bunch of property types.
template<typename PropType, EPropertyType PropTypeEnum, class ValueClass>
template<typename PropType, EPropertyType PropTypeEnum, class ValueClass, bool CanHaveDefaultValue>
class TTypedPropertyTemplate : public IPropertyTemplate
{
friend class CTemplateLoader;
@ -146,9 +146,9 @@ public:
TTypedPropertyTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CStructTemplate *pParent = 0)
: IPropertyTemplate(ID, rkName, CookPreference, pParent) {}
virtual EPropertyType Type() const { return PropTypeEnum; }
virtual bool CanHaveDefault() const { return true; }
virtual bool IsNumerical() const { return false; }
virtual EPropertyType Type() const { return PropTypeEnum; }
virtual bool CanHaveDefault() const { return CanHaveDefaultValue; }
virtual bool IsNumerical() const { return false; }
virtual IProperty* InstantiateProperty(CPropertyStruct *pParent)
{
@ -200,7 +200,7 @@ public:
// TNumericalPropertyTemplate - Subclass of TTypedPropertyTemplate for numerical
// property types, and allows a min/max value and a suffix to be tracked.
template<typename PropType, EPropertyType PropTypeEnum, class ValueClass>
class TNumericalPropertyTemplate : public TTypedPropertyTemplate<PropType,PropTypeEnum,ValueClass>
class TNumericalPropertyTemplate : public TTypedPropertyTemplate<PropType,PropTypeEnum,ValueClass,true>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
@ -252,7 +252,7 @@ public:
virtual void SetParam(const TString& rkParamName, const TString& rkValue)
{
TTypedPropertyTemplate<PropType,PropTypeEnum,ValueClass>::SetParam(rkParamName, rkValue);
TTypedPropertyTemplate::SetParam(rkParamName, rkValue);
if (rkParamName == "range")
{
@ -288,14 +288,15 @@ public:
};
// Typedefs for all property types that don't need further functionality.
typedef TTypedPropertyTemplate<bool, eBoolProperty, CBoolValue> TBoolTemplate;
typedef TNumericalPropertyTemplate<s8, eByteProperty, CByteValue> TByteTemplate;
typedef TNumericalPropertyTemplate<s16, eShortProperty, CShortValue> TShortTemplate;
typedef TNumericalPropertyTemplate<s32, eLongProperty, CLongValue> TLongTemplate;
typedef TNumericalPropertyTemplate<float, eFloatProperty, CFloatValue> TFloatTemplate;
typedef TTypedPropertyTemplate<TString, eStringProperty, CStringValue> TStringTemplate;
typedef TTypedPropertyTemplate<CVector3f, eVector3Property, CVector3Value> TVector3Template;
typedef TTypedPropertyTemplate<CColor, eColorProperty, CColorValue> TColorTemplate;
typedef TTypedPropertyTemplate<bool, eBoolProperty, CBoolValue, true> TBoolTemplate;
typedef TNumericalPropertyTemplate<s8, eByteProperty, CByteValue> TByteTemplate;
typedef TNumericalPropertyTemplate<s16, eShortProperty, CShortValue> TShortTemplate;
typedef TNumericalPropertyTemplate<s32, eLongProperty, CLongValue> TLongTemplate;
typedef TNumericalPropertyTemplate<float, eFloatProperty, CFloatValue> TFloatTemplate;
typedef TTypedPropertyTemplate<TString, eStringProperty, CStringValue, false> TStringTemplate;
typedef TTypedPropertyTemplate<CVector3f, eVector3Property, CVector3Value, true> TVector3Template;
typedef TTypedPropertyTemplate<CColor, eColorProperty, CColorValue, true> TColorTemplate;
typedef TTypedPropertyTemplate<CAnimationParameters, eCharacterProperty, CCharacterValue, false> TCharacterTemplate;
// CFileTemplate - Property template for files. Tracks a list of file types that
// the property is allowed to accept.
@ -348,36 +349,8 @@ public:
const TStringList& Extensions() const { return mAcceptedExtensions; }
};
// CCharacterTemplate - Typed property that doesn't allow default values.
class CCharacterTemplate : public TTypedPropertyTemplate<CAnimationParameters,
eCharacterProperty,
CCharacterValue>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
public:
CCharacterTemplate(u32 ID, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, pParent) { }
CCharacterTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CStructTemplate *pParent = 0)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pParent) { }
virtual bool CanHaveDefault() const
{
return false;
}
IProperty* InstantiateProperty(CPropertyStruct *pParent)
{
return new TCharacterProperty(this, pParent);
}
DEFINE_TEMPLATE_CLONE(CCharacterTemplate)
};
// CEnumTemplate - Property template for enums. Tracks a list of possible values (enumerators).
class CEnumTemplate : public TLongTemplate
class CEnumTemplate : public TTypedPropertyTemplate<s32, eEnumProperty, CHexLongValue, true>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
@ -400,12 +373,12 @@ class CEnumTemplate : public TLongTemplate
public:
CEnumTemplate(u32 ID, CStructTemplate *pParent = 0)
: TLongTemplate(ID, pParent)
: TTypedPropertyTemplate(ID, pParent)
{
}
CEnumTemplate(u32 ID, const TString& rkName, ECookPreference CookPreference, CStructTemplate *pParent = 0)
: TLongTemplate(ID, rkName, CookPreference, pParent)
: TTypedPropertyTemplate(ID, rkName, CookPreference, pParent)
{
}
@ -424,7 +397,7 @@ public:
virtual void Copy(const IPropertyTemplate *pkTemp)
{
TLongTemplate::Copy(pkTemp);
TTypedPropertyTemplate::Copy(pkTemp);
const CEnumTemplate *pkEnum = static_cast<const CEnumTemplate*>(pkTemp);
mEnumerators = pkEnum->mEnumerators;
@ -435,7 +408,7 @@ public:
{
const CEnumTemplate *pkEnum = static_cast<const CEnumTemplate*>(pkTemp);
return ( (TLongTemplate::Matches(pkTemp)) &&
return ( (TTypedPropertyTemplate::Matches(pkTemp)) &&
(mEnumerators == pkEnum->mEnumerators) &&
(mSourceFile == pkEnum->mSourceFile) );
}
@ -474,7 +447,7 @@ public:
// CBitfieldTemplate - Property template for bitfields, which can have multiple
// distinct boolean parameters packed into one property.
class CBitfieldTemplate : public TTypedPropertyTemplate<u32, eBitfieldProperty, CHexLongValue>
class CBitfieldTemplate : public TTypedPropertyTemplate<u32, eBitfieldProperty, CHexLongValue, true>
{
friend class CTemplateLoader;
friend class CTemplateWriter;
@ -594,6 +567,11 @@ public:
IPropertyTemplate::Copy(pkTemp);
const CStructTemplate *pkStruct = static_cast<const CStructTemplate*>(pkTemp);
CopyStructData(pkStruct);
}
void CopyStructData(const CStructTemplate *pkStruct)
{
mVersionPropertyCounts = pkStruct->mVersionPropertyCounts;
mIsSingleProperty = pkStruct->mIsSingleProperty;
mSourceFile = pkStruct->mSourceFile;
@ -611,7 +589,17 @@ public:
if ( (IPropertyTemplate::Matches(pkTemp)) &&
(mVersionPropertyCounts == pkStruct->mVersionPropertyCounts) &&
(mIsSingleProperty == pkStruct->mIsSingleProperty) &&
(mSourceFile == pkStruct->mSourceFile) &&
(mSourceFile == pkStruct->mSourceFile) )
{
return StructDataMatches(pkStruct);
}
return false;
}
bool StructDataMatches(const CStructTemplate *pkStruct) const
{
if ( (mIsSingleProperty == pkStruct->mIsSingleProperty) &&
(mSubProperties.size() == pkStruct->mSubProperties.size()) )
{
for (u32 iSub = 0; iSub < mSubProperties.size(); iSub++)
@ -673,6 +661,8 @@ public:
virtual void Copy(const IPropertyTemplate *pkTemp)
{
IPropertyTemplate::Copy(pkTemp);
CStructTemplate::Copy(pkTemp);
mElementName = static_cast<const CArrayTemplate*>(pkTemp)->mElementName;
}

View File

@ -168,7 +168,7 @@ public:
TString ToString() const
{
return TString::HexString(mValue, true, true, 8);
return TString::HexString(mValue, true, true, mValue > 0xFF ? 8 : 2);
}
void FromString(const TString& rkString)

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<GameList version="4">
<properties>Properties.xml</properties>
<properties>Properties.xml</properties>
<game>
<name>Metroid Prime</name>
<mrea>0x0F</mrea>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<Properties version="4">
<property ID="0x0001F679" name="Unknown"/>
<property ID="0x000E4BAE" name="Sky Temple Key 5"/>
@ -4333,7 +4333,7 @@
<property ID="0x60FE934E" name="Unknown"/>
<property ID="0x610B8FB8" name="Unknown"/>
<property ID="0x610C0165" name="Unknown"/>
<property ID="0x610EEC90" name="This room's #"/>
<property ID="0x610EEC90" name="This room&apos;s #"/>
<property ID="0x6117E78F" name="Unknown"/>
<property ID="0x611905F1" name="Unknown"/>
<property ID="0x6119D07F" name="Unknown"/>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="AnimEnum">
<enumerators>
<enumerator ID="0x8B3D86DC" name="Unknown 1"/>
<enumerator ID="0xF095D135" name="Unknown 2"/>
<enumerator ID="0xEF006D07" name="Unknown 3"/>
</enumerators>
<enumerators>
<enumerator ID="0x8B3D86DC" name="Unknown 1"/>
<enumerator ID="0xF095D135" name="Unknown 2"/>
<enumerator ID="0xEF006D07" name="Unknown 3"/>
</enumerators>
</enum>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="BarrelCannonEnum">
<enumerators>
<enumerator ID="0x1923DFB0" name="Unknown 1"/>
<enumerator ID="0xA61445EB" name="Unknown 2"/>
<enumerator ID="0x1CD43817" name="Unknown 3"/>
<enumerator ID="0x0009FA85" name="Unknown 4"/>
</enumerators>
<enumerators>
<enumerator ID="0x1923DFB0" name="Unknown 1"/>
<enumerator ID="0xA61445EB" name="Unknown 2"/>
<enumerator ID="0x1CD43817" name="Unknown 3"/>
<enumerator ID="0x0009FA85" name="Unknown 4"/>
</enumerators>
</enum>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="CableEnum">
<enumerators>
<enumerator ID="0x80DD21B4" name="Unknown 1"/>
<enumerator ID="0x24CF38F1" name="Unknown 2"/>
<enumerator ID="0x23363FD3" name="Unknown 3"/>
</enumerators>
<enumerators>
<enumerator ID="0x80DD21B4" name="Unknown 1"/>
<enumerator ID="0x24CF38F1" name="Unknown 2"/>
<enumerator ID="0x23363FD3" name="Unknown 3"/>
</enumerators>
</enum>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="DamageableTriggerEnum">
<enumerators>
<enumerator ID="0x1DB35D5F" name="Unknown 1"/>
<enumerator ID="0x61939D58" name="Unknown 2"/>
<enumerator ID="0x385E6442" name="Unknown 3"/>
<enumerator ID="0x0C91B7E6" name="Unknown 4"/>
</enumerators>
<enumerators>
<enumerator ID="0x1DB35D5F" name="Unknown 1"/>
<enumerator ID="0x61939D58" name="Unknown 2"/>
<enumerator ID="0x385E6442" name="Unknown 3"/>
<enumerator ID="0x0C91B7E6" name="Unknown 4"/>
</enumerators>
</enum>

View File

@ -1,50 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="InventorySlot">
<enumerators>
<enumerator ID="0xB22FD89B" name="Unknown 1"/>
<enumerator ID="0x0AB70F9F" name="Unknown 2"/>
<enumerator ID="0x7EC6E111" name="Unknown 3"/>
<enumerator ID="0x556483BA" name="Unknown 4"/>
<enumerator ID="0x28B8C79F" name="Unknown 5"/>
<enumerator ID="0x288E1995" name="Unknown 6"/>
<enumerator ID="0x20452B38" name="Unknown 7"/>
<enumerator ID="0xA08E45BD" name="Unknown 8"/>
<enumerator ID="0x9302608B" name="Unknown 9"/>
<enumerator ID="0x6242D55B" name="Unknown 10"/>
<enumerator ID="0x652F1142" name="Unknown 11"/>
<enumerator ID="0x122821D4" name="Unknown 12"/>
<enumerator ID="0x6BF49970" name="Unknown 13"/>
<enumerator ID="0x67AD9570" name="Unknown 14"/>
<enumerator ID="0xAF376DBC" name="Unknown 15"/>
<enumerator ID="0xC2614252" name="Unknown 16"/>
<enumerator ID="0xE6880EBF" name="Unknown 17"/>
<enumerator ID="0x4CE83DAB" name="Unknown 18"/>
<enumerator ID="0x3132788C" name="Unknown 19"/>
<enumerator ID="0x13F9BA3C" name="Unknown 20"/>
<enumerator ID="0x0B678DCF" name="Unknown 21"/>
<enumerator ID="0x926EDC75" name="Unknown 22"/>
<enumerator ID="0xE569ECE3" name="Unknown 23"/>
<enumerator ID="0x7B0D7940" name="Unknown 24"/>
<enumerator ID="0x0C0A49D6" name="Unknown 25"/>
<enumerator ID="0x9503186C" name="Unknown 26"/>
<enumerator ID="0xE20428FA" name="Unknown 27"/>
<enumerator ID="0x72BB356B" name="Unknown 28"/>
<enumerator ID="0x58839E3B" name="Unknown 29"/>
<enumerator ID="0xC18ACF81" name="Unknown 30"/>
<enumerator ID="0xB68DFF17" name="Unknown 31"/>
<enumerator ID="0x5D1C98AE" name="Unknown 32"/>
<enumerator ID="0xC415C914" name="Unknown 33"/>
<enumerator ID="0xB312F982" name="Unknown 34"/>
<enumerator ID="0x2D766C21" name="Unknown 35"/>
<enumerator ID="0x5A715CB7" name="Unknown 36"/>
<enumerator ID="0xC3780D0D" name="Unknown 37"/>
<enumerator ID="0xB47F3D9B" name="Unknown 38"/>
<enumerator ID="0x24C0200A" name="Unknown 39"/>
<enumerator ID="0xF1925BC3" name="Unknown 40"/>
<enumerator ID="0xB82D38C0" name="Unknown 41"/>
<enumerator ID="0x00F1201C" name="Unknown 42"/>
<enumerator ID="0xE3006233" name="Unknown 43"/>
<enumerator ID="0xBCF65B69" name="Unknown 44"/>
<enumerator ID="0x7F7E9C47" name="Unknown 45"/>
</enumerators>
<enumerators>
<enumerator ID="0xB22FD89B" name="Unknown 1"/>
<enumerator ID="0x0AB70F9F" name="Unknown 2"/>
<enumerator ID="0x7EC6E111" name="Unknown 3"/>
<enumerator ID="0x556483BA" name="Unknown 4"/>
<enumerator ID="0x28B8C79F" name="Unknown 5"/>
<enumerator ID="0x288E1995" name="Unknown 6"/>
<enumerator ID="0x20452B38" name="Unknown 7"/>
<enumerator ID="0xA08E45BD" name="Unknown 8"/>
<enumerator ID="0x9302608B" name="Unknown 9"/>
<enumerator ID="0x6242D55B" name="Unknown 10"/>
<enumerator ID="0x652F1142" name="Unknown 11"/>
<enumerator ID="0x122821D4" name="Unknown 12"/>
<enumerator ID="0x6BF49970" name="Unknown 13"/>
<enumerator ID="0x67AD9570" name="Unknown 14"/>
<enumerator ID="0xAF376DBC" name="Unknown 15"/>
<enumerator ID="0xC2614252" name="Unknown 16"/>
<enumerator ID="0xE6880EBF" name="Unknown 17"/>
<enumerator ID="0x4CE83DAB" name="Unknown 18"/>
<enumerator ID="0x3132788C" name="Unknown 19"/>
<enumerator ID="0x13F9BA3C" name="Unknown 20"/>
<enumerator ID="0x0B678DCF" name="Unknown 21"/>
<enumerator ID="0x926EDC75" name="Unknown 22"/>
<enumerator ID="0xE569ECE3" name="Unknown 23"/>
<enumerator ID="0x7B0D7940" name="Unknown 24"/>
<enumerator ID="0x0C0A49D6" name="Unknown 25"/>
<enumerator ID="0x9503186C" name="Unknown 26"/>
<enumerator ID="0xE20428FA" name="Unknown 27"/>
<enumerator ID="0x72BB356B" name="Unknown 28"/>
<enumerator ID="0x58839E3B" name="Unknown 29"/>
<enumerator ID="0xC18ACF81" name="Unknown 30"/>
<enumerator ID="0xB68DFF17" name="Unknown 31"/>
<enumerator ID="0x5D1C98AE" name="Unknown 32"/>
<enumerator ID="0xC415C914" name="Unknown 33"/>
<enumerator ID="0xB312F982" name="Unknown 34"/>
<enumerator ID="0x2D766C21" name="Unknown 35"/>
<enumerator ID="0x5A715CB7" name="Unknown 36"/>
<enumerator ID="0xC3780D0D" name="Unknown 37"/>
<enumerator ID="0xB47F3D9B" name="Unknown 38"/>
<enumerator ID="0x24C0200A" name="Unknown 39"/>
<enumerator ID="0xF1925BC3" name="Unknown 40"/>
<enumerator ID="0xB82D38C0" name="Unknown 41"/>
<enumerator ID="0x00F1201C" name="Unknown 42"/>
<enumerator ID="0xE3006233" name="Unknown 43"/>
<enumerator ID="0xBCF65B69" name="Unknown 44"/>
<enumerator ID="0x7F7E9C47" name="Unknown 45"/>
</enumerators>
</enum>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="MusicEnumA">
<enumerators>
<enumerator ID="0x9EFE0717" name="Unknown 1"/>
<enumerator ID="0x28D5A7D7" name="Unknown 2"/>
<enumerator ID="0xD6A26606" name="Unknown 3"/>
</enumerators>
<enumerators>
<enumerator ID="0x9EFE0717" name="Unknown 1"/>
<enumerator ID="0x28D5A7D7" name="Unknown 2"/>
<enumerator ID="0xD6A26606" name="Unknown 3"/>
</enumerators>
</enum>

View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="MusicEnumB">
<enumerators>
<enumerator ID="0xCBF698CA" name="Unknown 1"/>
<enumerator ID="0xBCF1A85C" name="Unknown 2"/>
<enumerator ID="0x25F8F9E6" name="Unknown 3"/>
<enumerator ID="0x52FFC970" name="Unknown 4"/>
<enumerator ID="0xCC9B5CD3" name="Unknown 5"/>
<enumerator ID="0xBB9C6C45" name="Unknown 6"/>
<enumerator ID="0x22953DFF" name="Unknown 7"/>
<enumerator ID="0x55920D69" name="Unknown 8"/>
<enumerator ID="0xC52D10F8" name="Unknown 9"/>
<enumerator ID="0xB22A206E" name="Unknown 10"/>
</enumerators>
<enumerators>
<enumerator ID="0xCBF698CA" name="Unknown 1"/>
<enumerator ID="0xBCF1A85C" name="Unknown 2"/>
<enumerator ID="0x25F8F9E6" name="Unknown 3"/>
<enumerator ID="0x52FFC970" name="Unknown 4"/>
<enumerator ID="0xCC9B5CD3" name="Unknown 5"/>
<enumerator ID="0xBB9C6C45" name="Unknown 6"/>
<enumerator ID="0x22953DFF" name="Unknown 7"/>
<enumerator ID="0x55920D69" name="Unknown 8"/>
<enumerator ID="0xC52D10F8" name="Unknown 9"/>
<enumerator ID="0xB22A206E" name="Unknown 10"/>
</enumerators>
</enum>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="RobotChickenEnum">
<enumerators>
<enumerator ID="0x8C665F9A" name="Unknown 1"/>
<enumerator ID="0x5E7931A4" name="Unknown 2"/>
</enumerators>
<enumerators>
<enumerator ID="0x8C665F9A" name="Unknown 1"/>
<enumerator ID="0x5E7931A4" name="Unknown 2"/>
</enumerators>
</enum>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="Shape">
<enumerators>
<enumerator ID="0x482B22F1" name="Box"/>
<enumerator ID="0x779DB545" name="Box"/>
<enumerator ID="0x8392F5E4" name="Ellipsoid"/>
<enumerator ID="0x39ED7B8E" name="Cylinder"/>
</enumerators>
<enumerators>
<enumerator ID="0x482B22F1" name="Box"/>
<enumerator ID="0x779DB545" name="Box"/>
<enumerator ID="0x8392F5E4" name="Ellipsoid"/>
<enumerator ID="0x39ED7B8E" name="Cylinder"/>
</enumerators>
</enum>

View File

@ -1,58 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="UnknownEnum1">
<enumerators>
<enumerator ID="0xD086634A" name="Unknown 1"/>
<enumerator ID="0x9EFEC452" name="Unknown 2"/>
<enumerator ID="0x7A08E735" name="Unknown 3"/>
<enumerator ID="0x50C802D9" name="Unknown 4"/>
<enumerator ID="0xF0F41378" name="Unknown 5"/>
<enumerator ID="0x85CC49A7" name="Unknown 6"/>
<enumerator ID="0xF3FA81F9" name="Unknown 7"/>
<enumerator ID="0x12D7814B" name="Unknown 8"/>
<enumerator ID="0x3ED0780A" name="Unknown 9"/>
<enumerator ID="0xD30DC76F" name="Unknown 10"/>
<enumerator ID="0xAF419B49" name="Unknown 11"/>
<enumerator ID="0xA3CA9851" name="Unknown 12"/>
<enumerator ID="0x841A1F8E" name="Unknown 13"/>
<enumerator ID="0xDE847FAF" name="Unknown 14"/>
<enumerator ID="0xA1933C0A" name="Unknown 15"/>
<enumerator ID="0x2B471C09" name="Unknown 16"/>
<enumerator ID="0xB24E4DB3" name="Unknown 17"/>
<enumerator ID="0xABEC556C" name="Unknown 18"/>
<enumerator ID="0x8B3230C7" name="Unknown 19"/>
<enumerator ID="0xAED13BCA" name="Unknown 20"/>
<enumerator ID="0x3EEF8753" name="Unknown 21"/>
<enumerator ID="0xB3FB5FA4" name="Unknown 22"/>
<enumerator ID="0xC547BF6B" name="Unknown 23"/>
<enumerator ID="0x11F351AB" name="Unknown 24"/>
<enumerator ID="0x3498471C" name="Unknown 25"/>
<enumerator ID="0xC466996F" name="Unknown 26"/>
<enumerator ID="0xFA2C9120" name="Unknown 27"/>
<enumerator ID="0x5178A767" name="Unknown 28"/>
<enumerator ID="0x0709C8FC" name="Unknown 29"/>
<enumerator ID="0x21695AC9" name="Unknown 30"/>
<enumerator ID="0xC25A07B4" name="Unknown 31"/>
<enumerator ID="0x84ED6FA3" name="Unknown 32"/>
<enumerator ID="0x0D7E08B3" name="Unknown 33"/>
<enumerator ID="0x88667A15" name="Unknown 34"/>
<enumerator ID="0x0E2A6D5C" name="Unknown 35"/>
<enumerator ID="0xB480D1C5" name="Unknown 36"/>
<enumerator ID="0x57B38CB8" name="Unknown 37"/>
<enumerator ID="0xD22CE16B" name="Unknown 38"/>
<enumerator ID="0x045DAD13" name="Unknown 39"/>
<enumerator ID="0x6CB4849F" name="Unknown 40"/>
<enumerator ID="0x0A30916F" name="Unknown 41"/>
<enumerator ID="0x006A8C25" name="Unknown 42"/>
<enumerator ID="0x2FE99ACD" name="Unknown 43"/>
<enumerator ID="0xCCDAC7B0" name="Unknown 44"/>
<enumerator ID="0xDFA559AB" name="Unknown 45"/>
<enumerator ID="0x0A1D4C6A" name="Unknown 46"/>
<enumerator ID="0x11FA9AD3" name="Unknown 47"/>
<enumerator ID="0x7527D2CA" name="Unknown 48"/>
<enumerator ID="0x3CCFABB4" name="Unknown 49"/>
<enumerator ID="0x892ADAE9" name="Unknown 50"/>
<enumerator ID="0x6A198794" name="Unknown 51"/>
<enumerator ID="0xA0B21A0E" name="Unknown 52"/>
<enumerator ID="0x36B86BFB" name="Unknown 53"/>
</enumerators>
<enumerators>
<enumerator ID="0xD086634A" name="Unknown 1"/>
<enumerator ID="0x9EFEC452" name="Unknown 2"/>
<enumerator ID="0x7A08E735" name="Unknown 3"/>
<enumerator ID="0x50C802D9" name="Unknown 4"/>
<enumerator ID="0xF0F41378" name="Unknown 5"/>
<enumerator ID="0x85CC49A7" name="Unknown 6"/>
<enumerator ID="0xF3FA81F9" name="Unknown 7"/>
<enumerator ID="0x12D7814B" name="Unknown 8"/>
<enumerator ID="0x3ED0780A" name="Unknown 9"/>
<enumerator ID="0xD30DC76F" name="Unknown 10"/>
<enumerator ID="0xAF419B49" name="Unknown 11"/>
<enumerator ID="0xA3CA9851" name="Unknown 12"/>
<enumerator ID="0x841A1F8E" name="Unknown 13"/>
<enumerator ID="0xDE847FAF" name="Unknown 14"/>
<enumerator ID="0xA1933C0A" name="Unknown 15"/>
<enumerator ID="0x2B471C09" name="Unknown 16"/>
<enumerator ID="0xB24E4DB3" name="Unknown 17"/>
<enumerator ID="0xABEC556C" name="Unknown 18"/>
<enumerator ID="0x8B3230C7" name="Unknown 19"/>
<enumerator ID="0xAED13BCA" name="Unknown 20"/>
<enumerator ID="0x3EEF8753" name="Unknown 21"/>
<enumerator ID="0xB3FB5FA4" name="Unknown 22"/>
<enumerator ID="0xC547BF6B" name="Unknown 23"/>
<enumerator ID="0x11F351AB" name="Unknown 24"/>
<enumerator ID="0x3498471C" name="Unknown 25"/>
<enumerator ID="0xC466996F" name="Unknown 26"/>
<enumerator ID="0xFA2C9120" name="Unknown 27"/>
<enumerator ID="0x5178A767" name="Unknown 28"/>
<enumerator ID="0x0709C8FC" name="Unknown 29"/>
<enumerator ID="0x21695AC9" name="Unknown 30"/>
<enumerator ID="0xC25A07B4" name="Unknown 31"/>
<enumerator ID="0x84ED6FA3" name="Unknown 32"/>
<enumerator ID="0x0D7E08B3" name="Unknown 33"/>
<enumerator ID="0x88667A15" name="Unknown 34"/>
<enumerator ID="0x0E2A6D5C" name="Unknown 35"/>
<enumerator ID="0xB480D1C5" name="Unknown 36"/>
<enumerator ID="0x57B38CB8" name="Unknown 37"/>
<enumerator ID="0xD22CE16B" name="Unknown 38"/>
<enumerator ID="0x045DAD13" name="Unknown 39"/>
<enumerator ID="0x6CB4849F" name="Unknown 40"/>
<enumerator ID="0x0A30916F" name="Unknown 41"/>
<enumerator ID="0x006A8C25" name="Unknown 42"/>
<enumerator ID="0x2FE99ACD" name="Unknown 43"/>
<enumerator ID="0xCCDAC7B0" name="Unknown 44"/>
<enumerator ID="0xDFA559AB" name="Unknown 45"/>
<enumerator ID="0x0A1D4C6A" name="Unknown 46"/>
<enumerator ID="0x11FA9AD3" name="Unknown 47"/>
<enumerator ID="0x7527D2CA" name="Unknown 48"/>
<enumerator ID="0x3CCFABB4" name="Unknown 49"/>
<enumerator ID="0x892ADAE9" name="Unknown 50"/>
<enumerator ID="0x6A198794" name="Unknown 51"/>
<enumerator ID="0xA0B21A0E" name="Unknown 52"/>
<enumerator ID="0x36B86BFB" name="Unknown 53"/>
</enumerators>
</enum>

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="UnknownEnum2">
<enumerators>
<enumerator ID="0xF7A83E59" name="Unknown 1"/>
<enumerator ID="0x0291D74B" name="Unknown 2"/>
<enumerator ID="0x3BB45C07" name="Unknown 3"/>
<enumerator ID="0x7EAFB026" name="Unknown 4"/>
<enumerator ID="0x69069679" name="Unknown 5"/>
<enumerator ID="0x1837C775" name="Unknown 6"/>
</enumerators>
<enumerators>
<enumerator ID="0xF7A83E59" name="Unknown 1"/>
<enumerator ID="0x0291D74B" name="Unknown 2"/>
<enumerator ID="0x3BB45C07" name="Unknown 3"/>
<enumerator ID="0x7EAFB026" name="Unknown 4"/>
<enumerator ID="0x69069679" name="Unknown 5"/>
<enumerator ID="0x1837C775" name="Unknown 6"/>
</enumerators>
</enum>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="UnknownEnum3">
<enumerators>
<enumerator ID="0x82B6A62A" name="Unknown 1"/>
<enumerator ID="0xCE9CA7B2" name="Unknown 2"/>
</enumerators>
<enumerators>
<enumerator ID="0x82B6A62A" name="Unknown 1"/>
<enumerator ID="0xCE9CA7B2" name="Unknown 2"/>
</enumerators>
</enum>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<enum name="UnknownEnum4">
<enumerators>
<enumerator ID="0x25234BDB" name="Unknown 1"/>
<enumerator ID="0xBC2A1A61" name="Unknown 2"/>
</enumerators>
<enumerators>
<enumerator ID="0x25234BDB" name="Unknown 1"/>
<enumerator ID="0xBC2A1A61" name="Unknown 2"/>
</enumerators>
</enum>

View File

@ -1,165 +1,165 @@
<?xml version="1.0" encoding="UTF-8"?>
<MasterTemplate version="4">
<objects>
<object ID="AAGM" template="Script/AnimGridModifier.xml"/>
<object ID="ACKF" template="Script/ActorKeyframe.xml"/>
<object ID="ACOU" template="Script/Acoustics.xml"/>
<object ID="ACTR" template="Script/Actor.xml"/>
<object ID="ADMG" template="Script/AreaDamage.xml"/>
<object ID="AIHT" template="Script/AIHint.xml"/>
<object ID="AIKF" template="Script/AIKeyframe.xml"/>
<object ID="AIWP" template="Script/AIWaypoint.xml"/>
<object ID="ACOU" template="Script/Acoustics.xml"/>
<object ID="ACTR" template="Script/Actor.xml"/>
<object ID="AAGM" template="Script/AnimGridModifier.xml"/>
<object ID="ACKF" template="Script/ActorKeyframe.xml"/>
<object ID="AMKF" template="Script/ActorMultiKeyframe.xml"/>
<object ID="ATRN" template="Script/ActorTransform.xml"/>
<object ID="REAA" template="Script/AreaAttributes.xml"/>
<object ID="ADMG" template="Script/AreaDamage.xml"/>
<object ID="AOCL" template="Script/AudioOccluder.xml"/>
<object ID="ARNO" template="Script/AreaNode.xml"/>
<object ID="ARPA" template="Script/AreaPath.xml"/>
<object ID="ASAS" template="Script/AssignedAudioStream.xml"/>
<object ID="AOCL" template="Script/AudioOccluder.xml"/>
<object ID="ATRN" template="Script/ActorTransform.xml"/>
<object ID="AVIS" template="Script/AVIS.xml"/>
<object ID="BABL" template="Script/BarrelBalloon.xml"/>
<object ID="BARL" template="Script/BarrelCannon.xml"/>
<object ID="BUHA" template="Script/BeatUpHandler.xml"/>
<object ID="BIRD" template="Script/BirdBoss.xml"/>
<object ID="BLME" template="Script/BloomEffect.xml"/>
<object ID="BLMV" template="Script/BloomVolume.xml"/>
<object ID="BLUR" template="Script/CameraBlurKeyframe.xml"/>
<object ID="BONU" template="Script/Bonus.xml"/>
<object ID="BTYR" template="Script/BouncyTire.xml"/>
<object ID="BUHA" template="Script/BeatUpHandler.xml"/>
<object ID="CABL" template="Script/Cable.xml"/>
<object ID="BLUR" template="Script/CameraBlurKeyframe.xml"/>
<object ID="FILT" template="Script/CameraFilterKeyframe.xml"/>
<object ID="CAMH" template="Script/CameraHint.xml"/>
<object ID="CMAN" template="Script/CameraManager.xml"/>
<object ID="CMOD" template="Script/CameraModifier.xml"/>
<object ID="CAMS" template="Script/CameraShaker.xml"/>
<object ID="CKPT" template="Script/Checkpoint.xml"/>
<object ID="CART" template="Script/MineCart.xml"/>
<object ID="CINE" template="Script/CinematicCamera.xml"/>
<object ID="CKPT" template="Script/Checkpoint.xml"/>
<object ID="CLPC" template="Script/ClingPathControl.xml"/>
<object ID="CLRM" template="Script/ColorModulate.xml"/>
<object ID="CRLY" template="Script/ConditionalRelay.xml"/>
<object ID="CMAN" template="Script/CameraManager.xml"/>
<object ID="CMGR" template="Script/PirateCrabManager.xml"/>
<object ID="CMOD" template="Script/CameraModifier.xml"/>
<object ID="CNTA" template="Script/ControllerAction.xml"/>
<object ID="CNTR" template="Script/Counter.xml"/>
<object ID="CRAB" template="Script/PirateCrab.xml"/>
<object ID="CRED" template="Script/Credits.xml"/>
<object ID="CRLY" template="Script/ConditionalRelay.xml"/>
<object ID="CSGO" template="Script/GameOver.xml"/>
<object ID="CSTI" template="Script/CSTI.xml"/>
<object ID="DMGA" template="Script/DamageArea.xml"/>
<object ID="DMGE" template="Script/DamageEffect.xml"/>
<object ID="DTRG" template="Script/DamageableTrigger.xml"/>
<object ID="DTRO" template="Script/DamageableTriggerOrientated.xml"/>
<object ID="DEBR" template="Script/Debris.xml"/>
<object ID="DOFT" template="Script/DepthOfFieldTuner.xml"/>
<object ID="DFOG" template="Script/DistanceFog.xml"/>
<object ID="DLHT" template="Script/DynamicLight.xml"/>
<object ID="DMGA" template="Script/DamageArea.xml"/>
<object ID="DMGE" template="Script/DamageEffect.xml"/>
<object ID="DOFT" template="Script/DepthOfFieldTuner.xml"/>
<object ID="DTRG" template="Script/DamageableTrigger.xml"/>
<object ID="DTRO" template="Script/DamageableTriggerOrientated.xml"/>
<object ID="EFCT" template="Script/Effect.xml"/>
<object ID="EOLD" template="Script/EOLDisplay.xml"/>
<object ID="FXDC" template="Script/EnvFxDensityController.xml"/>
<object ID="FSWC" template="Script/FactorySwitch.xml"/>
<object ID="FILT" template="Script/CameraFilterKeyframe.xml"/>
<object ID="FLPS" template="Script/FalsePerspective.xml"/>
<object ID="FOBS" template="Script/ForestBoss.xml"/>
<object ID="FOGO" template="Script/FogOverlay.xml"/>
<object ID="FOGV" template="Script/FogVolume.xml"/>
<object ID="FOBS" template="Script/ForestBoss.xml"/>
<object ID="GMGR" template="Script/GameManager.xml"/>
<object ID="CSGO" template="Script/GameOver.xml"/>
<object ID="GOBD" template="Script/GeneratedObjectDeleter.xml"/>
<object ID="GENR" template="Script/Generator.xml"/>
<object ID="GCTR" template="Script/GenericCreature.xml"/>
<object ID="FSWC" template="Script/FactorySwitch.xml"/>
<object ID="FXDC" template="Script/EnvFxDensityController.xml"/>
<object ID="GCGP" template="Script/GenericCreatureGroup.xml"/>
<object ID="GPDT" template="Script/GroundPoundDetector.xml"/>
<object ID="GUCH" template="Script/GuiCharacter.xml"/>
<object ID="GCTR" template="Script/GenericCreature.xml"/>
<object ID="GENR" template="Script/Generator.xml"/>
<object ID="GMGR" template="Script/GameManager.xml"/>
<object ID="GMNU" template="Script/GuiMenu.xml"/>
<object ID="GOBD" template="Script/GeneratedObjectDeleter.xml"/>
<object ID="GPDT" template="Script/GroundPoundDetector.xml"/>
<object ID="GPTR" template="Script/GPTR.xml"/>
<object ID="GSLD" template="Script/GuiSlider.xml"/>
<object ID="GUCH" template="Script/GuiCharacter.xml"/>
<object ID="GWIG" template="Script/GuiWidget.xml"/>
<object ID="HINT" template="Script/PlayerHint.xml"/>
<object ID="HUDD" template="Script/HUD.xml"/>
<object ID="HUDP" template="Script/HUDProxy.xml"/>
<object ID="IHUD" template="Script/IslandHUD.xml"/>
<object ID="ISAR" template="Script/IslandArea.xml"/>
<object ID="JB01" template="Script/JungleBoss1.xml"/>
<object ID="KONG" template="Script/Kong.xml"/>
<object ID="KNGP" template="Script/KongProxy.xml"/>
<object ID="LVLD" template="Script/LevelDarkener.xml"/>
<object ID="KONG" template="Script/Kong.xml"/>
<object ID="LODC" template="Script/LODController.xml"/>
<object ID="LVLD" template="Script/LevelDarkener.xml"/>
<object ID="LVOL" template="Script/LightVolume.xml"/>
<object ID="MNPL" template="Script/MotionPlatform.xml"/>
<object ID="MEAT" template="Script/MEAT.xml"/>
<object ID="MRLY" template="Script/MemoryRelay.xml"/>
<object ID="CART" template="Script/MineCart.xml"/>
<object ID="MOLC" template="Script/MoleCart.xml"/>
<object ID="MOLM" template="Script/MoleTrainManager.xml"/>
<object ID="MOLE" template="Script/Mole.xml"/>
<object ID="MMDL" template="Script/MultiModelActor.xml"/>
<object ID="MNPL" template="Script/MotionPlatform.xml"/>
<object ID="MOLC" template="Script/MoleCart.xml"/>
<object ID="MOLE" template="Script/Mole.xml"/>
<object ID="MOLM" template="Script/MoleTrainManager.xml"/>
<object ID="MOVI" template="Script/StreamedMovie.xml"/>
<object ID="MPSR" template="Script/MultiplayerSyncRelay.xml"/>
<object ID="MRLY" template="Script/MemoryRelay.xml"/>
<object ID="MUMA" template="Script/MusicMaster.xml"/>
<object ID="SAMD" template="Script/StreamedAudioModifier.xml"/>
<object ID="MUTR" template="Script/MusicTrack.xml"/>
<object ID="OBRG" template="Script/OceanBridge.xml"/>
<object ID="WAVE" template="Script/OceanWave.xml"/>
<object ID="OPAA" template="Script/OptionalAreaAsset.xml"/>
<object ID="PCTL" template="Script/PathControl.xml"/>
<object ID="PNUT" template="Script/Peanut.xml"/>
<object ID="PCKP" template="Script/Pickup.xml"/>
<object ID="PCHK" template="Script/PilotChicken.xml"/>
<object ID="CRAB" template="Script/PirateCrab.xml"/>
<object ID="CMGR" template="Script/PirateCrabManager.xml"/>
<object ID="PLAT" template="Script/Platform.xml"/>
<object ID="HINT" template="Script/PlayerHint.xml"/>
<object ID="PCKP" template="Script/Pickup.xml"/>
<object ID="PCTL" template="Script/PathControl.xml"/>
<object ID="PLAC" template="Script/PlayerActor.xml"/>
<object ID="PRSP" template="Script/PlayerRespawn.xml"/>
<object ID="PTOK" template="Script/PlayerToken.xml"/>
<object ID="PLAT" template="Script/Platform.xml"/>
<object ID="PNUT" template="Script/Peanut.xml"/>
<object ID="POIO" template="Script/PoiObject.xml"/>
<object ID="SPRL" template="Script/PositionRelay.xml"/>
<object ID="PRLA" template="Script/PickupRelay.xml"/>
<object ID="PROJ" template="Script/Projectile.xml"/>
<object ID="RADD" template="Script/RadialDamage.xml"/>
<object ID="RMBI" template="Script/Rambi.xml"/>
<object ID="PRSP" template="Script/PlayerRespawn.xml"/>
<object ID="PTOK" template="Script/PlayerToken.xml"/>
<object ID="RACR" template="Script/RambiCrate.xml"/>
<object ID="REAC" template="Script/ReactiveObject.xml"/>
<object ID="RSCL" template="Script/RSCL.xml"/>
<object ID="SRLY" template="Script/Relay.xml"/>
<object ID="RRLY" template="Script/RandomRelay.xml"/>
<object ID="RSBL" template="Script/RespawnBalloon.xml"/>
<object ID="RTNM" template="Script/Retronome.xml"/>
<object ID="RCTL" template="Script/ReviewControl.xml"/>
<object ID="RADD" template="Script/RadialDamage.xml"/>
<object ID="RBRL" template="Script/RocketBarrel.xml"/>
<object ID="RCHK" template="Script/RobotChicken.xml"/>
<object ID="RCKF" template="Script/RobotChickenFlyer.xml"/>
<object ID="RBRL" template="Script/RocketBarrel.xml"/>
<object ID="RCTL" template="Script/ReviewControl.xml"/>
<object ID="REAA" template="Script/AreaAttributes.xml"/>
<object ID="REAC" template="Script/ReactiveObject.xml"/>
<object ID="RMBI" template="Script/Rambi.xml"/>
<object ID="ROPE" template="Script/SwingRope.xml"/>
<object ID="RRLY" template="Script/RandomRelay.xml"/>
<object ID="RSBL" template="Script/RespawnBalloon.xml"/>
<object ID="RSCL" template="Script/RSCL.xml"/>
<object ID="RTNM" template="Script/Retronome.xml"/>
<object ID="RUMB" template="Script/RumbleEffect.xml"/>
<object ID="SLCT" template="Script/ScriptLayerController.xml"/>
<object ID="SQTR" template="Script/SequenceTimer.xml"/>
<object ID="SHDW" template="Script/ShadowProjector.xml"/>
<object ID="SAMD" template="Script/StreamedAudioModifier.xml"/>
<object ID="SBMI" template="Script/SkyboxModInca.xml"/>
<object ID="SOND" template="Script/Sound.xml"/>
<object ID="SCTL" template="Script/SurfaceControl.xml"/>
<object ID="SHDW" template="Script/ShadowProjector.xml"/>
<object ID="SLCT" template="Script/ScriptLayerController.xml"/>
<object ID="SNDM" template="Script/SoundModifier.xml"/>
<object ID="SNMD" template="Script/SoundModifierData.xml"/>
<object ID="SPWN" template="Script/SpawnPoint.xml"/>
<object ID="SOND" template="Script/Sound.xml"/>
<object ID="SPFN" template="Script/SpecialFunction.xml"/>
<object ID="SPIN" template="Script/Spinner.xml"/>
<object ID="SVOL" template="Script/SplineModifierVolume.xml"/>
<object ID="SPPA" template="Script/SplinePath.xml"/>
<object ID="SPNW" template="Script/SplinePathNetwork.xml"/>
<object ID="SWKP" template="Script/SquawkPuzzleAlert.xml"/>
<object ID="SPPA" template="Script/SplinePath.xml"/>
<object ID="SPRL" template="Script/PositionRelay.xml"/>
<object ID="SPWN" template="Script/SpawnPoint.xml"/>
<object ID="SQTR" template="Script/SequenceTimer.xml"/>
<object ID="SRLY" template="Script/Relay.xml"/>
<object ID="STAU" template="Script/StreamedAudio.xml"/>
<object ID="MOVI" template="Script/StreamedMovie.xml"/>
<object ID="SUBT" template="Script/Subtitles.xml"/>
<object ID="SCTL" template="Script/SurfaceControl.xml"/>
<object ID="SUSP" template="Script/SuspensionBridge.xml"/>
<object ID="ROPE" template="Script/SwingRope.xml"/>
<object ID="SVOL" template="Script/SplineModifierVolume.xml"/>
<object ID="SWKP" template="Script/SquawkPuzzleAlert.xml"/>
<object ID="SWTC" template="Script/Switch.xml"/>
<object ID="TARP" template="Script/TarPit.xml"/>
<object ID="TXPN" template="Script/TextPane.xml"/>
<object ID="TIDE" template="Script/TidalWave.xml"/>
<object ID="TEOL" template="Script/TimeAttackEOLDisplay.xml"/>
<object ID="TKEY" template="Script/TimeKeyframe.xml"/>
<object ID="TIDE" template="Script/TidalWave.xml"/>
<object ID="TIMR" template="Script/Timer.xml"/>
<object ID="TIPI" template="Script/TippyPlatform.xml"/>
<object ID="TPND" template="Script/TPND.xml"/>
<object ID="TKEY" template="Script/TimeKeyframe.xml"/>
<object ID="TMGR" template="Script/TrainTrackManager.xml"/>
<object ID="TSEQ" template="Script/TrainSequence.xml"/>
<object ID="TRSC" template="Script/TransitionScreen.xml"/>
<object ID="TPND" template="Script/TPND.xml"/>
<object ID="TRGR" template="Script/Trigger.xml"/>
<object ID="TRSC" template="Script/TransitionScreen.xml"/>
<object ID="TSEQ" template="Script/TrainSequence.xml"/>
<object ID="TUTR" template="Script/Tutorial.xml"/>
<object ID="VRBR" template="Script/VerticalRocketBarrel.xml"/>
<object ID="TXPN" template="Script/TextPane.xml"/>
<object ID="VBPT" template="Script/VolcanoBossBodyPart.xml"/>
<object ID="VOLG" template="Script/VolGroup.xml"/>
<object ID="VRBR" template="Script/VerticalRocketBarrel.xml"/>
<object ID="WAVE" template="Script/OceanWave.xml"/>
<object ID="WAYP" template="Script/Waypoint.xml"/>
<object ID="WLDA" template="Script/WorldAttributes.xml"/>
<object ID="WLIT" template="Script/WorldLightFader.xml"/>

View File

@ -39,7 +39,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -17,7 +17,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -150,9 +150,9 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>volume</scale_type>
<preview_volume shape="Box"/>
<preview_volume shape="Box"/>
</editor>
</ScriptTemplate>

View File

@ -104,7 +104,7 @@
<model source="property">0x6C75E2EA:0xDAA9D4BE:0x5405F708</model>
<model source="property">0x6C75E2EA:0xF361604C:0x5405F708</model>
<model source="property">0x6C75E2EA:0x5D09F1DD:0x5405F708</model>
<collision source="property">0x0FC966DC</collision>
<collision source="property">0x0FC966DC</collision>
</assets>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>

View File

@ -39,7 +39,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -45,7 +45,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -28,7 +28,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -16,7 +16,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -31,9 +31,9 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets>
<billboard source="file">script/common/AreaAttributes.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<billboard source="file">script/common/AreaAttributes.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -32,7 +32,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -54,7 +54,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -21,7 +21,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -61,7 +61,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -27,7 +27,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -27,7 +27,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -27,7 +27,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -30,7 +30,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -41,7 +41,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -243,7 +243,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -22,7 +22,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -33,7 +33,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -38,7 +38,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -35,7 +35,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -44,7 +44,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -75,7 +75,7 @@
<assets>
<billboard source="file">script/common/ColorModulate.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -40,9 +40,9 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets>
<billboard source="file">script/common/ConditionalRelay.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<billboard source="file">script/common/ConditionalRelay.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -29,7 +29,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -61,9 +61,9 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets>
<billboard source="file">script/common/Counter.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<billboard source="file">script/common/Counter.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -76,7 +76,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -16,7 +16,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -16,7 +16,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -26,10 +26,10 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets>
<billboard source="file">script/common/DamageableTrigger.txtr</billboard>
</assets>
<billboard source="file">script/common/DamageableTrigger.txtr</billboard>
</assets>
<rotation_type>enabled</rotation_type>
<scale_type>volume</scale_type>
<preview_volume shape="AxisAlignedBox"/>
<preview_volume shape="AxisAlignedBox"/>
</editor>
</ScriptTemplate>

View File

@ -26,6 +26,6 @@
<assets/>
<rotation_type>enabled</rotation_type>
<scale_type>volume</scale_type>
<preview_volume shape="Box"/>
<preview_volume shape="Box"/>
</editor>
</ScriptTemplate>

View File

@ -45,7 +45,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -62,9 +62,9 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets>
<billboard source="file">script/common/DistanceFog.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<billboard source="file">script/common/DistanceFog.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -124,7 +124,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -21,7 +21,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -79,7 +79,7 @@
</properties>
<assets>
<billboard source="file">script/common/Effect.txtr</billboard>
</assets>
</assets>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -21,7 +21,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -27,7 +27,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -60,7 +60,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -15,7 +15,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -29,7 +29,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -15,7 +15,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -28,7 +28,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -56,7 +56,7 @@
<assets>
<billboard source="file">script/common/Generator.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -25,7 +25,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -349,7 +349,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -15,7 +15,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -56,7 +56,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -61,7 +61,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -24,7 +24,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -24,7 +24,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -23,8 +23,8 @@
</properties>
<assets>
<billboard source="file">script/common/MemoryRelay.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
</assets>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -111,7 +111,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -42,7 +42,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -18,7 +18,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -52,7 +52,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -58,7 +58,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -19,7 +19,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -19,7 +19,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -35,7 +35,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -111,7 +111,7 @@
<assets>
<animparams source="property">0xA3D63F44</animparams>
<model source="property">0xC27FFA8F</model>
<collision source="property">0x0FC966DC</collision>
<collision source="property">0x0FC966DC</collision>
</assets>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>

View File

@ -69,7 +69,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -50,7 +50,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -18,7 +18,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -60,7 +60,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -28,7 +28,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -44,8 +44,8 @@
</properties>
<assets>
<billboard source="file">script/common/RandomRelay.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
</assets>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -19,8 +19,8 @@
</properties>
<assets>
<billboard source="file">script/common/Relay.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
</assets>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -33,7 +33,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -23,7 +23,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -59,7 +59,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -19,7 +19,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -4,25 +4,32 @@
<properties>
<struct ID="0x255A4580" template="Structs/EditorProperties.xml"/>
<array ID="0xEF5C94E9">
<default>0</default>
<element_name>Connection</element_name>
<element_name>Connection</element_name>
<properties>
<property ID="0x00" name="Connection Index" type="short" />
<array ID="0x01" name="Activation Times">
<element_name>Activation Time</element_name>
<properties>
<property ID="0x00" name="Time" type="float" />
<property ID="0x01" name="Unknown 1" type="long">
<description>Always 0</description>
</property>
<property ID="0x02" name="Unknown 2" type="long"/>
<property ID="0x03" name="Unknown 3" type="long">
<description>Always 0</description>
</property>
</properties>
</array>
<property ID="0x00" name="Connection Index" type="short">
<default>0</default>
</property>
<array ID="0x01" name="Activation Times">
<element_name>Activation Time</element_name>
<properties>
<property ID="0x00" name="Time" type="float">
<default>0.0</default>
</property>
<property ID="0x01" name="Unknown 1" type="long">
<default>0</default>
<description>Always 0</description>
</property>
<property ID="0x02" name="Unknown 2" type="long">
<default>0</default>
</property>
<property ID="0x03" name="Unknown 3" type="long">
<default>0</default>
<description>Always 0</description>
</property>
</properties>
</array>
</properties>
</array>
</array>
<property ID="0xB8BD2175" type="float">
<default>0.0</default>
</property>
@ -55,7 +62,7 @@
<assets>
<billboard source="file">script/common/SequenceTimer.txtr</billboard>
</assets>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

View File

@ -19,7 +19,7 @@
<property name="Active" ID="0x255A4580:0x41435456"/>
</properties>
<assets/>
<preview_scale>0.5</preview_scale>
<preview_scale>0.5</preview_scale>
<rotation_type>enabled</rotation_type>
<scale_type>enabled</scale_type>
</editor>

Some files were not shown because too many files have changed in this diff Show More