zoomedit:

* Made Rooms, Gates and Textures in Levels changable
This commit is contained in:
neoraider 2008-04-12 19:06:05 +00:00
parent 0c6471da93
commit 7fa8e4b4fa
10 changed files with 230 additions and 15 deletions

62
level.dtd Normal file
View file

@ -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
>

View file

@ -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");
}

View file

@ -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;
}
};
}

View file

@ -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);
}
}
}

View file

@ -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);
};
}

View file

@ -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");

View file

@ -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;
}
};

View file

@ -51,6 +51,10 @@ class Texture {
name = nname;
texNode->set_attribute("name", nname);
}
xmlpp::Element* getNode() const {
return texNode;
}
};
}

View file

@ -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);

View file

@ -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());