diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-03-05 16:07:07 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2018-03-05 16:07:07 -0500 |
commit | 13f946689e28e99ac71172925f63f4320798a0ee (patch) | |
tree | ba30132da24aa70b0d2daffc96ac3b3f63d57df6 /tools/mapedit | |
parent | dbc486d5cc0fa6b7cdb690fb4591f292d33e9ecc (diff) | |
download | therapy-13f946689e28e99ac71172925f63f4320798a0ee.tar.gz therapy-13f946689e28e99ac71172925f63f4320798a0ee.tar.bz2 therapy-13f946689e28e99ac71172925f63f4320798a0ee.zip |
Added entity indexing
Changed the world format so that map objects are indexed (per map). The next available map object index is cached for each map.
Diffstat (limited to 'tools/mapedit')
-rw-r--r-- | tools/mapedit/src/map.cpp | 14 | ||||
-rw-r--r-- | tools/mapedit/src/map.h | 4 | ||||
-rw-r--r-- | tools/mapedit/src/object.cpp | 15 | ||||
-rw-r--r-- | tools/mapedit/src/object.h | 8 | ||||
-rw-r--r-- | tools/mapedit/src/widget.cpp | 7 | ||||
-rw-r--r-- | tools/mapedit/src/world.cpp | 20 |
6 files changed, 63 insertions, 5 deletions
diff --git a/tools/mapedit/src/map.cpp b/tools/mapedit/src/map.cpp index a099e29..7e6c3c0 100644 --- a/tools/mapedit/src/map.cpp +++ b/tools/mapedit/src/map.cpp | |||
@@ -188,6 +188,11 @@ const Map::Adjacent& Map::getAdjacent(MoveDir direction) const | |||
188 | } | 188 | } |
189 | } | 189 | } |
190 | 190 | ||
191 | size_t Map::getNextObjectIndex() const | ||
192 | { | ||
193 | return nextObjectIndex; | ||
194 | } | ||
195 | |||
191 | void Map::setTitle(std::string title, bool dirty) | 196 | void Map::setTitle(std::string title, bool dirty) |
192 | { | 197 | { |
193 | this->title = title; | 198 | this->title = title; |
@@ -271,3 +276,12 @@ void Map::setAdjacent(MoveDir direction, MoveType type, int map, bool dirty) | |||
271 | } | 276 | } |
272 | } | 277 | } |
273 | 278 | ||
279 | size_t Map::getAndIncrementNextObjectIndex() | ||
280 | { | ||
281 | return nextObjectIndex++; | ||
282 | } | ||
283 | |||
284 | void Map::setNextObjectIndex(size_t v) | ||
285 | { | ||
286 | nextObjectIndex = v; | ||
287 | } | ||
diff --git a/tools/mapedit/src/map.h b/tools/mapedit/src/map.h index 9c14218..1ae905f 100644 --- a/tools/mapedit/src/map.h +++ b/tools/mapedit/src/map.h | |||
@@ -89,6 +89,7 @@ class Map { | |||
89 | bool getHidden() const; | 89 | bool getHidden() const; |
90 | const std::map<MoveDir, Adjacent>& getAdjacents() const; | 90 | const std::map<MoveDir, Adjacent>& getAdjacents() const; |
91 | const Adjacent& getAdjacent(MoveDir direction) const; | 91 | const Adjacent& getAdjacent(MoveDir direction) const; |
92 | size_t getNextObjectIndex() const; | ||
92 | 93 | ||
93 | void setTitle(std::string title, bool dirty = true); | 94 | void setTitle(std::string title, bool dirty = true); |
94 | void setTileAt(int x, int y, int tile, bool dirty = true); | 95 | void setTileAt(int x, int y, int tile, bool dirty = true); |
@@ -100,6 +101,8 @@ class Map { | |||
100 | void setExpanded(bool exp); | 101 | void setExpanded(bool exp); |
101 | void setHidden(bool hid); | 102 | void setHidden(bool hid); |
102 | void setAdjacent(MoveDir direction, MoveType type, int map = -1, bool dirty = true); | 103 | void setAdjacent(MoveDir direction, MoveType type, int map = -1, bool dirty = true); |
104 | size_t getAndIncrementNextObjectIndex(); | ||
105 | void setNextObjectIndex(size_t v); | ||
103 | 106 | ||
104 | private: | 107 | private: |
105 | int id; | 108 | int id; |
@@ -113,6 +116,7 @@ class Map { | |||
113 | bool hidden = false; | 116 | bool hidden = false; |
114 | std::map<MoveDir, Adjacent> adjacents; | 117 | std::map<MoveDir, Adjacent> adjacents; |
115 | const Adjacent defaultAdjacent {}; | 118 | const Adjacent defaultAdjacent {}; |
119 | size_t nextObjectIndex = 0; | ||
116 | }; | 120 | }; |
117 | 121 | ||
118 | class MapPtrCtr : public wxTreeItemData { | 122 | class MapPtrCtr : public wxTreeItemData { |
diff --git a/tools/mapedit/src/object.cpp b/tools/mapedit/src/object.cpp index 8ed29af..aeb8fc1 100644 --- a/tools/mapedit/src/object.cpp +++ b/tools/mapedit/src/object.cpp | |||
@@ -184,9 +184,15 @@ bool MapObject::operator!=(const MapObject& other) const | |||
184 | return id != other.id; | 184 | return id != other.id; |
185 | } | 185 | } |
186 | 186 | ||
187 | MapObjectEntry::MapObjectEntry(const MapObject& object, int posx, int posy) : object(object) | 187 | MapObjectEntry::MapObjectEntry( |
188 | const MapObject& object, | ||
189 | int posx, | ||
190 | int posy, | ||
191 | size_t index) : | ||
192 | object(object), | ||
193 | position(std::make_pair(posx, posy)), | ||
194 | index(index) | ||
188 | { | 195 | { |
189 | position = std::make_pair(posx, posy); | ||
190 | } | 196 | } |
191 | 197 | ||
192 | const MapObject& MapObjectEntry::getObject() const | 198 | const MapObject& MapObjectEntry::getObject() const |
@@ -209,6 +215,11 @@ const std::map<std::string, MapObjectEntry::Item>& MapObjectEntry::getItems() co | |||
209 | return items; | 215 | return items; |
210 | } | 216 | } |
211 | 217 | ||
218 | size_t MapObjectEntry::getIndex() const | ||
219 | { | ||
220 | return index; | ||
221 | } | ||
222 | |||
212 | void MapObjectEntry::addItem(std::string id, Item& item) | 223 | void MapObjectEntry::addItem(std::string id, Item& item) |
213 | { | 224 | { |
214 | items[id] = item; | 225 | items[id] = item; |
diff --git a/tools/mapedit/src/object.h b/tools/mapedit/src/object.h index a870a2e..a87fa96 100644 --- a/tools/mapedit/src/object.h +++ b/tools/mapedit/src/object.h | |||
@@ -67,7 +67,11 @@ class MapObject { | |||
67 | 67 | ||
68 | class MapObjectEntry { | 68 | class MapObjectEntry { |
69 | public: | 69 | public: |
70 | MapObjectEntry(const MapObject& object, int posx, int posy); | 70 | MapObjectEntry( |
71 | const MapObject& object, | ||
72 | int posx, | ||
73 | int posy, | ||
74 | size_t index); | ||
71 | 75 | ||
72 | struct Item { | 76 | struct Item { |
73 | MapObject::Input::Type type; | 77 | MapObject::Input::Type type; |
@@ -78,6 +82,7 @@ class MapObjectEntry { | |||
78 | std::pair<int, int> getPosition() const; | 82 | std::pair<int, int> getPosition() const; |
79 | Item& getItem(std::string str); | 83 | Item& getItem(std::string str); |
80 | const std::map<std::string, Item>& getItems() const; | 84 | const std::map<std::string, Item>& getItems() const; |
85 | size_t getIndex() const; | ||
81 | 86 | ||
82 | void setPosition(int x, int y); | 87 | void setPosition(int x, int y); |
83 | void addItem(std::string id, Item& item); | 88 | void addItem(std::string id, Item& item); |
@@ -89,6 +94,7 @@ class MapObjectEntry { | |||
89 | const MapObject& object; | 94 | const MapObject& object; |
90 | std::pair<int, int> position; | 95 | std::pair<int, int> position; |
91 | std::map<std::string, Item> items; | 96 | std::map<std::string, Item> items; |
97 | size_t index; | ||
92 | }; | 98 | }; |
93 | 99 | ||
94 | class VariableChoiceValidator : public wxValidator { | 100 | class VariableChoiceValidator : public wxValidator { |
diff --git a/tools/mapedit/src/widget.cpp b/tools/mapedit/src/widget.cpp index 8d74b39..85838e6 100644 --- a/tools/mapedit/src/widget.cpp +++ b/tools/mapedit/src/widget.cpp | |||
@@ -256,7 +256,12 @@ void MapeditWidget::OnClick(wxMouseEvent& event) | |||
256 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale - (addingEntity->getWidth() / 2); | 256 | int x = (event.GetPosition().x + vX - EDITOR_SPACING_X*scale) / scale - (addingEntity->getWidth() / 2); |
257 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale - (addingEntity->getHeight() / 2); | 257 | int y = (event.GetPosition().y + vY - EDITOR_SPACING_Y*scale) / scale - (addingEntity->getHeight() / 2); |
258 | 258 | ||
259 | auto data = std::make_shared<MapObjectEntry>(*addingEntity, x, y); | 259 | auto data = std::make_shared<MapObjectEntry>( |
260 | *addingEntity, | ||
261 | x, | ||
262 | y, | ||
263 | map->getAndIncrementNextObjectIndex()); | ||
264 | |||
260 | frame->commitAction(std::make_shared<Undoable>("Add " + addingEntity->getName(), [=] () { | 265 | frame->commitAction(std::make_shared<Undoable>("Add " + addingEntity->getName(), [=] () { |
261 | map->addObject(data); | 266 | map->addObject(data); |
262 | 267 | ||
diff --git a/tools/mapedit/src/world.cpp b/tools/mapedit/src/world.cpp index 79f5a58..9983731 100644 --- a/tools/mapedit/src/world.cpp +++ b/tools/mapedit/src/world.cpp | |||
@@ -94,6 +94,11 @@ World::World(std::string filename) | |||
94 | map->setTitle((char*) titleKey, false); | 94 | map->setTitle((char*) titleKey, false); |
95 | xmlFree(titleKey); | 95 | xmlFree(titleKey); |
96 | 96 | ||
97 | xmlChar* noiKey = xmlGetProp(node, (xmlChar*) "nextObject"); | ||
98 | if (noiKey == 0) throw MapLoadException("map missing nextObject attribute"); | ||
99 | map->setNextObjectIndex(atoi((char*) noiKey)); | ||
100 | xmlFree(noiKey); | ||
101 | |||
97 | for (xmlNodePtr mapNode = node->xmlChildrenNode; mapNode != NULL; mapNode = mapNode->next) | 102 | for (xmlNodePtr mapNode = node->xmlChildrenNode; mapNode != NULL; mapNode = mapNode->next) |
98 | { | 103 | { |
99 | if (!xmlStrcmp(mapNode->name, (const xmlChar*) "environment")) | 104 | if (!xmlStrcmp(mapNode->name, (const xmlChar*) "environment")) |
@@ -125,7 +130,12 @@ World::World(std::string filename) | |||
125 | int ypos = atoi((char*) yKey); | 130 | int ypos = atoi((char*) yKey); |
126 | xmlFree(yKey); | 131 | xmlFree(yKey); |
127 | 132 | ||
128 | auto data = std::make_shared<MapObjectEntry>(obj, xpos, ypos); | 133 | xmlChar* indexKey = xmlGetProp(mapNode, (const xmlChar*) "index"); |
134 | if (indexKey == 0) throw MapLoadException("entity missing index attribute"); | ||
135 | int objIndex = atoi((char*) indexKey); | ||
136 | xmlFree(indexKey); | ||
137 | |||
138 | auto data = std::make_shared<MapObjectEntry>(obj, xpos, ypos, objIndex); | ||
129 | 139 | ||
130 | map->addObject(data, false); | 140 | map->addObject(data, false); |
131 | 141 | ||
@@ -312,6 +322,10 @@ void World::save(std::string name, wxTreeCtrl* mapTree) | |||
312 | // title= | 322 | // title= |
313 | rc = xmlTextWriterWriteAttribute(writer, (xmlChar*) "title", (xmlChar*) map.getTitle().c_str()); | 323 | rc = xmlTextWriterWriteAttribute(writer, (xmlChar*) "title", (xmlChar*) map.getTitle().c_str()); |
314 | if (rc < 0) throw MapWriteException(name); | 324 | if (rc < 0) throw MapWriteException(name); |
325 | |||
326 | // nextObject= | ||
327 | rc = xmlTextWriterWriteFormatAttribute(writer, (xmlChar*) "nextObject", "%zu", map.getNextObjectIndex()); | ||
328 | if (rc < 0) throw MapWriteException(name); | ||
315 | 329 | ||
316 | // <environment | 330 | // <environment |
317 | rc = xmlTextWriterStartElement(writer, (xmlChar*) "environment"); | 331 | rc = xmlTextWriterStartElement(writer, (xmlChar*) "environment"); |
@@ -358,6 +372,10 @@ void World::save(std::string name, wxTreeCtrl* mapTree) | |||
358 | rc = xmlTextWriterWriteFormatAttribute(writer, (xmlChar*) "y", "%d", object->getPosition().second); | 372 | rc = xmlTextWriterWriteFormatAttribute(writer, (xmlChar*) "y", "%d", object->getPosition().second); |
359 | if (rc < 0) throw MapWriteException(name); | 373 | if (rc < 0) throw MapWriteException(name); |
360 | 374 | ||
375 | // index= | ||
376 | rc = xmlTextWriterWriteFormatAttribute(writer, (xmlChar*) "index", "%zu", object->getIndex()); | ||
377 | if (rc < 0) throw MapWriteException(name); | ||
378 | |||
361 | for (auto item : object->getItems()) | 379 | for (auto item : object->getItems()) |
362 | { | 380 | { |
363 | // <item | 381 | // <item |