From 7fa8e4b4faf6dca308607977d2c2aaa5428ca60d Mon Sep 17 00:00:00 2001 From: neoraider Date: Sat, 12 Apr 2008 19:06:05 +0000 Subject: zoomedit: * Made Rooms, Gates and Textures in Levels changable --- src/Data/Gate.cpp | 3 +- src/Data/Gate.h | 14 +++++++ src/Data/Level.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++--- src/Data/Level.h | 31 ++++++++++++++-- src/Data/Room.cpp | 2 +- src/Data/Room.h | 12 ++++-- src/Data/Texture.h | 4 ++ src/Instance.cpp | 11 ++++++ src/Instance.h | 1 + 9 files changed, 168 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/Data/Gate.cpp b/src/Data/Gate.cpp index 5a6c63e..2aa89ee 100644 --- a/src/Data/Gate.cpp +++ b/src/Data/Gate.cpp @@ -29,9 +29,10 @@ Gate::Gate(xmlpp::Element *node) : gateNode(node) { xmlpp::Element *tNode = dynamic_cast(*t); if(tNode) - triangles.push_front(Triangle(tNode)); + triangles.push_back(Triangle(tNode)); } + id = node->get_attribute_value("id"); room1 = node->get_attribute_value("room1"); room2 = node->get_attribute_value("room2"); } diff --git a/src/Data/Gate.h b/src/Data/Gate.h index 91acbce..b1cde71 100644 --- a/src/Data/Gate.h +++ b/src/Data/Gate.h @@ -31,6 +31,7 @@ class Gate { std::list triangles; xmlpp::Element *gateNode; + Glib::ustring id; Glib::ustring room1, room2; public: @@ -40,6 +41,15 @@ class Gate { return triangles; } + const Glib::ustring& getId() const { + return id; + } + + void setId(const Glib::ustring &id0) { + id = id0; + gateNode->set_attribute("id", id0); + } + const Glib::ustring& getRoom1() const { return room1; } @@ -57,6 +67,10 @@ class Gate { room2 = room; gateNode->set_attribute("room2", room); } + + xmlpp::Element* getNode() const { + return gateNode; + } }; } diff --git a/src/Data/Level.cpp b/src/Data/Level.cpp index ff6f8fb..6689107 100644 --- a/src/Data/Level.cpp +++ b/src/Data/Level.cpp @@ -32,8 +32,11 @@ Level::Level(xmlpp::Element *levelNode) : info(dynamic_cast(lev for(xmlpp::Node::NodeList::iterator room = nodeList.begin(); room != nodeList.end(); ++room) { xmlpp::Element *roomNode = dynamic_cast(*room); - if(roomNode) - rooms.push_front(Room(roomNode)); + if(roomNode) { + Room room(roomNode); + + rooms.insert(std::make_pair(room.getId(), room)); + } } nodeList = gatesNode->get_children("gate"); @@ -41,8 +44,11 @@ Level::Level(xmlpp::Element *levelNode) : info(dynamic_cast(lev for(xmlpp::Node::NodeList::iterator gate = nodeList.begin(); gate != nodeList.end(); ++gate) { xmlpp::Element *gateNode = dynamic_cast(*gate); - if(gateNode) - gates.push_front(Gate(gateNode)); + if(gateNode) { + Gate gate(gateNode); + + gates.insert(std::make_pair(gate.getId(), gate)); + } } nodeList = texturesNode->get_children("texture"); @@ -50,10 +56,97 @@ Level::Level(xmlpp::Element *levelNode) : info(dynamic_cast(lev for(xmlpp::Node::NodeList::iterator tex = nodeList.begin(); tex != nodeList.end(); ++tex) { xmlpp::Element *texNode = dynamic_cast(*tex); - if(texNode) - textures.push_front(Texture(texNode)); + if(texNode) { + Texture tex(texNode); + + textures.insert(std::make_pair(tex.getId(), tex)); + } } } +Room* Level::getRoom(const Glib::ustring &id) { + std::map::iterator room = rooms.find(id); + return (room != rooms.end()) ? &room->second : NULL; +} + +const Room* Level::getRoom(const Glib::ustring &id) const { + std::map::const_iterator room = rooms.find(id); + return (room != rooms.end()) ? &room->second : NULL; +} + +Room* Level::addRoom(const Glib::ustring &id) { + xmlpp::Element *node = roomsNode->add_child("room"); + + node->set_attribute("id", id); + + return &rooms.insert(std::make_pair(id, Room(node))).first->second; +} + +void Level::removeRoom(const Glib::ustring &id) { + Room *room = getRoom(id); + if(!room) + return; + + roomsNode->remove_child(room->getNode()); + rooms.erase(id); +} + +Gate* Level::getGate(const Glib::ustring &id) { + std::map::iterator gate = gates.find(id); + return (gate != gates.end()) ? &gate->second : NULL; +} + +const Gate* Level::getGate(const Glib::ustring &id) const { + std::map::const_iterator gate = gates.find(id); + return (gate != gates.end()) ? &gate->second : NULL; +} + +Gate* Level::addGate(const Glib::ustring &id) { + xmlpp::Element *node = gatesNode->add_child("gate"); + + node->set_attribute("id", id); + node->set_attribute("room1", ""); + node->set_attribute("room2", ""); + + return &gates.insert(std::make_pair(id, Gate(node))).first->second; +} + +void Level::removeGate(const Glib::ustring &id) { + Gate *gate = getGate(id); + if(!gate) + return; + + gatesNode->remove_child(gate->getNode()); + gates.erase(id); +} + +Texture* Level::getTexture(const Glib::ustring &id) { + std::map::iterator tex = textures.find(id); + return (tex != textures.end()) ? &tex->second : NULL; +} + +const Texture* Level::getTexture(const Glib::ustring &id) const { + std::map::const_iterator tex = textures.find(id); + return (tex != textures.end()) ? &tex->second : NULL; +} + +Texture* Level::addTexture(const Glib::ustring &id) { + xmlpp::Element *node = texturesNode->add_child("texture"); + + node->set_attribute("id", id); + node->set_attribute("name", ""); + + return &textures.insert(std::make_pair(id, Texture(node))).first->second; +} + +void Level::removeTexture(const Glib::ustring &id) { + Texture *tex = getTexture(id); + if(!tex) + return; + + texturesNode->remove_child(tex->getNode()); + textures.erase(id); +} + } } diff --git a/src/Data/Level.h b/src/Data/Level.h index ab660a2..c72b503 100644 --- a/src/Data/Level.h +++ b/src/Data/Level.h @@ -25,6 +25,7 @@ #include "Gate.h" #include "Texture.h" #include +#include namespace ZoomEdit { namespace Data { @@ -33,17 +34,41 @@ class Level { private: Info info; - std::list rooms; + std::map rooms; xmlpp::Element *roomsNode; - std::list gates; + std::map gates; xmlpp::Element *gatesNode; - std::list textures; + std::map textures; xmlpp::Element *texturesNode; public: Level(xmlpp::Element *levelNode); + + const std::map& getRooms() const {return rooms;} + + Room* getRoom(const Glib::ustring &id); + const Room* getRoom(const Glib::ustring &id) const; + + Room* addRoom(const Glib::ustring &id); + void removeRoom(const Glib::ustring &id); + + const std::map& getGates() const {return gates;} + + Gate* getGate(const Glib::ustring &id); + const Gate* getGate(const Glib::ustring &id) const; + + Gate* addGate(const Glib::ustring &id); + void removeGate(const Glib::ustring &id); + + const std::map& getTextures() const {return textures;} + + Texture* getTexture(const Glib::ustring &id); + const Texture* getTexture(const Glib::ustring &id) const; + + Texture* addTexture(const Glib::ustring &id); + void removeTexture(const Glib::ustring &id); }; } diff --git a/src/Data/Room.cpp b/src/Data/Room.cpp index 08f02f9..9749b22 100644 --- a/src/Data/Room.cpp +++ b/src/Data/Room.cpp @@ -29,7 +29,7 @@ Room::Room(xmlpp::Element *node) : roomNode(node) { xmlpp::Element *tNode = dynamic_cast(*t); if(tNode) - triangles.push_front(Triangle(tNode)); + triangles.push_back(Triangle(tNode)); } id = node->get_attribute_value("id"); diff --git a/src/Data/Room.h b/src/Data/Room.h index efd67cb..1c1f9e8 100644 --- a/src/Data/Room.h +++ b/src/Data/Room.h @@ -36,7 +36,7 @@ class Room { public: Room(xmlpp::Element *node); - const std::list& getTriangles() { + const std::list& getTriangles() const { return triangles; } @@ -44,9 +44,13 @@ class Room { return id; } - void setId(const Glib::ustring &nid) { - id = nid; - roomNode->set_attribute("id", nid); + void setId(const Glib::ustring &id0) { + id = id0; + roomNode->set_attribute("id", id0); + } + + xmlpp::Element* getNode() const { + return roomNode; } }; diff --git a/src/Data/Texture.h b/src/Data/Texture.h index e0cea59..b301bbf 100644 --- a/src/Data/Texture.h +++ b/src/Data/Texture.h @@ -51,6 +51,10 @@ class Texture { name = nname; texNode->set_attribute("name", nname); } + + xmlpp::Element* getNode() const { + return texNode; + } }; } diff --git a/src/Instance.cpp b/src/Instance.cpp index fe4b761..f602bbf 100644 --- a/src/Instance.cpp +++ b/src/Instance.cpp @@ -19,6 +19,7 @@ #include #include +#include #include "Instance.h" #include "Gui/Window.h" #include "Data/Level.h" @@ -91,6 +92,8 @@ void Instance::createLevel() { levelXml = new xmlpp::DomParser; xmlpp::Document *doc = levelXml->get_document(); + xmlSetDocCompressMode(doc->cobj(), 9); + xmlpp::Element *root = doc->create_root_node("level"); xmlpp::Element *info = root->add_child("info"); @@ -131,6 +134,14 @@ bool Instance::loadLevel(const Glib::ustring &file) { return (level != NULL); } +bool Instance::saveLevel(const Glib::ustring &file) { + if(!level | !levelXml->get_document()) + return false; + + levelXml->get_document()->write_to_file(file); + return true; +} + bool Instance::create(const Glib::ustring &file) { Instance *instance = new Instance(file); diff --git a/src/Instance.h b/src/Instance.h index d9c0509..8c22eb4 100644 --- a/src/Instance.h +++ b/src/Instance.h @@ -40,6 +40,7 @@ class Instance { void createLevel(); bool loadLevel(const Glib::ustring &file); + bool saveLevel(const Glib::ustring &file); static bool create(const Glib::ustring &file = Glib::ustring()); -- cgit v1.2.3