+#include <GameServ/DataLayer/File/FileMasterDAO.h>\r
+using GameServ::DataLayer::File::FileMasterDAO;\r
+\r
+#include <GameServ/GameLayer/GameObjects/MasterGO.h>\r
+using GameServ::GameLayer::GameObjects::MasterGO;\r
+\r
+#include <GameServ/DataLayer/DataLayerExceptions.h>\r
+using GameServ::DataLayer::Exceptions::ResourceException;\r
+using GameServ::DataLayer::Exceptions::DataLayerException;\r
+\r
+#include <GameServ/DataLayer/File/FileId.h>\r
+using GameServ::DataLayer::File::FileId;\r
+\r
+#include <boost/smart_ptr/shared_ptr.hpp>\r
+#include <boost/format.hpp>\r
+#include <boost/algorithm/string.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+using boost::shared_ptr;\r
+using boost::shared_static_cast;\r
+using boost::format;\r
+using boost::str;\r
+using boost::lexical_cast;\r
+using boost::bad_lexical_cast;\r
+#include <boost/tokenizer.hpp>\r
+typedef boost::tokenizer<boost::char_separator<char> > \r
+ tokenizer;\r
+\r
+#include <string>\r
+using std::string;\r
+\r
+#include <fstream>\r
+using std::ifstream;\r
+using std::getline;\r
+using std::ofstream;\r
+using std::endl;\r
+\r
+#include <map>\r
+using std::map;\r
+\r
+FileMasterDAO::FileMasterDAO() : mFilename("data\\masters.dat")\r
+{\r
+ Initialize(GetMasterFilePath());\r
+}\r
+\r
+FileMasterDAO::FileMasterDAO(const string &filename)\r
+{\r
+ Initialize(filename);\r
+}\r
+\r
+FileMasterDAO::~FileMasterDAO()\r
+{\r
+}\r
+\r
+void FileMasterDAO::Initialize(const string &filename)\r
+{\r
+ mFilename = filename;\r
+ LoadMasterCache();\r
+}\r
+\r
+void FileMasterDAO::LoadMasterCache(void)\r
+{\r
+ assert(!mFilename.empty());\r
+ spMasterCache.clear();\r
+ ifstream infile;\r
+ infile.open(mFilename.c_str());\r
+ if (infile.fail())\r
+ {\r
+ throw DataLayerException(str(format("Unable to open %1% for loading Masters") % mFilename),\r
+ __FILE__, __LINE__);\r
+ }\r
+ while (!infile.eof())\r
+ {\r
+ string line;\r
+ shared_ptr<MasterGO> spMaster;\r
+ getline(infile, line);\r
+ if (line.empty())\r
+ {\r
+ continue;\r
+ }\r
+ else if (line[0] == '#')\r
+ {\r
+ continue;\r
+ }\r
+ spMaster = CreateMasterFromLine(line);\r
+ spMasterCache[spMaster->Id()] = spMaster;\r
+ }\r
+ infile.close();\r
+}\r
+\r
+string FileMasterDAO::GetMasterFilePath() const\r
+{\r
+ return mFilename;\r
+}\r
+\r
+shared_ptr<MasterGO> FileMasterDAO::GetById(const string &Id) const\r
+{\r
+ map<string, shared_ptr<MasterGO> >::const_iterator iter;\r
+ iter = spMasterCache.find(Id);\r
+ if (iter != spMasterCache.end())\r
+ {\r
+ return shared_ptr<MasterGO>(iter->second);\r
+ }\r
+ return shared_ptr<MasterGO>();\r
+}\r
+\r
+shared_ptr<MasterGO> FileMasterDAO::CreateMasterFromLine(const string &line) const\r
+{\r
+ assert(!line.empty());\r
+ shared_ptr<MasterGO> spMaster;\r
+ spMaster = shared_ptr<MasterGO>(new MasterGO());\r
+ boost::char_separator<char> sep("~", 0);\r
+ tokenizer tokens(line, sep);\r
+ tokenizer::iterator tok_iter = tokens.begin();\r
+ \r
+ // Level\r
+ try\r
+ {\r
+ spMaster->Level(lexical_cast<unsigned int>((*tok_iter)));\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
+ line % (*tok_iter)));\r
+ }\r
+ \r
+ // Name\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ spMaster->Name((*tok_iter));\r
+ spMaster->Id(FileId::CreateMasterId(spMaster->Level(), spMaster->Name()));\r
+\r
+ // Weapon\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ spMaster->WeaponName((*tok_iter));\r
+\r
+ // Strength\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ try\r
+ {\r
+ spMaster->Strength(lexical_cast<int>((*tok_iter)));\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
+ line % (*tok_iter)));\r
+ }\r
+\r
+ // Defense\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ try\r
+ {\r
+ spMaster->Defense(lexical_cast<int>((*tok_iter)));\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
+ line % (*tok_iter)));\r
+ }\r
+\r
+\r
+ // Gold\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ try\r
+ {\r
+ spMaster->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
+ line % (*tok_iter)));\r
+ }\r
+\r
+ // Experience\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ try\r
+ {\r
+ spMaster->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
+ line % (*tok_iter)));\r
+ }\r
+\r
+ // Health and Max Health\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ try\r
+ {\r
+ spMaster->Health(lexical_cast<int>((*tok_iter)));\r
+ spMaster->MaxHealth(spMaster->Health());\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
+ line % (*tok_iter)));\r
+ }\r
+\r
+ // Parting Words\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ spMaster->PartingWords((*tok_iter));\r
+ // # level~name~weapon~strength~defense~gold~exp~hp~parting words\r
+ return spMaster;\r
+}\r
+\r
+bool FileMasterDAO::IdExists(const string &Id) const\r
+{\r
+ map<string, shared_ptr<MasterGO> >::const_iterator iter;\r
+ iter = spMasterCache.find(Id);\r
+ return (iter != spMasterCache.end());\r
+}
\ No newline at end of file