diff options
-rw-r--r-- | level.dtd | 62 | ||||
-rw-r--r-- | src/Data/Gate.cpp | 3 | ||||
-rw-r--r-- | src/Data/Gate.h | 14 | ||||
-rw-r--r-- | src/Data/Level.cpp | 105 | ||||
-rw-r--r-- | src/Data/Level.h | 31 | ||||
-rw-r--r-- | src/Data/Room.cpp | 2 | ||||
-rw-r--r-- | src/Data/Room.h | 12 | ||||
-rw-r--r-- | src/Data/Texture.h | 4 | ||||
-rw-r--r-- | src/Instance.cpp | 11 | ||||
-rw-r--r-- | src/Instance.h | 1 |
10 files changed, 230 insertions, 15 deletions
diff --git a/level.dtd b/level.dtd new file mode 100644 index 0000000..d04db1f --- /dev/null +++ b/level.dtd @@ -0,0 +1,62 @@ +<!ELEMENT level (info, rooms, gates, textures)> + +<!ELEMENT info (name, desc, start)> +<!ELEMENT rooms (room)*> +<!ELEMENT gates (gate)*> +<!ELEMENT textures (texture)*> + +<!ELEMENT name (#PCDATA)> +<!ELEMENT desc (#PCDATA)> +<!ELEMENT start EMPTY> +<!ATTLIST start + x CDATA #REQUIRED + y CDATA #REQUIRED + z CDATA #REQUIRED +> + +<!ELEMENT room (triangle)*> +<!ATTLIST room + id ID #REQUIRED +> + +<!ELEMENT gate (triangle)*> +<!ATTLIST gate + id ID #REQUIRED + room1 IDREF #REQUIRED + room2 IDREF #REQUIRED +> + +<!ELEMENT triangle (vertex, normal?, texcoords?, vertex, normal?, texcoords?, vertex, normal?, texcoords?)> +<!ATTLIST triangle + visible (true|false) "true" + texture IDREF #IMPLIED +> + +<!ELEMENT texture EMPTY> +<!ATTLIST texture + id ID #REQUIRED + name CDATA #REQUIRED +> + +<!ELEMENT vertex EMPTY> +<!ATTLIST vertex + x CDATA #REQUIRED + y CDATA #REQUIRED + z CDATA #REQUIRED +> + +<!ELEMENT normal EMPTY> +<!ATTLIST normal + x CDATA #REQUIRED + y CDATA #REQUIRED + z CDATA #REQUIRED +> + +<!ELEMENT texcoords EMPTY> +<!ATTLIST texcoords + s CDATA #REQUIRED + t CDATA #IMPLIED + r CDATA #IMPLIED + q CDATA #IMPLIED +> + 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<xmlpp::Element*>(*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<Triangle> 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<xmlpp::Element*>(lev for(xmlpp::Node::NodeList::iterator room = nodeList.begin(); room != nodeList.end(); ++room) { xmlpp::Element *roomNode = dynamic_cast<xmlpp::Element*>(*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<xmlpp::Element*>(lev for(xmlpp::Node::NodeList::iterator gate = nodeList.begin(); gate != nodeList.end(); ++gate) { xmlpp::Element *gateNode = dynamic_cast<xmlpp::Element*>(*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<xmlpp::Element*>(lev for(xmlpp::Node::NodeList::iterator tex = nodeList.begin(); tex != nodeList.end(); ++tex) { xmlpp::Element *texNode = dynamic_cast<xmlpp::Element*>(*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<Glib::ustring,Room>::iterator room = rooms.find(id); + return (room != rooms.end()) ? &room->second : NULL; +} + +const Room* Level::getRoom(const Glib::ustring &id) const { + std::map<Glib::ustring,Room>::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<Glib::ustring,Gate>::iterator gate = gates.find(id); + return (gate != gates.end()) ? &gate->second : NULL; +} + +const Gate* Level::getGate(const Glib::ustring &id) const { + std::map<Glib::ustring,Gate>::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<Glib::ustring,Texture>::iterator tex = textures.find(id); + return (tex != textures.end()) ? &tex->second : NULL; +} + +const Texture* Level::getTexture(const Glib::ustring &id) const { + std::map<Glib::ustring,Texture>::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 <list> +#include <map> namespace ZoomEdit { namespace Data { @@ -33,17 +34,41 @@ class Level { private: Info info; - std::list<Room> rooms; + std::map<Glib::ustring,Room> rooms; xmlpp::Element *roomsNode; - std::list<Gate> gates; + std::map<Glib::ustring,Gate> gates; xmlpp::Element *gatesNode; - std::list<Texture> textures; + std::map<Glib::ustring,Texture> textures; xmlpp::Element *texturesNode; public: Level(xmlpp::Element *levelNode); + + const std::map<Glib::ustring,Room>& 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<Glib::ustring,Gate>& 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<Glib::ustring,Texture>& 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<xmlpp::Element*>(*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<Triangle>& getTriangles() { + const std::list<Triangle>& 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 <iostream> #include <libxml++/validators/dtdvalidator.h> +#include <libxml/tree.h> #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()); |