changeset 16:f91e0e1ba856

monster-meshes werden aus XML geladen
author kemic
date Fri, 03 Oct 2008 14:10:18 +0000
parents c821f69fc167
children 09edaddbcb97
files src/core/itemfactory.cpp src/core/objectloader.cpp src/core/objectloader.h src/gui/scene.cpp src/gui/scene.h
diffstat 5 files changed, 198 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/itemfactory.cpp	Fri Oct 03 10:53:18 2008 +0000
+++ b/src/core/itemfactory.cpp	Fri Oct 03 14:10:18 2008 +0000
@@ -1,5 +1,4 @@
 #include "itemfactory.h"
-#include "itemloader.h"
 
 #define USE_ITEMLOADER
 
--- a/src/core/objectloader.cpp	Fri Oct 03 10:53:18 2008 +0000
+++ b/src/core/objectloader.cpp	Fri Oct 03 14:10:18 2008 +0000
@@ -34,9 +34,11 @@
 			}
 			else if (!strcmp(pAttrib->Name(), "subtype"))
 			{
-				if (!strcmp(pAttrib->Value(), "GOBLIN"))
+				m_monster_data->m_type_info.m_subtype = pAttrib->Value();
+				//Veraltet, da Enum hier auf String umgestellt ist
+				/*if (!strcmp(pAttrib->Value(), "GOBLIN"))
 					m_monster_data->m_type_info.m_subtype = "goblin";
-					//m_monster_data->m_type_info.m_subtype = WorldObject::TypeInfo::SUBTYPE_GOBLIN;
+					//m_monster_data->m_type_info.m_subtype = WorldObject::TypeInfo::SUBTYPE_GOBLIN;*/
 			}
 			else if (!strcmp(pAttrib->Name(), "fraction"))
 			{
@@ -288,7 +290,7 @@
 }
 
 
-list<MonsterBasicData*>* ObjectLoader::loadObjects(const char* pFilename) // TODO Noch nicht benutzen!
+list<MonsterBasicData*>* ObjectLoader::loadObjects(const char* pFilename)
 {
 	for (int i=0; i<4; i++)
 	{
@@ -321,4 +323,115 @@
 	}
 }
 
+//##############################################################################
 
+int ObjectLoader::generateMonsterMeshData(TiXmlElement* pElement, string element)
+{
+	if ( !pElement ) return 0;
+	
+	TiXmlAttribute* pAttrib=pElement->FirstAttribute();
+	int i=0;
+	int ival;
+	double dval;
+	
+	if (element == "Monster" && pAttrib)
+	{
+		if (m_monster_mesh_data == 0)
+		{
+			m_monster_mesh_data = new MonsterMeshData;
+		}
+		
+		while (element == "Monster" && pAttrib)
+		{
+			if (!strcmp(pAttrib->Name(), "subtype"))
+				m_monster_mesh_data->m_subtype = pAttrib->Value();
+			
+			i++;
+			pAttrib=pAttrib->Next();
+		}
+	}
+	
+	if (element == "Mesh" && pAttrib)
+	{
+		while (element == "Mesh" && pAttrib)
+		{
+			if (!strcmp(pAttrib->Name(), "file"))
+				m_monster_mesh_data->m_mesh = pAttrib->Value();
+			
+			i++;
+			pAttrib=pAttrib->Next();
+		}
+	}
+	
+	return i;
+}
+
+
+void ObjectLoader::searchMonsterMeshData(TiXmlNode* pParent)
+{
+	if ( !pParent ) return;
+	
+	TiXmlNode* pChild;
+	TiXmlText* pText;
+	
+	int t = pParent->Type();
+	int num;
+	
+	switch ( t )
+	{
+	case TiXmlNode::ELEMENT:
+		//printf( "Element [%s]", pParent->Value() );
+		num = generateMonsterMeshData(pParent->ToElement(), pParent->Value());
+		/*switch(num)
+		{
+			case 0:  printf( " (No attributes)"); break;
+			case 1:  printf( "%s1 attribute", getIndentAlt(indent)); break;
+			default: printf( "%s%d attributes", getIndentAlt(indent), num); break;
+		}*/
+		break;
+	/*
+	case TiXmlNode::TEXT:
+		pText = pParent->ToText();
+		printf( "Text: [%s]", pText->Value() );
+		break;
+	*/
+	default:
+		break;
+	}
+	
+	for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())
+	{
+		searchMonsterMeshData(pChild);
+		
+		if ( !strcmp(pChild->Value(), "Monster") && pChild->Type() == TiXmlNode::ELEMENT)
+		{
+			m_monster_mesh_list->push_back(m_monster_mesh_data);
+			m_monster_mesh_data = 0;
+			DEBUG5("Monster Mesh loaded");
+		}
+	}
+}
+
+
+list<MonsterMeshData*>* ObjectLoader::loadMonsterMeshData(const char* pFilename)
+{
+	m_monster_mesh_data = 0;
+	m_monster_mesh_list = new list<MonsterMeshData*>;
+	
+	TiXmlDocument doc(pFilename);
+	bool loadOkay = doc.LoadFile();
+	
+	if (loadOkay)
+	{
+		DEBUG5("Loading %s", pFilename);
+		searchMonsterMeshData(&doc);
+		DEBUG5("Loading %s finished", pFilename);
+		return m_monster_mesh_list;
+	}
+	else
+	{
+		DEBUG("Failed to load file %s", pFilename);
+		return 0;
+	}
+}
+
--- a/src/core/objectloader.h	Fri Oct 03 10:53:18 2008 +0000
+++ b/src/core/objectloader.h	Fri Oct 03 14:10:18 2008 +0000
@@ -12,6 +12,24 @@
 #include <cstring>
 using namespace std;
 
