diff options
Diffstat (limited to 'src/Data/Level.cpp')
-rw-r--r-- | src/Data/Level.cpp | 105 |
1 files changed, 99 insertions, 6 deletions
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); +} + } } |