1 /* Copyright (C) 2017 Wildfire Games. 2 * This file is part of 0 A.D. 3 * 4 * 0 A.D. is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * 0 A.D. is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #ifndef INCLUDED_TEMPLATELOADER 19 #define INCLUDED_TEMPLATELOADER 20 21 #include "simulation2/system/ParamNode.h" 22 23 enum ETemplatesType 24 { 25 ALL_TEMPLATES, 26 ACTOR_TEMPLATES, 27 SIMULATION_TEMPLATES 28 }; 29 30 /** 31 * Template loader: Handles the loading of entity template files for: 32 * - the initialisation and deserialization of entity components in the 33 * simulation (CmpTemplateManager). 34 * - access to actor templates, obstruction data, etc. in RMS/RMGEN 35 * - access to various templates in the GUI, to display faction specificities 36 * 37 * Template names are intentionally restricted to ASCII strings for storage/serialization 38 * efficiency (we have a lot of strings so this is significant); 39 * they correspond to filenames so they shouldn't contain non-ASCII anyway. 40 * 41 * 42 * TODO: Find a way to validate templates outside of the simulation. 43 */ 44 class CTemplateLoader 45 { 46 public: CTemplateLoader()47 CTemplateLoader() 48 { 49 } 50 51 /** 52 * Provides the file data for requested template. 53 */ 54 const CParamNode& GetTemplateFileData(const std::string& templateName); 55 56 /** 57 * Check if the template XML file exits, without trying to load it. 58 */ 59 bool TemplateExists(const std::string& templateName) const; 60 61 /** 62 * Returns a list of strings that could be validly passed as @c templateName to LoadTemplateFile. 63 * (This includes "actor|foo" etc names). 64 */ 65 std::vector<std::string> FindTemplates(const std::string& path, bool includeSubdirectories, ETemplatesType templatesType) const; 66 67 private: 68 /** 69 * (Re)loads the given template, regardless of whether it exists already, 70 * and saves into m_TemplateFileData. Also loads any parents that are not yet 71 * loaded. Returns false on error. 72 * @param templateName XML filename to load (not a |-separated string) 73 */ 74 bool LoadTemplateFile(const std::string& templateName, int depth); 75 76 /** 77 * Constructs a standard static-decorative-object template for the given actor 78 */ 79 void ConstructTemplateActor(const std::string& actorName, CParamNode& out); 80 81 /** 82 * Map from template name (XML filename or special |-separated string) to the most recently 83 * loaded non-broken template data. This includes files that will fail schema validation. 84 * (Failed loads won't remove existing entries under the same name, so we behave more nicely 85 * when hotloading broken files) 86 */ 87 std::map<std::string, CParamNode> m_TemplateFileData; 88 }; 89 90 #endif // INCLUDED_TEMPLATELOADER 91