77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2023 Dominic Masters
 | |
| // 
 | |
| // This software is released under the MIT License.
 | |
| // https://opensource.org/licenses/MIT
 | |
| 
 | |
| #pragma once
 | |
| #include "util/XmlParser.hpp"
 | |
| #include "util/CodeGen.hpp"
 | |
| 
 | |
| namespace Dawn {
 | |
|   struct CharacterInformation {
 | |
|     std::string clazz;
 | |
|     std::string name;
 | |
|   };
 | |
| 
 | |
|   class CharacterParser : public XmlParser<struct CharacterInformation> {
 | |
|     protected:
 | |
|       std::vector<std::string> getRequiredAttributes() {
 | |
|         return std::vector<std::string>{
 | |
|           "class",
 | |
|           "name"
 | |
|         };
 | |
|       }
 | |
| 
 | |
|       std::map<std::string, std::string> getOptionalAttributes() {
 | |
|         return std::map<std::string, std::string>();
 | |
|       }
 | |
| 
 | |
|       int32_t onParse(
 | |
|         Xml *node,
 | |
|         std::map<std::string, std::string> values,
 | |
|         struct CharacterInformation *out,
 | |
|         std::string *error
 | |
|       ) {
 | |
|         out->clazz = values["class"];
 | |
|         out->name = values["name"];
 | |
| 
 | |
|         if(out->clazz.size() == 0) {
 | |
|           *error = "Character class cannot be empty.";
 | |
|           return 1;
 | |
|         }
 | |
|         if(out->name.size() == 0) {
 | |
|           *error = "Character name cannot be empty.";
 | |
|           return 1;
 | |
|         }
 | |
| 
 | |
|         return 0;
 | |
|       }
 | |
|   };
 | |
| 
 | |
|   class CharacterGen : public CodeGen {
 | |
|     public:
 | |
|       static void generateProperty(
 | |
|         std::vector<std::string> *out,
 | |
|         struct CharacterInformation info,
 | |
|         std::string tabs
 | |
|       ) {
 | |
|         line(out, info.clazz + " *" + info.name + ";", tabs);
 | |
|       }
 | |
| 
 | |
|       static void generateInitializer(
 | |
|         std::vector<std::string> *out,
 | |
|         struct CharacterInformation info,
 | |
|         std::string tabs
 | |
|       ) {
 | |
|         line(out, "this->" + info.name + " = " + info.clazz + "::create(this);", tabs);
 | |
|       }
 | |
| 
 | |
|       static void generateAssets(
 | |
|         std::vector<std::string> *out,
 | |
|         struct CharacterInformation info,
 | |
|         std::string tabs
 | |
|       ) {
 | |
|         line(out, "vectorAppend(&assets, " + info.clazz + "::getRequiredAssets(man));", "");
 | |
|       }
 | |
|   };
 | |
| } |