#include "stdafx.h" #include #include #include #include #include #include #include "tinyxml2.h" #include "Fish_OddsCFG.h" #include "FileEncrypt.h" std::auto_ptr Fish_OddsCFG::msSingleton(nullptr); int Fish_OddsCFG::GetCount() { return (int)mMapData.size(); } const Fish_OddsCFGData* Fish_OddsCFG::GetData(int ID) { auto it = mMapData.find(ID); if (it != mMapData.end()) { return &it->second; } return NULL; } boost::unordered_map& Fish_OddsCFG::GetMapData() { return mMapData; } void Fish_OddsCFG::Reload() { mMapData.clear(); Load(); } void Fish_OddsCFG::Load(const std::string& path) { std::ifstream readStream(path, std::ios::binary); if (!readStream.is_open()) { assert(false); return; } readStream.seekg(0, std::ios::end); int fileSize = readStream.tellg(); boost::shared_array buffer(new char[fileSize+1]); buffer.get()[fileSize] = '\0'; readStream.seekg(0, std::ios::beg); readStream.read(buffer.get(), fileSize); readStream.close(); FileEncrypt::decryptBuffer( buffer, fileSize ); tinyxml2::XMLDocument xmlDoc; auto result = xmlDoc.Parse(buffer.get(), fileSize); if (result != tinyxml2::XML_SUCCESS) { assert(false); return; } auto root = xmlDoc.RootElement(); if (root == NULL) { assert(false); return; } auto element = root->FirstChildElement("Data"); while (element != NULL) { Fish_OddsCFGData data; data.mID = element->IntAttribute("ID"); data.mFishName = element->Attribute("FishName"); { const char* HitRate = element->Attribute("HitRate"); std::vector vecHitRate; boost::split(vecHitRate, HitRate, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRate.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRate[i].c_str(), &temp)) { data.mHitRate.push_back(temp); } } } { const char* HitRateHeaven = element->Attribute("HitRateHeaven"); std::vector vecHitRateHeaven; boost::split(vecHitRateHeaven, HitRateHeaven, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRateHeaven.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRateHeaven[i].c_str(), &temp)) { data.mHitRateHeaven.push_back(temp); } } } { const char* HitRateHeavenBuff = element->Attribute("HitRateHeavenBuff"); std::vector vecHitRateHeavenBuff; boost::split(vecHitRateHeavenBuff, HitRateHeavenBuff, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRateHeavenBuff.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRateHeavenBuff[i].c_str(), &temp)) { data.mHitRateHeavenBuff.push_back(temp); } } } { const char* HitRateBuff = element->Attribute("HitRateBuff"); std::vector vecHitRateBuff; boost::split(vecHitRateBuff, HitRateBuff, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRateBuff.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRateBuff[i].c_str(), &temp)) { data.mHitRateBuff.push_back(temp); } } } { const char* HitRateDBuff = element->Attribute("HitRateDBuff"); std::vector vecHitRateDBuff; boost::split(vecHitRateDBuff, HitRateDBuff, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRateDBuff.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRateDBuff[i].c_str(), &temp)) { data.mHitRateDBuff.push_back(temp); } } } { const char* HitRatePersonalBuff = element->Attribute("HitRatePersonalBuff"); std::vector vecHitRatePersonalBuff; boost::split(vecHitRatePersonalBuff, HitRatePersonalBuff, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRatePersonalBuff.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRatePersonalBuff[i].c_str(), &temp)) { data.mHitRatePersonalBuff.push_back(temp); } } } { const char* HitRateHell = element->Attribute("HitRateHell"); std::vector vecHitRateHell; boost::split(vecHitRateHell, HitRateHell, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRateHell.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRateHell[i].c_str(), &temp)) { data.mHitRateHell.push_back(temp); } } } { const char* HitRateHellBuff = element->Attribute("HitRateHellBuff"); std::vector vecHitRateHellBuff; boost::split(vecHitRateHellBuff, HitRateHellBuff, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecHitRateHellBuff.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecHitRateHellBuff[i].c_str(), &temp)) { data.mHitRateHellBuff.push_back(temp); } } } { const char* FirstHitBuff = element->Attribute("FirstHitBuff"); std::vector vecFirstHitBuff; boost::split(vecFirstHitBuff, FirstHitBuff, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecFirstHitBuff.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecFirstHitBuff[i].c_str(), &temp)) { data.mFirstHitBuff.push_back(temp); } } } data.mStarRate = element->IntAttribute("StarRate"); { const char* DropItems = element->Attribute("DropItems"); std::vector vecDropItems; boost::split(vecDropItems, DropItems, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecDropItems.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecDropItems[i].c_str(), &temp)) { data.mDropItems.push_back(temp); } } } { const char* ExtraDrop = element->Attribute("ExtraDrop"); std::vector vecExtraDrop; boost::split(vecExtraDrop, ExtraDrop, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecExtraDrop.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecExtraDrop[i].c_str(), &temp)) { data.mExtraDrop.push_back(temp); } } } data.mBigPool = element->IntAttribute("BigPool"); data.mPlayPool = element->IntAttribute("PlayPool"); data.mNoviceBuff = element->IntAttribute("NoviceBuff"); data.mRechargeBuff = element->IntAttribute("RechargeBuff"); { const char* FirstBuff = element->Attribute("FirstBuff"); std::vector vecFirstBuff; boost::split(vecFirstBuff, FirstBuff, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecFirstBuff.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecFirstBuff[i].c_str(), &temp)) { data.mFirstBuff.push_back(temp); } } } { const char* Group = element->Attribute("Group"); std::vector vecGroup; boost::split(vecGroup, Group, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecGroup.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecGroup[i].c_str(), &temp)) { data.mGroup.push_back(temp); } } } data.mActivityId = element->IntAttribute("ActivityId"); { const char* ActivityDropItems = element->Attribute("ActivityDropItems"); std::vector vecActivityDropItems; boost::split(vecActivityDropItems, ActivityDropItems, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecActivityDropItems.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecActivityDropItems[i].c_str(), &temp)) { data.mActivityDropItems.push_back(temp); } } } { const char* rate = element->Attribute("rate"); std::vector vecrate; boost::split(vecrate, rate, boost::is_any_of(",")); int temp; for (unsigned int i = 0; i < vecrate.size(); i++) { if (tinyxml2::XMLUtil::ToInt(vecrate[i].c_str(), &temp)) { data.mrate.push_back(temp); } } } data.mSquama = element->IntAttribute("Squama"); if (mMapData.find(data.mID) != mMapData.end())std::cout <<"data refind:" << data.mID << std::endl; assert(mMapData.find(data.mID) == mMapData.end()); mMapData.insert(std::make_pair(data.mID, data)); element = element->NextSiblingElement(); } } void Fish_OddsCFG::Load() { Load("../Config/Fish_OddsCFG.xml"); } Fish_OddsCFG* Fish_OddsCFG::GetSingleton() { if (msSingleton.get() == nullptr) { msSingleton.reset(new Fish_OddsCFG()); } return msSingleton.get(); }