Exemplo n.º 1
0
int CreatureInfoMgr::LoadCreatureInfo()
{
	int ret = 0;
	xmlDocPtr doc;
	xmlNodePtr root;
	xmlNodePtr nodeCreature;
	int creatureCount = 0;
	char file[] = "./conf/angelfight/monsterinfo.xml";

	doc = xmlParseFile(file);
	if (!doc)
	{
		ERROR_RETURN( ( "CreatureInfoMgr::LoadCreatureInfo() Open [%s] Failed", file ), -1 );
	}

	root = xmlDocGetRootElement(doc);
	if ( !root )
	{
		ERROR_LOG("xmlDocGetRootElement error");
		ret = -1;
		goto exit;
	}
	//怪物总数
	DECODE_XML_PROP_INT( creatureCount, root, "Count" );
	if( creatureCount <= 0 )
	{
		goto exit;
	}

	m_vecCreatureInfo.clear();
	m_vecCreatureInfo.reserve(creatureCount);

	//获取子节点
	nodeCreature= root->xmlChildrenNode;
	while( nodeCreature )
	{
		CreatureInfo* pCreateure = NULL;
		if ( 0 == xmlStrcmp( nodeCreature->name, BAD_CAST"Monster" ) )
		{
			pCreateure = new CreatureInfo();
			pCreateure->m_nCreatureID = m_vecCreatureInfo.size();
			m_vecCreatureInfo.push_back(pCreateure);

			xmlChar* str;

			int ID;

			DECODE_XML_PROP_INT( ID, nodeCreature, "ID" );
			if( ID != pCreateure->m_nCreatureID )
			{
				ERROR_LOG( "Creature ID Invalid The Value is:[%d] Expect:[%u]", ID, pCreateure->m_nCreatureID );
			}

			str = xmlGetProp( nodeCreature, BAD_CAST"Level" );
			pCreateure->XmlSetLevel( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Str" );
			pCreateure->XmlSetStr( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Int" );
			pCreateure->XmlSetInt( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Hab" );
			pCreateure->XmlSetHabitus( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Ali" );
			pCreateure->XmlSetAgile( (char*)str );
			xmlFree(str);

			str = xmlGetProp( nodeCreature, BAD_CAST"Atk" );
			pCreateure->XmlSetAtk( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Aspd" );
			pCreateure->XmlSetAspd( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Evad" );
			pCreateure->XmlSetEvad( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Block" );
			pCreateure->XmlSetBlock( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Crit" );
			pCreateure->XmlSetCrit( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Hit" );
			pCreateure->XmlSetHit( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Combo" );
			pCreateure->XmlSetCombo( (char*)str );
			xmlFree(str);
			str = xmlGetProp( nodeCreature, BAD_CAST"Def" );
			pCreateure->XmlSetDef( (char*)str );
			xmlFree(str);

			str = xmlGetProp( nodeCreature, BAD_CAST"IsBoss" );
			pCreateure->XmlSetIsBoss( (char*)str );
			xmlFree(str);

			xmlNodePtr child = nodeCreature->xmlChildrenNode;
			while( child )
			{
				if( 0 == xmlStrcmp( child->name, BAD_CAST"Skill" ) )
				{
					str = xmlGetProp( child, BAD_CAST"ID" );
					pCreateure->XmlAddSkill( (char*)str );
				}
				else if( 0 == xmlStrcmp( child->name, BAD_CAST"Drop" ) )
				{
					str = xmlGetProp( child, BAD_CAST"ID" );
					pCreateure->XmlAddItem( (char*)str );
				}
				child = child->next;
			}
		}
		nodeCreature = nodeCreature->next;
	}
exit:
	xmlFreeDoc(doc);

	DEBUG_LOG( "Load Creature Info Over Creature Size Is:[%lu]", m_vecCreatureInfo.size() );
	return ret;
}