zoomedit:
* Made Rooms, Gates and Textures in Levels changable
This commit is contained in:
parent
0c6471da93
commit
7fa8e4b4fa
10 changed files with 230 additions and 15 deletions
62
level.dtd
Normal file
62
level.dtd
Normal 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
|
||||
>
|
||||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -51,6 +51,10 @@ class Texture {
|
|||
name = nname;
|
||||
texNode->set_attribute("name", nname);
|
||||
}
|
||||
|
||||
xmlpp::Element* getNode() const {
|
||||
return texNode;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
Reference in a new issue