diff --git a/source/graphics/MapGenerator.cpp b/source/graphics/MapGenerator.cpp index 9765039ce4..799b746129 100644 --- a/source/graphics/MapGenerator.cpp +++ b/source/graphics/MapGenerator.cpp @@ -248,7 +248,7 @@ void CMapGeneratorWorker::SetProgress(int progress) CParamNode CMapGeneratorWorker::GetTemplate(const std::string& templateName) { - const CParamNode& templateRoot = m_TemplateLoader.GetTemplateFileData(templateName).GetChild("Entity"); + const CParamNode& templateRoot = m_TemplateLoader.GetTemplateFileData(templateName).GetOnlyChild(); if (!templateRoot.IsOk()) LOGERROR("Invalid template found for '%s'", templateName.c_str()); diff --git a/source/gui/GUIManager.cpp b/source/gui/GUIManager.cpp index 055421c119..de775a4dfd 100644 --- a/source/gui/GUIManager.cpp +++ b/source/gui/GUIManager.cpp @@ -415,7 +415,7 @@ bool CGUIManager::TemplateExists(const std::string& templateName) const const CParamNode& CGUIManager::GetTemplate(const std::string& templateName) { - const CParamNode& templateRoot = m_TemplateLoader.GetTemplateFileData(templateName).GetChild("Entity"); + const CParamNode& templateRoot = m_TemplateLoader.GetTemplateFileData(templateName).GetOnlyChild(); if (!templateRoot.IsOk()) LOGERROR("Invalid template found for '%s'", templateName.c_str()); diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index c7cc396490..5f1981ccc9 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -787,7 +787,7 @@ CParamNode GetTemplate(const std::string& templateName) // This is very cheap to create so let's just do it every time. CTemplateLoader templateLoader; - const CParamNode& templateRoot = templateLoader.GetTemplateFileData(templateName).GetChild("Entity"); + const CParamNode& templateRoot = templateLoader.GetTemplateFileData(templateName).GetOnlyChild(); if (!templateRoot.IsOk()) LOGERROR("Invalid template found for '%s'", templateName.c_str()); diff --git a/source/simulation2/components/CCmpAIManager.cpp b/source/simulation2/components/CCmpAIManager.cpp index 195016517f..b56037faa1 100644 --- a/source/simulation2/components/CCmpAIManager.cpp +++ b/source/simulation2/components/CCmpAIManager.cpp @@ -354,7 +354,7 @@ public: { if (!m_TemplateLoader.TemplateExists(name)) return CParamNode(false); - return m_TemplateLoader.GetTemplateFileData(name).GetChild("Entity"); + return m_TemplateLoader.GetTemplateFileData(name).GetOnlyChild(); } /** diff --git a/source/simulation2/components/CCmpTemplateManager.cpp b/source/simulation2/components/CCmpTemplateManager.cpp index 01bca05124..6ad5b560ca 100644 --- a/source/simulation2/components/CCmpTemplateManager.cpp +++ b/source/simulation2/components/CCmpTemplateManager.cpp @@ -170,7 +170,7 @@ const CParamNode* CCmpTemplateManager::GetTemplate(const std::string& templateNa return NULL; } - const CParamNode& templateRoot = fileData.GetChild("Entity"); + const CParamNode& templateRoot = fileData.GetOnlyChild(); if (!templateRoot.IsOk()) { // The validator should never let this happen @@ -183,7 +183,7 @@ const CParamNode* CCmpTemplateManager::GetTemplate(const std::string& templateNa const CParamNode* CCmpTemplateManager::GetTemplateWithoutValidation(const std::string& templateName) { - const CParamNode& templateRoot = m_templateLoader.GetTemplateFileData(templateName).GetChild("Entity"); + const CParamNode& templateRoot = m_templateLoader.GetTemplateFileData(templateName).GetOnlyChild(); if (!templateRoot.IsOk()) return NULL; diff --git a/source/simulation2/system/ComponentManager.cpp b/source/simulation2/system/ComponentManager.cpp index 81d316f254..421bbc2f6c 100644 --- a/source/simulation2/system/ComponentManager.cpp +++ b/source/simulation2/system/ComponentManager.cpp @@ -1148,7 +1148,8 @@ std::string CComponentManager::GenerateSchema() const std::sort(componentTypes.begin(), componentTypes.end()); schema += "" - "" + "" + "" ""; for (std::vector::const_iterator it = componentTypes.begin(); it != componentTypes.end(); ++it) schema += ""; diff --git a/source/simulation2/system/ParamNode.cpp b/source/simulation2/system/ParamNode.cpp index 84163ed23e..a136421c50 100644 --- a/source/simulation2/system/ParamNode.cpp +++ b/source/simulation2/system/ParamNode.cpp @@ -241,6 +241,15 @@ void CParamNode::ApplyLayer(const XMBData& xmb, const XMBElement& element, const } } +const CParamNode& CParamNode::GetOnlyChild() const +{ + if (m_Childs.empty()) + return g_NullNode; + + ENSURE(m_Childs.size() == 1); + return m_Childs.begin()->second; +} + const CParamNode& CParamNode::GetChild(const char* name) const { ChildrenMap::const_iterator it = m_Childs.find(name); diff --git a/source/simulation2/system/ParamNode.h b/source/simulation2/system/ParamNode.h index 06be0d783b..acd0ae0736 100644 --- a/source/simulation2/system/ParamNode.h +++ b/source/simulation2/system/ParamNode.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2021 Wildfire Games. +/* Copyright (C) 2022 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -190,6 +190,12 @@ public: // (Children are returned as const in order to allow future optimisations, where we assume // a node is always modified explicitly and not indirectly via its children, e.g. to cache JS::Values) + /** + * Returns the only child node, or a node with IsOk() == false if there is none. + * This is mainly useful for the root node. + */ + const CParamNode& GetOnlyChild() const; + /** * Returns true if this is a valid CParamNode, false if it represents a non-existent node */ diff --git a/source/simulation2/tests/test_ParamNode.h b/source/simulation2/tests/test_ParamNode.h index 02c182b615..e9dd7564f2 100644 --- a/source/simulation2/tests/test_ParamNode.h +++ b/source/simulation2/tests/test_ParamNode.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2021 Wildfire Games. +/* Copyright (C) 2022 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -50,6 +50,7 @@ public: TS_ASSERT_EQUALS(node.GetChild("test").GetChild("Bar").GetChild("Baz").ToInt(), 3); TS_ASSERT(node.GetChild("test").GetChild("Qux").IsOk()); TS_ASSERT(!node.GetChild("test").GetChild("Qux").GetChild("Baz").IsOk()); + TS_ASSERT_STR_EQUALS(node.GetChild("test").ToXMLString(), node.GetOnlyChild().ToXMLString()); CParamNode nullOne(false); CParamNode nullTwo = nullOne;