+/**
+ * \struct ItemMeshData
+ * \brief Enthaelt die Daten, die zum Laden des Meshs fuer ein Monster notwendig sind
+ */
+struct MonsterMeshData
+{
+	/**
+	 * \var string m_subtype
+	 * \brief Subtyp des Monsters
+	 */
+	string m_subtype;
+	
+	/**
+	 * \var string m_mesh
+	 * \brief Name des Meshes
+	 */
+	string m_mesh;
+};
 
 /**
  * \class ObjectLoader
@@ -29,6 +47,13 @@
 	 */
 	list<MonsterBasicData*>* loadObjects(const char* pFilename);
 	
+	/**
+	 * \fn void loadMonsterMeshData(const char* pFilename)
+	 * \brief Sorgt fuer das Anlegen von MonsterMeshData, die in einer XML-Datei gespeichert sind
+	 * \param pFilename Pfad zu einer XML-Datei, die Monster enthaelt
+	 * \return Liste der geladenen Monster
+	 */
+	list<MonsterMeshData*>* loadMonsterMeshData(const char* pFilename);
 	
 	private:
 	
@@ -48,10 +73,29 @@
 	 */
 	void searchXml(TiXmlNode* pParent);
 	
+	/**
+	 * \fn int generateMonsterMeshData(TiXmlElement* pElement, string element)
+	 * \brief Legt ItemMonsterData im Speicher anhand von Daten an, die als Parameter uebergeben wurden. Diese Daten stammen aus einer XML-Datei.
+	 * \param pElement Zeiger auf ein Element der XML-Datei
+	 * \param element Name des Elements
+	 * \return Anzahl der Attribute des bearbeiteten Elements
+	 */
+	int generateMonsterMeshData(TiXmlElement* pElement, string element);
+	
+	/**
+	 * \fn void searchMonsterMeshData( TiXmlNode* pParent )
+	 * \brief Durchmustert eine XML-Datei und sucht nach Elementen.
+	 * \param pParent Zeiger auf eine XML-Datei
+	 */
+	void searchMonsterMeshData(TiXmlNode* pParent);
+	
 	
 	MonsterBasicData* m_monster_data;
 	list<MonsterBasicData*>* m_monster_list;
 	
+	MonsterMeshData* m_monster_mesh_data;
+	list<MonsterMeshData*>* m_monster_mesh_list;
+	
 	float m_size_prob[4];
 	int m_min_level[2];
 	int m_max_level[2];
--- a/src/gui/scene.cpp	Fri Oct 03 10:53:18 2008 +0000
+++ b/src/gui/scene.cpp	Fri Oct 03 14:10:18 2008 +0000
@@ -1,6 +1,6 @@
 #include "scene.h"
-#include "itemloader.h"
 
+#define USE_OBJECTLOADER
 #define USE_ITEMLOADER
 
 Scene::Scene(Document* doc,Ogre::RenderWindow* window)
@@ -56,7 +56,42 @@
 	registerObject("archer","warrior.mesh",""); // TODO
 
 	// Monster
+#ifdef USE_OBJECTLOADER
+	// Monster Meshes aus XML-Datei Laden
+	ObjectLoader* objectloader = 0;
+	objectloader = new ObjectLoader;
+	
+	list<MonsterMeshData*>* monster_mesh_list;
+	monster_mesh_list = objectloader->loadMonsterMeshData("../../data/monsters.xml");
+	
+	if (monster_mesh_list != 0)
+	{
+		// Daten auslesen und registrieren
+		list<MonsterMeshData*>::iterator iter = monster_mesh_list->begin();
+		while (iter != monster_mesh_list->end())
+		{
+			registerObject((*iter)->m_subtype, (*iter)->m_mesh, "");
+			*iter++;
+		}
+		
+		// Liste aus Speicher loeschen
+		iter = monster_mesh_list->begin();
+		while (iter != monster_mesh_list->end())
+		{
+			delete *iter;
+			*iter++;
+		}
+	}
+	
+	delete monster_mesh_list;
+	monster_mesh_list = 0;
+	delete objectloader;
+	objectloader = 0;
+#endif
+
+#ifndef USE_OBJECTLOADER
 	registerObject("goblin","goblin.mesh","");
+#endif
 	registerObject("gob_dog","gobDog.mesh","");
 	registerObject("lich","lich.mesh","");
 
--- a/src/gui/scene.h	Fri Oct 03 10:53:18 2008 +0000
+++ b/src/gui/scene.h	Fri Oct 03 14:10:18 2008 +0000
@@ -5,6 +5,8 @@
 #include "Ogre.h"
 #include <string>
 
+#include "itemloader.h"
+#include "objectloader.h"
 #include "document.h"
 #include "serverwobject.h"
 // TODO : include anpassen (es wird nur ein Spieler allgemein benoetigt)