changeset 14:c0da8ff7daeb

Meshes werden aus XML laden
author kemic
date Wed, 01 Oct 2008 16:23:47 +0000
parents 408853e127e9
children c821f69fc167
files data/items.xml src/core/itemfactory.cpp src/core/itemloader.cpp src/core/itemloader.h src/core/objectfactory.cpp src/gui/scene.cpp
diffstat 6 files changed, 236 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/data/items.xml	Wed Oct 01 11:49:54 2008 +0000
+++ b/data/items.xml	Wed Oct 01 16:23:47 2008 +0000
@@ -33,12 +33,12 @@
 		dmagic_power="short"
 		dwillpower="short"
 		dresistances_physical="short"
+		dresistances_cap_physical="short"
 		dresistances_air="short"
+		dresistances_cap_air="short"
 		dresistances_ice="short"
+		dresistances_cap_ice="short"
 		dresistances_fire="short"
-		dresistances_cap_physical="short"
-		dresistances_cap_air="short"
-		dresistances_cap_ice="short"
 		dresistances_cap_fire="short"
 		dwalk_speed="short"
 		dattack_speed="short"
@@ -86,10 +86,10 @@
 	<EquipEffect />
 	<WeaponAttribute
 		damage_min_physical="5"
-		damage_max_physical="10"
+		damage_max_physical="12"
 		damage_attack="20"
 		damage_power="30"
-		attack_range="1.0"
+		attack_range="1.4"
 		two_handed="no"
 		dattack_speed="500"
 	/>
--- a/src/core/itemfactory.cpp	Wed Oct 01 11:49:54 2008 +0000
+++ b/src/core/itemfactory.cpp	Wed Oct 01 16:23:47 2008 +0000
@@ -1,4 +1,5 @@
 #include "itemfactory.h"
+#include "itemloader.h"
 
 #define USE_ITEMLOADER
 
@@ -612,13 +613,13 @@
 	list<ItemBasicData*>* item_list;
 	item_list = itemloader->loadItemBasicData("../../data/items.xml");
 	
-	// Debugging: Anzeigen der geladenen Items
-	/*
 	if (item_list != 0)
 	{
 		list<ItemBasicData*>::iterator iter = item_list->begin();
 		while (iter != item_list->end())
 		{
+			// Debugging: Anzeigen der geladenen Items
+			/*
 			cout << "m_useup_effect" << " = " << (*iter)->m_useup_effect << endl;
 			cout << "m_equip_effect" << " = " << (*iter)->m_equip_effect << endl;
 			cout << "m_weapon_attr" << " = " << (*iter)->m_weapon_attr << endl;
@@ -644,27 +645,41 @@
 			cout << "m_min_enchant" << " = " << (*iter)->m_min_enchant << endl;
 			cout << "m_max_enchant" << " = " << (*iter)->m_max_enchant << endl;
 			cout << "------------------------------------------------" << endl;
-			
+			*/
 			registerItem((*iter)->m_type, (*iter)->m_subtype, *iter);
 			*iter++;
 		}
 	}
-	*/
+	
 	
 	list<DropChanceData*>* drop_chance_list;
 	drop_chance_list = itemloader->loadDropChanceData("../../data/items.xml");
 	
 	if (drop_chance_list != 0)
 	{
+		// Daten auslesen und registrieren
 		list<DropChanceData*>::iterator iter = drop_chance_list->begin();
 		while (iter != drop_chance_list->end())
 		{
 			registerItemDrop( (*iter)->m_type, (*iter)->m_subtype, DropChance( (*iter)->m_level, (*iter)->m_probability, (*iter)->m_size) );
 			*iter++;
 		}
+		
+		// Liste aus Speicher loeschen
+		iter = drop_chance_list->begin();
+		while (iter != drop_chance_list->end())
+		{
+			delete *iter;
+			*iter++;
+		}
 	}
 	
+	delete item_list;
+	item_list = 0;
+	delete drop_chance_list;
+	drop_chance_list = 0;
 	delete itemloader;
+	itemloader = 0;
 #endif
 
 #ifndef USE_ITEMLOADER
