Mercurial > sumwars
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)