]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv-2.0/libgameservgldl/src/DataLayer/File/FileMasterDAO.cpp
Consolidated all the individual level files into a single levels.dat file.
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / File / FileMasterDAO.cpp
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..3ac6e51a5fa390bf22202f52f1a5d8b3b9e0edf0 100644 (file)
@@ -0,0 +1,249 @@
+#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