/// 从文件加载统邮件配置 bool MailList::LoadSysMailList(const char* pFileName) { Release(); CRFile *prfile = rfOpen(pFileName); if(NULL == prfile) return false; TiXmlNode *pNode = NULL; TiXmlDocument doc(pFileName); //载入技能配置文件 doc.LoadData(prfile->GetData(), prfile->GetDatalen()); rfClose(prfile); //取得第一个节点 pNode = doc.FirstChild("Mail"); if (NULL == pNode) { return false; } TiXmlElement *pElem = pNode->ToElement(); if(LoadSysMailList(pElem)) { return true; } else { return false; } }
// 初始化,读XML配置文件 bool CChangeOccu::Init(const char *filename) { if(filename) { m_vecSubOccu.clear(); //=================================================================// CRFile *prfile = rfOpen(filename); if(NULL == prfile) { //输出错误信息 Log4c::Error(ROOT_MODULE,"%-15s LoadFileError:%s",__FUNCTION__,filename); return false; } TiXmlNode *pNode = NULL; TiXmlDocument m_Tdoc(filename); //载入技能配置文件 if( !m_Tdoc.LoadData(prfile->GetData(),prfile->GetDatalen()) ) { //输出错误信息 rfClose(prfile); return false; } rfClose(prfile); //=================================================================// //找到根节点,如果无节点,输出错误提示 pNode = m_Tdoc.FirstChild("ChangeOccu"); if (pNode==NULL) { return false; } //类型转换 TiXmlElement* pElem = pNode->ToElement(); // 便利子节点,设置属性 for (TiXmlElement *pOccuElem=pElem->FirstChildElement(); pOccuElem!=NULL; pOccuElem=pOccuElem->NextSiblingElement()) { if(!strcmp(pOccuElem->Value(),"Occu") && NULL!=pOccuElem->Attribute("name") && NULL!=pOccuElem->Attribute("id") && NULL!=pOccuElem->Attribute("parentid") && NULL!=pOccuElem->Attribute("value") && NULL!=pOccuElem->Attribute("goods") && NULL!=pOccuElem->Attribute("goodsNum")) { tagChangeOccu stChangeOccu; stChangeOccu.strName = pOccuElem->Attribute("name"); stChangeOccu.strGoodsName = pOccuElem->Attribute("goods"); stChangeOccu.nID = atoi(pOccuElem->Attribute("id")); stChangeOccu.nParentID = atoi(pOccuElem->Attribute("parentid")); stChangeOccu.nValue = atoi(pOccuElem->Attribute("value")); stChangeOccu.lGoodsNum = atoi(pOccuElem->Attribute("goodsNum")); m_vecSubOccu.push_back(stChangeOccu); } } return true; } return false; }
// 初始化,读XML配置文件 bool COccupSkillList::Init(const char *filename) { if(!filename) return false; Release(); //=================================================================// CRFile *prfile = rfOpen(filename); if(NULL == prfile) { //输出错误信息 Log4c::Error(ROOT_MODULE,"%-15s LoadFileError:%s",__FUNCTION__,filename); return false; } TiXmlNode *pNode = NULL; TiXmlDocument m_Tdoc(filename); //载入技能配置文件 if( !m_Tdoc.LoadData(prfile->GetData(),prfile->GetDatalen()) ) { //输出错误信息 Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__,FormatText("WS_SKILL_FOURTH",filename)); rfClose(prfile); return false; } rfClose(prfile); //=================================================================// //找到根节点,如果无节点,输出错误提示 pNode = m_Tdoc.FirstChild("OccupSkillList"); if (pNode==NULL) { Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__,GetText("WS_SKILL_SEVENTH")); return false; } //类型转换 TiXmlElement* pElem = pNode->ToElement(); // 便利子节点,设置属性 for (TiXmlElement *pChildElem=pElem->FirstChildElement(); pChildElem!=NULL; pChildElem=pChildElem->NextSiblingElement()) { if(!strcmp(pChildElem->Value(),"Occup") && NULL!=pChildElem->Attribute("name") && NULL!=pChildElem->Attribute("ID")) { COccupSkill * pOccupSkill = new COccupSkill; pOccupSkill->SetName(pChildElem->Attribute("name")); pOccupSkill->SetOccupId((long)atoi(pChildElem->Attribute("ID"))); // 职业描述 if(NULL!=pChildElem->Attribute("Desc")) { pOccupSkill->SetDesc(pChildElem->Attribute("Desc")); } // 读每个职业的技能列表 if(pOccupSkill->Init(pChildElem)) m_OccupSkillList.push_back(pOccupSkill); // 读取职业技能列表失败 else { delete pOccupSkill; pOccupSkill = NULL; } } } m_Tdoc.Clear(); return true; }
// 解析XML中关于复活物品的配置 bool CReLiveGoodsList::Init(const char *filename) { if (NULL==filename) { return false; } char strError[128]; //=================================================================// CRFile *prfile = rfOpen(filename); if(NULL == prfile) { //输出错误信息 _snprintf(strError, 128, "LoadFileError:%s",filename); MessageBox(NULL,strError,"",MB_OK); return false; } TiXmlNode *pNode = NULL; TiXmlDocument m_Tdoc(filename); //载入复活物品配置文件 if( !m_Tdoc.LoadData(prfile->GetData(),prfile->GetDatalen()) ) { //输出错误信息 _snprintf(strError, 128, CStringReading::LoadString(IDS_WS_SKILL,STR_WS_SKILL_FOURTH),filename); MessageBox(NULL,strError,"",MB_OK); rfClose(prfile); return false; } rfClose(prfile); //=================================================================// //找到根节点,如果无节点,输出错误提示 pNode = m_Tdoc.FirstChild("Goods"); if (pNode==NULL) { string strNode = "Goods"; _snprintf(strError, 128, CStringReading::LoadString(IDS_WS_SKILL,STR_WS_SKILL_FIFTH),filename,strNode.c_str()); MessageBox(NULL,strError,"",MB_OK); return false; } TiXmlElement* pElem = pNode->ToElement(); for (TiXmlElement *pChildElem=pElem->FirstChildElement(); pChildElem!=NULL; pChildElem=pChildElem->NextSiblingElement()) { if (!stricmp(pChildElem->Value(),"ReLiveGoods")) { tagReLiveGoods *ptgReliveGoods = new tagReLiveGoods; ptgReliveGoods->strOrignalName = pChildElem->Attribute("OrignalName"); ptgReliveGoods->dwIndex = (DWORD)atol(pChildElem->Attribute("Index")); ptgReliveGoods->dwNum = (DWORD)atol( pChildElem->Attribute("GoodsNum")); ptgReliveGoods->dwRecoverRatio = (DWORD)atol(pChildElem->Attribute("RecoverRatio")); m_lReLiveGoods.push_back(ptgReliveGoods); } else if(!stricmp(pChildElem->Value(),"ExpGoods")) { tagExpGoods *ptgExpGoods = new tagExpGoods; string strOrgName = pChildElem->Attribute("OrignalName"); ptgExpGoods->dwExpRatio = atoi(pChildElem->Attribute("ExpRatio")); if (pChildElem->Attribute("Script")) { ptgExpGoods->strScript = pChildElem->Attribute("Script"); } if (pChildElem->Attribute("Hint")) { ptgExpGoods->strHint = pChildElem->Attribute("Hint"); } map<string,tagExpGoods*>::iterator it = m_mpExpGoods.find(strOrgName); if (it!=m_mpExpGoods.end()) { SAFE_DELETE(ptgExpGoods); } else { m_mpExpGoods[strOrgName] = ptgExpGoods; } } } return true; }
long PhaseSetup::Load() { Release(); const char* rfile = "data/PhaseSetup.xml"; CRFile* prFile = rfOpen( rfile ); if ( prFile == NULL ) { Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__, "Load PhaseSetup.xml failed "); return 0; } TiXmlDocument doc(rfile); doc.LoadData( prFile->GetData() , prFile->GetDatalen() ); rfClose( prFile ); TiXmlElement* pRoot = doc.RootElement(); if ( pRoot == NULL ) return 0; TiXmlElement* pBaseElem = pRoot->FirstChildElement( "Base" ); if ( pBaseElem == NULL ) { Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__, "Load PhaseSetup.xml Base Node failed "); } else { XML_QUERY_NUM( "Agonal", m_config.lAgonal, pBaseElem , long ); XML_QUERY_NUM( "HpNum", m_config.lHpNum , pBaseElem , long ); XML_QUERY_NUM( "DropGoodNum",m_config.lDropGoodNum,pBaseElem,long); XML_QUERY_NUM( "IsOpen", m_config.lIsOpen , pBaseElem , long ); } TiXmlElement* pPhaseElem = pRoot->FirstChildElement("PhaseSetup"); if ( pPhaseElem == NULL ) { Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__, "Load PhaseSetup Node Failed!" ); } else { long type = 0 ; PhaseTable tpTemp; /// PlayerOper; TiXmlElement* pOper = pPhaseElem->FirstChildElement("PlayerOper"); if( pOper == NULL ) { Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__,"Load PlayerOper Node Failed!" ); return 0; } XML_QUERY_NUM( "type", type , pOper, long ); tpTemp.clear(); for ( TiXmlElement* pEvent = pOper->FirstChildElement("Event"); pEvent != NULL ; pEvent = pEvent->NextSiblingElement()) { const char *file = NULL; int id = 0; XML_QUERY_NUM( "id", id, pEvent, long ); XML_QUERY_STR( "script", file, pEvent ); tpTemp.insert( std::pair<long,std::string>( id, file) ) ; } m_PhaseTable.insert( std::pair<long,PhaseTable>(type,tpTemp) ); /// PhaseTimeType TiXmlElement* TimeType= pPhaseElem->FirstChildElement("PhaseTimeType"); if( TimeType == NULL ) { Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__, "Load PhaseTimeType Node Failed!" ); return 0; } XML_QUERY_NUM( "type", type , TimeType, long ); tpTemp.clear(); for ( TiXmlElement* PhaseTime = TimeType->FirstChildElement("Event"); PhaseTime != NULL ; PhaseTime = PhaseTime->NextSiblingElement()) { const char *file = NULL; int id = 0; XML_QUERY_NUM( "id", id, PhaseTime, long ); XML_QUERY_STR( "script", file, PhaseTime ); tpTemp.insert( std::pair<long,std::string>( id, file) ) ; } m_PhaseTable.insert( std::pair<long,PhaseTable>(type,tpTemp) ); /// PhaseEvent TiXmlElement* Event= pPhaseElem->FirstChildElement("PhaseEvent"); if( Event == NULL ) { Log4c::Error(ROOT_MODULE,"%-15s %s",__FUNCTION__, "Load PhaseEvent Node Failed!" ); return 0; } XML_QUERY_NUM( "type", type , Event, long ); tpTemp.clear(); for ( TiXmlElement* Ent = Event->FirstChildElement("Event"); Ent != NULL ; Ent = Ent->NextSiblingElement()) { const char *file = NULL; int id = 0; XML_QUERY_NUM( "id", id, Ent, long ); XML_QUERY_STR( "script", file, Ent ); tpTemp.insert( std::pair<long,std::string>( id, file) ) ; } m_PhaseTable.insert( std::pair<long,PhaseTable>(type,tpTemp) ); } return 1; }
//! 读取配置 BOOL SpriteSystem::LoadSetup(void) { BOOL bReturnValue = TRUE; //! ----------------------------根节点---------------------------- TiXmlNode *pNode = NULL; CRFile* prFile = rfOpen("data/Sprite.xml"); if (prFile == NULL) { return FALSE; } TiXmlDocument* m_Tdoc = new TiXmlDocument; if(!m_Tdoc->LoadData(prFile->GetData(),prFile->GetDatalen())) return FALSE; rfClose(prFile); pNode=m_Tdoc->FirstChild("Sprite"); if (pNode==NULL) return FALSE; TiXmlElement* pSprite = pNode->ToElement();//获取node 的指针 if (pSprite==NULL) return FALSE; //! ----------------------------获取配置---------------------------- try { //! 自动补给物 TiXmlElement* pAutoSupplyGoods = pSprite->FirstChildElement("AutoSupplyGoods"); TiXmlElement* pGoods = pAutoSupplyGoods->FirstChildElement("Goods"); for (; pGoods!=NULL; pGoods = pGoods->NextSiblingElement()) { const char *pGoodsName = pGoods->Attribute("ItemName"); LONG lGoodsBaseIndex = CGoodsFactory::QueryGoodsIDByOriginalName(pGoodsName); if (0 == lGoodsBaseIndex) { AddErrorLogText("读取自动补给配置失败:没有找到原始名为[%s]的物品!!!", pGoodsName); bReturnValue = FALSE; continue; } if (c_mapCanUseGoodsIndex.end() != c_mapCanUseGoodsIndex.find(lGoodsBaseIndex)) { AddErrorLogText("读取自动补给配置失败:重复配置原始名为[%s]的物品!!!", pGoodsName); bReturnValue = FALSE; continue; } //! 物品应用范围 DWORD dwBound = 0; const char *pBound = pGoods->Attribute("Bound"); if (NULL == pBound) { AddErrorLogText("读取自动补给配置失败:原始名为[%s]的物品应用范围配置错误!!!", pGoodsName); bReturnValue = FALSE; continue; } LONG lBound = atoi(pBound); lBound = lBound % 10000; if(0 != lBound / 1000) dwBound |= eGAB_POWER; lBound = lBound % 1000; if(0 != lBound / 100) dwBound |= eGAB_SMP; lBound = lBound % 100; if(0 != lBound / 10) dwBound |= eGAB_MP; lBound = lBound % 10; if(0 != lBound) dwBound |= eGAB_HP; if(0 == dwBound) { AddErrorLogText("读取自动补给配置失败:原始名为[%s]的物品应用范围配置错误!!!", pGoodsName); bReturnValue = FALSE; continue; } c_mapCanUseGoodsIndex[lGoodsBaseIndex] = dwBound; } //加载战斗技能 TiXmlElement* pAutoFightSkills = pSprite->FirstChildElement("AutoFightSkills"); TiXmlElement* pFightSkills = pAutoFightSkills->FirstChildElement("Skills"); for (; pFightSkills != NULL; pFightSkills = pFightSkills->NextSiblingElement("Skills")) { const char* pSkillID = pFightSkills->Attribute("ID"); if (pSkillID == NULL) { AddErrorLogText("读取自动战斗技能配置失败:技能ID为[%s]配置错误!!!", pSkillID); bReturnValue = FALSE; continue; } LONG lID = atoi(pSkillID); if (FindExist(c_vectorCanUseFightSkill, lID)) { AddErrorLogText("读取自动使用战斗技能配置失败:重复配置技能ID为[%s]!!!", pSkillID); bReturnValue = FALSE; continue; } c_vectorCanUseFightSkill.push_back(lID); } //加载辅助技能 TiXmlElement* pAutoAssistSkills = pSprite->FirstChildElement("AutoAssistSkills"); TiXmlElement* pAssistSkills = pAutoAssistSkills->FirstChildElement("Skills"); for (; pAssistSkills != NULL; pAssistSkills = pAssistSkills->NextSiblingElement("Skills")) { const char* pSkillID = pAssistSkills->Attribute("ID"); if (pSkillID == NULL) { AddErrorLogText("读取自动使用辅助技能配置失败:技能ID为[%s]配置错误!!!", pSkillID); bReturnValue = FALSE; continue; } LONG lAssistID = atoi(pSkillID); if (FindExist(c_vectorCanUseAssistSkill, lAssistID)) { AddErrorLogText("读取自动使用辅助技能配置失败:重复配置技能ID为[%s]!!!", pSkillID); bReturnValue = FALSE; continue; } c_vectorCanUseAssistSkill.push_back(lAssistID); } //加载辅助道具 TiXmlElement* pAutoAssistGoods = pSprite->FirstChildElement("AutoAssistGoods"); TiXmlElement* pAssistGoods = pAutoAssistGoods->FirstChildElement("Goods"); for (; pAssistGoods != NULL; pAssistGoods = pAssistGoods->NextSiblingElement("Goods")) { const char* pGoodsName = pAssistGoods->Attribute("ItemName"); LONG lGoodsBaseIndex = CGoodsFactory::QueryGoodsIDByOriginalName(pGoodsName); if (lGoodsBaseIndex == 0) { AddErrorLogText("读取自动使用辅助道具配置失败:没有找到原始名为[%s]的物品道具!!!", pGoodsName); bReturnValue = FALSE; continue; } if (FindExist(c_vectorCanUseAssistGoods, lGoodsBaseIndex)) { AddErrorLogText("读取自动使用辅助道具配置失败:重复配置原始名为[%s]的物品!!!", pGoodsName); bReturnValue = FALSE; continue; } c_vectorCanUseAssistGoods.push_back(lGoodsBaseIndex); } } catch (...) { AddErrorLogText("在读取小精灵配置的时候发生了错误,读取失败,可能的原因是配置不当。"); if (NULL != m_Tdoc) { delete m_Tdoc; m_Tdoc = NULL; } return FALSE; } //! ----------------------------清除对象---------------------------- delete m_Tdoc; m_Tdoc = NULL; return bReturnValue; }
bool CConfiger::LoadShopList( const char *file ) { CRFile *prfile = rfOpen( file ); if( prfile == NULL ) { PutoutLog( LOG_FILE, LT_ERROR, "Load file %s failed.", file ); return false; } TiXmlDocument doc; if( !doc.LoadData( prfile->GetData(), prfile->GetDatalen() ) ) { PutoutLog( LOG_FILE, LT_ERROR, "Parse %s failed, invalid xml format.", file ); rfClose( prfile ); return false; } rfClose( prfile ); TiXmlElement *root = doc.RootElement(); { // global config TiXmlElement *node = root->FirstChildElement( "Global" ); QUERY_NUM( "goods_update_interval", m_GlobalCfg.uGoodsUpdateInter, node, unsigned long ); QUERY_NUM( "buy_count", m_GlobalCfg.lBuyCount, node, long ); QUERY_NUM( "enable", m_GlobalCfg.lEnable, node, long ); QUERY_NUM( "player_buy_count", m_GlobalCfg.lPlayerBuyCount, node, long ); char strCoinGoods[64]; QUERY_STR( "coin_goods", strCoinGoods, node ); m_GlobalCfg.lCoinGoodsIndex = CGoodsFactory::QueryGoodsIDByOriginalName( strCoinGoods ); } { // shop list TiXmlElement *shoplist_node = root->FirstChildElement( "ShopList" ); for( TiXmlElement *shop_node = shoplist_node->FirstChildElement(); shop_node != NULL; shop_node = shop_node->NextSiblingElement() ) { long id; QUERY_NUM( "id", id, shop_node, long ); if( m_ShopTable.find( id ) != m_ShopTable.end() ) { // more than 1 shop with the same id, ignore it. PutoutLog( LOG_FILE, LT_WARNING, "More than 1 shop with the same id [%d].", id ); continue; } Shop shop; QUERY_STR( "npc_orig_name", shop.npcOrigName, shop_node ); SellGoodsListT *pSellGoodsList = new SellGoodsListT(); shop.SellList = pSellGoodsList; for( TiXmlElement *goods_node = shop_node->FirstChildElement(); goods_node != NULL; goods_node = goods_node->NextSiblingElement() ) { SellGoods goods; char strOrigName[64]; QUERY_STR( "orig_name", strOrigName, goods_node ); goods.lIndex = CGoodsFactory::QueryGoodsIDByOriginalName( strOrigName ); pSellGoodsList->push_back( goods ); } m_ShopTable.insert( std::make_pair( id, shop ) ); } } return true; }