- <span style="font-family: Arial, Helvetica, sans-serif;">tinyxml是c++中用来解析xml的工具库</span>
- #ifndef __ROLE_CAREER_LEVEL_NUMTABLE_H__
- #define __ROLE_CAREER_LEVEL_NUMTABLE_H__
- #include "../../../common/tinyxml/tinyxml.h"
- #include "../../../serverinterface/protos/base_structure.pb.h"
- #include <boost/lexical_cast.hpp>
- #include "../../../common/CommonFunc.h"
- using namespace std;
- using namespace google::protobuf;
- using namespace zhanjia::net::message;
- using namespace CommonFunc;
- class RoleCareerLevelNumTable
- {
- public:
- RoleCareerLevelNumTable()
- {
- }
- ~RoleCareerLevelNumTable()
- {
- TypeCareerLevelTemplates::iterator it = _careerLevelTemplates.begin();
- for (;it != _careerLevelTemplates.end(); it++)
- {
- delete *it;
- }
- }
- void LoadXML()
- {
- const char* path = "../../configs/gameserver/role/career_level_numerical_table.xml";
- bool flag = _doc.LoadFile(path);
- if (!flag)
- {
- LOG(ERROR) << "Error:load " << path << " failed:" << _doc.ErrorDesc();
- throw new std::exception();
- }
- }
- // 加载career_level_numberical_table.xml到_careerLevelTemplates
- void ReadCareerLevelAttrToTemplates()
- {
- TiXmlElement *careerXml, *levelXml, *root = _doc.RootElement();
- TiXmlNode *careerNode, *levelNode;
- int careerId, attr, maxLevel;
- const char *attrStr = NULL;
- _maxLevel = CheckAndGetAttributeValue<int>(root, "maxLevel");
- careerNode = root->FirstChild("Career");
- while (careerNode)
- {
- careerXml = careerNode->ToElement();
- careerId = CheckAndGetAttributeValue<int>(careerXml, "id");
- levelNode = careerXml->FirstChild("Level");
- while (levelNode)
- {
- levelXml = levelNode->ToElement();
- PbMsgRoleInfo* roleInfo = new PbMsgRoleInfo();
- roleInfo->set_careerid(careerId);
- attr = CheckAndGetAttributeValue<int>(levelXml, "value");
- roleInfo->set_level(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "strength");
- roleInfo->set_strength(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "agile");
- roleInfo->set_agile(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "physical");
- roleInfo->set_physical(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "lucky");
- roleInfo->set_lucky(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "attack");
- roleInfo->set_attack(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "defensive");
- roleInfo->set_defensive(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "hpMax");
- roleInfo->set_hpmax(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "accuracy");
- roleInfo->set_accuracy(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "dodge");
- roleInfo->set_dodge(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "crit");
- roleInfo->set_crit(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "iceAtt");
- roleInfo->set_iceatt(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "iceDef");
- roleInfo->set_icedef(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "fireAtt");
- roleInfo->set_fireatt(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "fireDef");
- roleInfo->set_firedef(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "lightAtt");
- roleInfo->set_lightatt(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "lightDef");
- roleInfo->set_lightdef(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "darkAtt");
- roleInfo->set_darkatt(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "darkDef");
- roleInfo->set_darkdef(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "speed");
- roleInfo->set_speed(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "attSpeed");
- roleInfo->set_attspeed(attr);
- attr = CheckAndGetAttributeValue<int>(levelXml, "expMax");
- roleInfo->set_expmax(attr);
- _careerLevelTemplates.push_back(roleInfo);
- levelNode = levelNode->NextSibling("Level");
- }
- careerNode = careerNode->NextSibling("Career");
- }
- if (_careerLevelTemplates.empty())
- {
- LOG(ERROR) << "Error:career_level_numerical_table.xml is empty!" ;
- throw new std::exception();
- }
- }
- // 加载careerId的Level职业等级信息
- const PbMsgRoleInfo* LoadCareerLevelAttr(int careerId, int level)
- {
- TypeCareerLevelTemplates::iterator it = _careerLevelTemplates.begin();
- for (;it != _careerLevelTemplates.end(); it++)
- {
- // 查找到指定职业和等级的属性信息
- if (((*it)->careerid() == careerId) && ((*it)->level() == level) )
- {
- return *it;
- }
- }
- LOG(ERROR) <<" Error:Can't find careerId or level! ";
- return 0;
- }
- private:
- // 检查属性是否存在且为数字
- int CheckAttrVaild(const char* attrName, const char* attrStr)
- {
- if (!attrStr)
- {
- LOG(ERROR) << "Error: "<< attrName <<" is invalid!";
- throw new std::exception();
- }
- try
- {
- return boost::lexical_cast<int>(attrStr);
- }
- catch (boost::bad_lexical_cast& e)
- {
- LOG(ERROR) << "Error:"<< attrName <<" is not number!";
- throw new std::exception();
- }
- }
- private:
- typedef vector<PbMsgRoleInfo*> TypeCareerLevelTemplates;
- TiXmlDocument _doc;
- TypeCareerLevelTemplates _careerLevelTemplates;
- int _maxLevel;
- public:
- inline int getMaxLevel(){return _maxLevel;}
- };
- #endif
附上xml
- <?xml version="1.0" encoding="utf-8"?>
- <CareerLevelTable maxLevel="100">
- <Career id="431100">
- <Level value="1" expMax="100" strength="1" agile="1" physical="1" lucky="1" attack="30" defensive="10" hpMax="140" accuracy="90" dodge="50" crit="15" attSpeed="10" iceAtt="10" fireAtt="10" lightAtt="20" darkAtt="10" iceDef="10" fireDef="10" lightDef="15" darkDef="10" speed="180"/>
- <Level value="2" expMax="200" strength="3" agile="3" physical="3" lucky="3" attack="45" defensive="34" hpMax="171" accuracy="90" dodge="50" crit="24" attSpeed="11" iceAtt="15" fireAtt="15" lightAtt="30" darkAtt="15" iceDef="15" fireDef="15" lightDef="23" darkDef="15" speed="180"/>
- </Career>
- </CareerLevelTable>