diff options
| author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-04-21 14:50:52 -0400 |
|---|---|---|
| committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-04-21 14:50:52 -0400 |
| commit | 8142a9c87a13cecc7a3698e877f24d89f128c074 (patch) | |
| tree | cbee6ae85c5c674dd313c7cfe1420477ee55ca95 /src/world.cpp | |
| parent | 0f70db34d9b47de55b00c558ac3c445f30b7b6a5 (diff) | |
| download | therapy-proto-objs.tar.gz therapy-proto-objs.tar.bz2 therapy-proto-objs.zip | |
Started working on prototype objects proto-objs
Diffstat (limited to 'src/world.cpp')
| -rw-r--r-- | src/world.cpp | 67 |
1 files changed, 54 insertions, 13 deletions
| diff --git a/src/world.cpp b/src/world.cpp index 3b6bd41..d239067 100644 --- a/src/world.cpp +++ b/src/world.cpp | |||
| @@ -1,19 +1,8 @@ | |||
| 1 | #include "world.h" | 1 | #include "world.h" |
| 2 | #include <libxml/parser.h> | ||
| 3 | #include <stdexcept> | 2 | #include <stdexcept> |
| 4 | #include <cstring> | 3 | #include <cstring> |
| 5 | #include "consts.h" | 4 | #include "consts.h" |
| 6 | 5 | #include "xml.h" | |
| 7 | inline xmlChar* getProp(xmlNodePtr node, const char* attr) | ||
| 8 | { | ||
| 9 | xmlChar* key = xmlGetProp(node, reinterpret_cast<const xmlChar*>(attr)); | ||
| 10 | if (key == nullptr) | ||
| 11 | { | ||
| 12 | throw std::invalid_argument("Error parsing world file"); | ||
| 13 | } | ||
| 14 | |||
| 15 | return key; | ||
| 16 | } | ||
| 17 | 6 | ||
| 18 | World::World(std::string filename) | 7 | World::World(std::string filename) |
| 19 | { | 8 | { |
| @@ -67,6 +56,7 @@ World::World(std::string filename) | |||
| 67 | Map::Adjacent rightAdj; | 56 | Map::Adjacent rightAdj; |
| 68 | Map::Adjacent upAdj; | 57 | Map::Adjacent upAdj; |
| 69 | Map::Adjacent downAdj; | 58 | Map::Adjacent downAdj; |
| 59 | std::list<Map::Object> objects; | ||
| 70 | 60 | ||
| 71 | for (xmlNodePtr mapNode = node->xmlChildrenNode; | 61 | for (xmlNodePtr mapNode = node->xmlChildrenNode; |
| 72 | mapNode != nullptr; | 62 | mapNode != nullptr; |
| @@ -77,6 +67,10 @@ World::World(std::string filename) | |||
| 77 | reinterpret_cast<const xmlChar*>("environment"))) | 67 | reinterpret_cast<const xmlChar*>("environment"))) |
| 78 | { | 68 | { |
| 79 | key = xmlNodeGetContent(mapNode); | 69 | key = xmlNodeGetContent(mapNode); |
| 70 | if (key == nullptr) | ||
| 71 | { | ||
| 72 | throw std::invalid_argument("Error parsing XML file"); | ||
| 73 | } | ||
| 80 | 74 | ||
| 81 | mapTiles.clear(); | 75 | mapTiles.clear(); |
| 82 | mapTiles.push_back(atoi(strtok(reinterpret_cast<char*>(key), ",\n"))); | 76 | mapTiles.push_back(atoi(strtok(reinterpret_cast<char*>(key), ",\n"))); |
| @@ -88,6 +82,52 @@ World::World(std::string filename) | |||
| 88 | xmlFree(key); | 82 | xmlFree(key); |
| 89 | } else if (!xmlStrcmp( | 83 | } else if (!xmlStrcmp( |
| 90 | mapNode->name, | 84 | mapNode->name, |
| 85 | reinterpret_cast<const xmlChar*>("entity"))) | ||
| 86 | { | ||
| 87 | key = getProp(mapNode, "type"); | ||
| 88 | std::string entType(reinterpret_cast<char*>(key)); | ||
| 89 | xmlFree(key); | ||
| 90 | |||
| 91 | key = getProp(mapNode, "x"); | ||
| 92 | int entX = atoi(reinterpret_cast<char*>(key)); | ||
| 93 | xmlFree(key); | ||
| 94 | |||
| 95 | key = getProp(mapNode, "y"); | ||
| 96 | int entY = atoi(reinterpret_cast<char*>(key)); | ||
| 97 | xmlFree(key); | ||
| 98 | |||
| 99 | key = getProp(mapNode, "index"); | ||
| 100 | int entIndex = atoi(reinterpret_cast<char*>(key)); | ||
| 101 | xmlFree(key); | ||
| 102 | |||
| 103 | std::map<std::string, int> items; | ||
| 104 | |||
| 105 | for (xmlNodePtr entityNode = mapNode->xmlChildrenNode; | ||
| 106 | entityNode != nullptr; | ||
| 107 | entityNode = entityNode->next) | ||
| 108 | { | ||
| 109 | key = getProp(entityNode, "id"); | ||
| 110 | std::string itemId(reinterpret_cast<char*>(key)); | ||
| 111 | xmlFree(key); | ||
| 112 | |||
| 113 | key = xmlNodeGetContent(entityNode); | ||
| 114 | if (key == nullptr) | ||
| 115 | { | ||
| 116 | throw std::invalid_argument("Error parsing XML file"); | ||
| 117 | } | ||
| 118 | |||
| 119 | items[itemId] = atoi(reinterpret_cast<char*>(key)); | ||
| 120 | xmlFree(key); | ||
| 121 | } | ||
| 122 | |||
| 123 | objects.emplace_back( | ||
| 124 | std::move(entType), | ||
| 125 | entX, | ||
| 126 | entY, | ||
| 127 | entIndex, | ||
| 128 | std::move(items)); | ||
| 129 | } else if (!xmlStrcmp( | ||
| 130 | mapNode->name, | ||
| 91 | reinterpret_cast<const xmlChar*>("adjacent"))) | 131 | reinterpret_cast<const xmlChar*>("adjacent"))) |
| 92 | { | 132 | { |
| 93 | key = getProp(mapNode, "type"); | 133 | key = getProp(mapNode, "type"); |
| @@ -147,7 +187,8 @@ World::World(std::string filename) | |||
| 147 | leftAdj, | 187 | leftAdj, |
| 148 | rightAdj, | 188 | rightAdj, |
| 149 | upAdj, | 189 | upAdj, |
| 150 | downAdj)); | 190 | downAdj, |
| 191 | std::move(objects))); | ||
| 151 | } | 192 | } |
| 152 | } | 193 | } |
| 153 | 194 | ||