--- a/src/core/itemloader.cpp	Wed Oct 01 11:49:54 2008 +0000
+++ b/src/core/itemloader.cpp	Wed Oct 01 16:23:47 2008 +0000
@@ -104,6 +104,61 @@
 		
 		while (element == "EquipEffect" && pAttrib)
 		{
+			if (!strcmp(pAttrib->Name(), "darmor") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_darmor = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dblock") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dblock = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dmax_health") && pAttrib->QueryDoubleValue(&dval) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dmax_health = static_cast<float>(dval);
+			else if (!strcmp(pAttrib->Name(), "dattack") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dattack = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dstrength") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dstrength = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "ddexterity") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_ddexterity = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dmagic_power") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dmagic_power = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dwillpower") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dwillpower = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_physical") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances[Damage::PHYSICAL] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_air") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances[Damage::AIR] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_ice") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances[Damage::ICE] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_fire") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances[Damage::FIRE] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_cap_physical") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances_cap[Damage::PHYSICAL] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_cap_air") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances_cap[Damage::AIR] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_cap_ice") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances_cap[Damage::ICE] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dresistances_cap_fire") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dresistances_cap[Damage::FIRE] = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dwalk_speed") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dwalk_speed = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "dattack_speed") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_dattack_speed = static_cast<short>(ival);
+			else if (!strcmp(pAttrib->Name(), "xspecial_flags") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_xspecial_flags = ival;
+			else if (!strcmp(pAttrib->Name(), "time") && pAttrib->QueryDoubleValue(&dval) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_time = static_cast<float>(dval);
+			else if (!strcmp(pAttrib->Name(), "xabilities0") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_xabilities[0] = ival;
+			else if (!strcmp(pAttrib->Name(), "xabilities1") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_xabilities[1] = ival;
+			else if (!strcmp(pAttrib->Name(), "xabilities2") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_xabilities[2] = ival;
+			else if (!strcmp(pAttrib->Name(), "xabilities3") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_xabilities[3] = ival;
+			else if (!strcmp(pAttrib->Name(), "xabilities4") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_xabilities[4] = ival;
+			else if (!strcmp(pAttrib->Name(), "xabilities5") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_xabilities[5] = ival;
+			else if (!strcmp(pAttrib->Name(), "ximmunity") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
+				m_item_data->m_equip_effect->m_ximmunity = static_cast<char>(ival);
+			
 			i++;
 			pAttrib=pAttrib->Next();
 		}
@@ -155,7 +210,6 @@
 	
 	if (element == "Attribute" && pAttrib)
 	{
-	
 		while (element == "Attribute" && pAttrib)
 		{
 			if (!strcmp(pAttrib->Name(), "level_requirement") && pAttrib->QueryIntValue(&ival) == TIXML_SUCCESS)
@@ -414,18 +468,126 @@
 	}
 }
 
+//##############################################################################
 
+int ItemLoader::generateItemMeshData(TiXmlElement* pElement, string element)
+{
+	if ( !pElement ) return 0;
+	
+	TiXmlAttribute* pAttrib=pElement->FirstAttribute();
+	int i=0;
+	int ival;
+	double dval;
+	
+	if (element == "Item" && pAttrib)
+	{
+		if (m_item_mesh_data == 0)
+		{
+			m_item_mesh_data = new ItemMeshData;
+		}
+		
+		while (element == "Item" && pAttrib)
+		{
+			if (!strcmp(pAttrib->Name(), "subtype"))
+				m_item_mesh_data->m_subtype = pAttrib->Value();
+			
+			i++;
+			pAttrib=pAttrib->Next();
+		}
+	}
+	
+	if (element == "Mesh" && pAttrib)
+	{
+		while (element == "Mesh" && pAttrib)
+		{
+			if (!strcmp(pAttrib->Name(), "file"))
+				m_item_mesh_data->m_mesh = pAttrib->Value();
+			
+			i++;
+			pAttrib=pAttrib->Next();
+		}
+	}
+	
+	return i;
+}
+
+
+void ItemLoader::searchItemMeshData(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 = generateItemMeshData(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())
+	{
+		searchItemMeshData(pChild);
+		
+		if ( !strcmp(pChild->Value(), "Item") && pChild->Type() == TiXmlNode::ELEMENT)
+		{
+			m_item_mesh_list->push_back(m_item_mesh_data);
+			m_item_mesh_data = 0;
+			DEBUG5("Item Mesh loaded");
+		}
+	}
+}
+
+
+list<ItemMeshData*>* ItemLoader::loadItemMeshData(const char* pFilename)
+{
+	m_item_mesh_data = 0;
+	m_item_mesh_list = new list<ItemMeshData*>;
+	
+	TiXmlDocument doc(pFilename);
+	bool loadOkay = doc.LoadFile();
+	
+	if (loadOkay)
+	{
+		DEBUG5("Loading %s", pFilename);
+		searchItemMeshData(&doc);
+		DEBUG5("Loading %s finished", pFilename);
+		return m_item_mesh_list;
+	}
+	else
+	{
+		DEBUG("Failed to load file %s", pFilename);
+		return 0;
+	}
+}
 
 
 
 
 ItemLoader::~ItemLoader()
 {
-	for (list<DropChanceData*>::iterator iter = m_drop_chance_data_list->begin(); iter != m_drop_chance_data_list->end(); iter++)
-	{
-		delete (*iter);
-	}
-	delete m_drop_chance_data_list;
-	m_drop_chance_data_list = 0;
+	// FIXME Löschen der Listen erfolgt nach dem Aufruf der Methoden manuell
+	//       in der rufenden Funktion. Dies eventuell hier implementieren.
+	//       Daten in m_item_list (list<ItemBasicData*>) duerfen nicht geloescht
+	//       werden!
 }
 
--- a/src/core/itemloader.h	Wed Oct 01 11:49:54 2008 +0000
+++ b/src/core/itemloader.h	Wed Oct 01 16:23:47 2008 +0000
@@ -123,8 +123,8 @@
 	DropChanceData* m_drop_chance_data;
 	list<DropChanceData*>* m_drop_chance_data_list;
 	
-	//ItemMeshData* m_item_data;
-	//list<ItemMeshData*>* m_item_list;
+	ItemMeshData* m_item_mesh_data;
+	list<ItemMeshData*>* m_item_mesh_list;
 	
 	float m_weapon_mod[31];
 };
--- a/src/core/objectfactory.cpp	Wed Oct 01 11:49:54 2008 +0000
+++ b/src/core/objectfactory.cpp	Wed Oct 01 16:23:47 2008 +0000
@@ -50,7 +50,10 @@
 		}
 	}
 	
+	delete monster_list;
+	monster_list = 0;
 	delete objectloader;
+	objectloader = 0;
 #endif
 
 #ifndef USE_OBJECTLOADER
--- a/src/gui/scene.cpp	Wed Oct 01 11:49:54 2008 +0000
+++ b/src/gui/scene.cpp	Wed Oct 01 16:23:47 2008 +0000
@@ -1,4 +1,7 @@
 #include "scene.h"
+#include "itemloader.h"
+
+#define USE_ITEMLOADER
 
 Scene::Scene(Document* doc,Ogre::RenderWindow* window)
 {
@@ -91,7 +94,42 @@
 	registerProjectile(Projectile::HYPNOSIS,"","Hypnosis");
 
 	// Items
+#ifdef USE_ITEMLOADER
+	// Item Meshes aus XML-Datei Laden
+	ItemLoader* itemloader = 0;
+	itemloader = new ItemLoader;
+	
+	list<ItemMeshData*>* item_mesh_list;
+	item_mesh_list = itemloader->loadItemMeshData("../../data/items.xml");
+	
+	if (item_mesh_list != 0)
+	{
+		// Daten auslesen und registrieren
+		list<ItemMeshData*>::iterator iter = item_mesh_list->begin();
+		while (iter != item_mesh_list->end())
+		{
+			registerItem((*iter)->m_subtype, (*iter)->m_mesh);
+			*iter++;
+		}
+		
+		// Liste aus Speicher loeschen
+		iter = item_mesh_list->begin();
+		while (iter != item_mesh_list->end())
+		{
+			delete *iter;
+			*iter++;
+		}
+	}
+	
+	delete item_mesh_list;
+	item_mesh_list = 0;
+	delete itemloader;
+	itemloader = 0;
+#endif
+
+#ifndef USE_ITEMLOADER
 	registerItem("short_sw","sword.mesh");
+#endif
 	registerItem("long_sw","sword.mesh");
 	registerItem("wood_bow","sword.mesh");
 	registerItem("long_bow","sword.mesh");
@@ -114,8 +152,6 @@
 	registerItem("heal_2","potion.mesh");
 	registerItem("heal_bl","potion.mesh");
 	registerItem("heal_fr","potion.mesh");
-
-
 }
 
 void Scene::registerObject(WorldObject::TypeInfo::ObjectSubtype subtype, std::string mesh, std::string particle_system, float scaling_factor)