Index: source/graphics/MapGenerator.h =================================================================== --- source/graphics/MapGenerator.h +++ source/graphics/MapGenerator.h @@ -116,6 +116,8 @@ */ void InitScriptInterface(const u32 seed); + CTemplateLoader& GetTemplateLoader() { return m_TemplateLoader; } + private: /** @@ -156,26 +158,6 @@ */ double GetMicroseconds(); - /** - * Return the template data of the given template name. - */ - CParamNode GetTemplate(const std::string& templateName); - - /** - * Check whether the given template exists. - */ - bool TemplateExists(const std::string& templateName); - - /** - * Returns all template names of simulation entity templates. - */ - std::vector FindTemplates(const std::string& path, bool includeSubdirectories); - - /** - * Returns all template names of actors. - */ - std::vector FindActorTemplates(const std::string& path, bool includeSubdirectories); - /** * Perform the map generation. */ Index: source/graphics/MapGenerator.cpp =================================================================== --- source/graphics/MapGenerator.cpp +++ source/graphics/MapGenerator.cpp @@ -181,6 +181,9 @@ REGISTER_MAPGEN_FUNC_NAME(LoadHeightmap, "LoadHeightmapImage"); REGISTER_MAPGEN_FUNC(LoadMapTerrain); + // Template loading interface + m_TemplateLoader.RegisterScriptFunctions(rq); + // Engine constants // Length of one tile of the terrain grid in metres. @@ -195,12 +198,6 @@ { ScriptRequest rq(m_ScriptInterface); - // Template functions - REGISTER_MAPGEN_FUNC(GetTemplate); - REGISTER_MAPGEN_FUNC(TemplateExists); - REGISTER_MAPGEN_FUNC(FindTemplates); - REGISTER_MAPGEN_FUNC(FindActorTemplates); - // Progression and profiling REGISTER_MAPGEN_FUNC(SetProgress); REGISTER_MAPGEN_FUNC(GetMicroseconds); @@ -246,30 +243,6 @@ LOGWARNING("The random map script tried to reduce the loading progress from %d to %d", m_Progress, progress); } -CParamNode CMapGeneratorWorker::GetTemplate(const std::string& templateName) -{ - const CParamNode& templateRoot = m_TemplateLoader.GetTemplateFileData(templateName).GetChild("Entity"); - if (!templateRoot.IsOk()) - LOGERROR("Invalid template found for '%s'", templateName.c_str()); - - return templateRoot; -} - -bool CMapGeneratorWorker::TemplateExists(const std::string& templateName) -{ - return m_TemplateLoader.TemplateExists(templateName); -} - -std::vector CMapGeneratorWorker::FindTemplates(const std::string& path, bool includeSubdirectories) -{ - return m_TemplateLoader.FindTemplates(path, includeSubdirectories, SIMULATION_TEMPLATES); -} - -std::vector CMapGeneratorWorker::FindActorTemplates(const std::string& path, bool includeSubdirectories) -{ - return m_TemplateLoader.FindTemplates(path, includeSubdirectories, ACTOR_TEMPLATES); -} - bool CMapGeneratorWorker::LoadScripts(const VfsPath& libraryName) { // Ignore libraries that are already loaded Index: source/gui/CGUI.h =================================================================== --- source/gui/CGUI.h +++ source/gui/CGUI.h @@ -32,6 +32,7 @@ #include "maths/Rect.h" #include "maths/Size2D.h" #include "maths/Vector2D.h" +#include "ps/TemplateLoader.h" #include "ps/XML/Xeromyces.h" #include "scriptinterface/ScriptForward.h" @@ -258,6 +259,8 @@ std::shared_ptr GetScriptInterface() { return m_ScriptInterface; }; + CTemplateLoader& GetTemplateLoader() { return m_TemplateLoader; }; + private: /** * The CGUI takes ownership of the child object and links the parent with the child. @@ -688,6 +691,8 @@ // Icons std::map m_Icons; + CTemplateLoader m_TemplateLoader; + public: /** * Map from event names to object which listen to a given event. Index: source/gui/CGUI.cpp =================================================================== --- source/gui/CGUI.cpp +++ source/gui/CGUI.cpp @@ -105,6 +105,9 @@ m_ScriptInterface->SetCallbackData(this); GuiScriptingInit(*m_ScriptInterface); + ScriptRequest rq(*m_ScriptInterface); + m_TemplateLoader.RegisterScriptFunctions(rq); + m_ScriptInterface->LoadGlobalScripts(); } Index: source/gui/GUIManager.h =================================================================== --- source/gui/GUIManager.h +++ source/gui/GUIManager.h @@ -114,16 +114,6 @@ */ void UpdateResolution(); - /** - * Check if a template with this name exists - */ - bool TemplateExists(const std::string& templateName) const; - - /** - * Retrieve the requested template, used for displaying faction specificities. - */ - const CParamNode& GetTemplate(const std::string& templateName); - /** * Display progress / description in loading screen. */ @@ -179,8 +169,6 @@ */ using PageStackType = std::deque; PageStackType m_PageStack; - - CTemplateLoader m_TemplateLoader; }; extern CGUIManager* g_GUI; Index: source/gui/GUIManager.cpp =================================================================== --- source/gui/GUIManager.cpp +++ source/gui/GUIManager.cpp @@ -408,20 +408,6 @@ } } -bool CGUIManager::TemplateExists(const std::string& templateName) const -{ - return m_TemplateLoader.TemplateExists(templateName); -} - -const CParamNode& CGUIManager::GetTemplate(const std::string& templateName) -{ - const CParamNode& templateRoot = m_TemplateLoader.GetTemplateFileData(templateName).GetChild("Entity"); - if (!templateRoot.IsOk()) - LOGERROR("Invalid template found for '%s'", templateName.c_str()); - - return templateRoot; -} - void CGUIManager::DisplayLoadProgress(int percent, const wchar_t* pending_task) { const ScriptInterface& scriptInterface = *(GetActiveGUI()->GetScriptInterface()); Index: source/gui/Scripting/JSInterface_GUIManager.cpp =================================================================== --- source/gui/Scripting/JSInterface_GUIManager.cpp +++ source/gui/Scripting/JSInterface_GUIManager.cpp @@ -63,17 +63,6 @@ g_VideoMode.ResetCursor(); } -bool TemplateExists(const std::string& templateName) -{ - return g_GUI->TemplateExists(templateName); -} - -CParamNode GetTemplate(const std::string& templateName) -{ - return g_GUI->GetTemplate(templateName); -} - - void RegisterScriptFunctions(const ScriptRequest& rq) { ScriptFunction::Register<&PushGuiPage>(rq, "PushGuiPage"); @@ -81,8 +70,6 @@ ScriptFunction::Register<&PopGuiPage>(rq, "PopGuiPage"); ScriptFunction::Register<&SetCursor>(rq, "SetCursor"); ScriptFunction::Register<&ResetCursor>(rq, "ResetCursor"); - ScriptFunction::Register<&TemplateExists>(rq, "TemplateExists"); - ScriptFunction::Register<&GetTemplate>(rq, "GetTemplate"); ScriptFunction::Register<&CGUI::FindObjectByName, &ScriptInterface::ObjectFromCBData>(rq, "GetGUIObjectByName"); ScriptFunction::Register<&CGUI::SetGlobalHotkey, &ScriptInterface::ObjectFromCBData>(rq, "SetGlobalHotkey"); Index: source/ps/TemplateLoader.h =================================================================== --- source/ps/TemplateLoader.h +++ source/ps/TemplateLoader.h @@ -18,11 +18,24 @@ #ifndef INCLUDED_TEMPLATELOADER #define INCLUDED_TEMPLATELOADER +#include "scriptinterface/FunctionWrapper.h" +#include "scriptinterface/ScriptInterface.h" #include "simulation2/system/ParamNode.h" #include #include +class ScriptRequest; + +class CTemplateLoader; + +template +CTemplateLoader* TemplateLoaderGetter(const ScriptRequest& rq, JS::CallArgs& ca) +{ + T* instance = rq.GetScriptInterface().ObjectFromCBData(rq, ca); + return &(instance->GetTemplateLoader()); +} + enum ETemplatesType { ALL_TEMPLATES, @@ -47,8 +60,23 @@ class CTemplateLoader { public: - CTemplateLoader() + CTemplateLoader() = default; + + /** + * Helpers for providing JS interfaces. + */ + const CParamNode& Script_GetTemplate(const std::string& templateName); + bool Script_TemplateExists(const std::string& templateName) const; + std::vector Script_FindTemplates(const std::string& path, bool includeSubdirectories) const; + std::vector Script_FindActorTemplates(const std::string& path, bool includeSubdirectories) const; + + template + void RegisterScriptFunctions(const ScriptRequest& rq) const { + ScriptFunction::Register<&CTemplateLoader::Script_GetTemplate, &TemplateLoaderGetter>(rq, "GetTemplate"); + ScriptFunction::Register<&CTemplateLoader::Script_TemplateExists, &TemplateLoaderGetter>(rq, "TemplateExists"); + ScriptFunction::Register<&CTemplateLoader::Script_FindTemplates, &TemplateLoaderGetter>(rq, "FindTemplates"); + ScriptFunction::Register<&CTemplateLoader::Script_FindActorTemplates, &TemplateLoaderGetter>(rq, "FindActorTemplates"); } /** Index: source/ps/TemplateLoader.cpp =================================================================== --- source/ps/TemplateLoader.cpp +++ source/ps/TemplateLoader.cpp @@ -204,3 +204,27 @@ // We'll assume that actorName is valid XML, otherwise this will fail and report the error anyways. CParamNode::LoadXMLString(out, source.c_str(), actorNameW.c_str()); } + +const CParamNode& CTemplateLoader::Script_GetTemplate(const std::string& templateName) +{ + const CParamNode& templateRoot = GetTemplateFileData(templateName).GetChild("Entity"); + if (!templateRoot.IsOk()) + LOGERROR("Invalid template found for '%s'", templateName.c_str()); + + return templateRoot; +} + +bool CTemplateLoader::Script_TemplateExists(const std::string& templateName) const +{ + return TemplateExists(templateName); +} + +std::vector CTemplateLoader::Script_FindTemplates(const std::string& path, bool includeSubdirectories) const +{ + return FindTemplates(path, includeSubdirectories, SIMULATION_TEMPLATES); +} + +std::vector CTemplateLoader::Script_FindActorTemplates(const std::string& path, bool includeSubdirectories) const +{ + return FindTemplates(path, includeSubdirectories, ACTOR_TEMPLATES); +} Index: source/simulation2/system/ComponentManager.h =================================================================== --- source/simulation2/system/ComponentManager.h +++ source/simulation2/system/ComponentManager.h @@ -19,6 +19,7 @@ #define INCLUDED_COMPONENTMANAGER #include "ps/Filesystem.h" +#include "ps/TemplateLoader.h" #include "scriptinterface/ScriptInterface.h" #include "simulation2/helpers/Player.h" #include "simulation2/system/Components.h" @@ -271,6 +272,8 @@ ScriptInterface& GetScriptInterface() { return m_ScriptInterface; } + CTemplateLoader& GetTemplateLoader() { return m_TemplateLoader; } + private: // Implementations of functions exposed to scripts void Script_RegisterComponentType_Common(int iid, const std::string& cname, JS::HandleValue ctor, bool reRegister, bool systemComponent); @@ -333,6 +336,9 @@ boost::rand48 m_RNG; + // To provide raw access to global templates + CTemplateLoader m_TemplateLoader; + friend class TestComponentManager; }; Index: source/simulation2/system/ComponentManager.cpp =================================================================== --- source/simulation2/system/ComponentManager.cpp +++ source/simulation2/system/ComponentManager.cpp @@ -86,6 +86,8 @@ ScriptFunction::Register<&CComponentManager::QueryInterface, Getter>(rq, "QueryInterface"); ScriptFunction::Register<&CComponentManager::DestroyComponentsSoon, Getter>(rq, "DestroyEntity"); ScriptFunction::Register<&CComponentManager::FlushDestroyedComponents, Getter>(rq, "FlushDestroyedEntities"); + + m_TemplateLoader.RegisterScriptFunctions(rq); } // Globalscripts may use VFS script functions