summary refs log tree commit diff stats
path: root/src/prototype_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/prototype_manager.cpp')
-rw-r--r--src/prototype_manager.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/prototype_manager.cpp b/src/prototype_manager.cpp new file mode 100644 index 0000000..250aa59 --- /dev/null +++ b/src/prototype_manager.cpp
@@ -0,0 +1,71 @@
1#include "prototype_manager.h"
2#include <utility>
3#include <stdexcept>
4#include "xml.h"
5
6PrototypeManager::PrototypeManager(std::string path)
7{
8 xmlDocPtr doc = xmlParseFile(path.c_str());
9 if (doc == nullptr)
10 {
11 throw std::invalid_argument("Cannot find prototypes file");
12 }
13
14 xmlNodePtr top = xmlDocGetRootElement(doc);
15 if (top == nullptr)
16 {
17 throw std::invalid_argument("Error parsing prototypes file");
18 }
19
20 if (xmlStrcmp(top->name, reinterpret_cast<const xmlChar*>("entities")))
21 {
22 throw std::invalid_argument("Error parsing prototypes file");
23 }
24
25 xmlChar* key = nullptr;
26
27 for (xmlNodePtr node = top->xmlChildrenNode;
28 node != nullptr;
29 node = node->next)
30 {
31 if (!xmlStrcmp(node->name, reinterpret_cast<const xmlChar*>("entity")))
32 {
33 key = getProp(node, "id");
34 std::string prototypeName(reinterpret_cast<char*>(key));
35 xmlFree(key);
36
37 key = getProp(node, "sprite");
38 std::string spritePath(reinterpret_cast<char*>(key));
39 xmlFree(key);
40
41 key = getProp(node, "width");
42 int width = atoi(reinterpret_cast<char*>(key));
43 xmlFree(key);
44
45 key = getProp(node, "height");
46 int height = atoi(reinterpret_cast<char*>(key));
47 xmlFree(key);
48
49 key = getProp(node, "action");
50 std::string actionStr(reinterpret_cast<char*>(key));
51 xmlFree(key);
52
53 Prototype::Action pAction = Prototype::Action::none;
54 if (actionStr == "save")
55 {
56 pAction = Prototype::Action::save;
57 }
58
59 prototypes_.emplace(
60 std::piecewise_construct,
61 std::tie(prototypeName),
62 std::tie(
63 width,
64 height,
65 spritePath,
66 pAction));
67 }
68 }
69
70 xmlFreeDoc(doc);
71}