]> jfr.im git - irc/gameservirc.git/blame - 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
CommitLineData
142e3ca5 1#include <GameServ/DataLayer/File/FileMasterDAO.h>\r
2using GameServ::DataLayer::File::FileMasterDAO;\r
3\r
4#include <GameServ/GameLayer/GameObjects/MasterGO.h>\r
5using GameServ::GameLayer::GameObjects::MasterGO;\r
6\r
7#include <GameServ/DataLayer/DataLayerExceptions.h>\r
8using GameServ::DataLayer::Exceptions::ResourceException;\r
9using GameServ::DataLayer::Exceptions::DataLayerException;\r
10\r
11#include <GameServ/DataLayer/File/FileId.h>\r
12using GameServ::DataLayer::File::FileId;\r
13\r
14#include <boost/smart_ptr/shared_ptr.hpp>\r
15#include <boost/format.hpp>\r
16#include <boost/algorithm/string.hpp>\r
17#include <boost/lexical_cast.hpp>\r
18using boost::shared_ptr;\r
19using boost::shared_static_cast;\r
20using boost::format;\r
21using boost::str;\r
22using boost::lexical_cast;\r
23using boost::bad_lexical_cast;\r
24#include <boost/tokenizer.hpp>\r
25typedef boost::tokenizer<boost::char_separator<char> > \r
26 tokenizer;\r
27\r
28#include <string>\r
29using std::string;\r
30\r
31#include <fstream>\r
32using std::ifstream;\r
33using std::getline;\r
34using std::ofstream;\r
35using std::endl;\r
36\r
37#include <map>\r
38using std::map;\r
39\r
40FileMasterDAO::FileMasterDAO() : mFilename("data\\masters.dat")\r
41{\r
42 Initialize(GetMasterFilePath());\r
43}\r
44\r
45FileMasterDAO::FileMasterDAO(const string &filename)\r
46{\r
47 Initialize(filename);\r
48}\r
49\r
50FileMasterDAO::~FileMasterDAO()\r
51{\r
52}\r
53\r
54void FileMasterDAO::Initialize(const string &filename)\r
55{\r
56 mFilename = filename;\r
57 LoadMasterCache();\r
58}\r
59\r
60void FileMasterDAO::LoadMasterCache(void)\r
61{\r
62 assert(!mFilename.empty());\r
63 spMasterCache.clear();\r
64 ifstream infile;\r
65 infile.open(mFilename.c_str());\r
66 if (infile.fail())\r
67 {\r
68 throw DataLayerException(str(format("Unable to open %1% for loading Masters") % mFilename),\r
69 __FILE__, __LINE__);\r
70 }\r
71 while (!infile.eof())\r
72 {\r
73 string line;\r
74 shared_ptr<MasterGO> spMaster;\r
75 getline(infile, line);\r
76 if (line.empty())\r
77 {\r
78 continue;\r
79 }\r
80 else if (line[0] == '#')\r
81 {\r
82 continue;\r
83 }\r
84 spMaster = CreateMasterFromLine(line);\r
85 spMasterCache[spMaster->Id()] = spMaster;\r
86 }\r
87 infile.close();\r
88}\r
89\r
90string FileMasterDAO::GetMasterFilePath() const\r
91{\r
92 return mFilename;\r
93}\r
94\r
95shared_ptr<MasterGO> FileMasterDAO::GetById(const string &Id) const\r
96{\r
97 map<string, shared_ptr<MasterGO> >::const_iterator iter;\r
98 iter = spMasterCache.find(Id);\r
99 if (iter != spMasterCache.end())\r
100 {\r
101 return shared_ptr<MasterGO>(iter->second);\r
102 }\r
103 return shared_ptr<MasterGO>();\r
104}\r
105\r
106shared_ptr<MasterGO> FileMasterDAO::CreateMasterFromLine(const string &line) const\r
107{\r
108 assert(!line.empty());\r
109 shared_ptr<MasterGO> spMaster;\r
110 spMaster = shared_ptr<MasterGO>(new MasterGO());\r
111 boost::char_separator<char> sep("~", 0);\r
112 tokenizer tokens(line, sep);\r
113 tokenizer::iterator tok_iter = tokens.begin();\r
114 \r
115 // Level\r
116 try\r
117 {\r
118 spMaster->Level(lexical_cast<unsigned int>((*tok_iter)));\r
119 }\r
120 catch (bad_lexical_cast)\r
121 {\r
122 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
123 line % (*tok_iter)));\r
124 }\r
125 \r
126 // Name\r
127 tok_iter++;\r
128 if (tok_iter == tokens.end())\r
129 {\r
130 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
131 line), __FILE__, __LINE__);\r
132 }\r
133 spMaster->Name((*tok_iter));\r
134 spMaster->Id(FileId::CreateMasterId(spMaster->Level(), spMaster->Name()));\r
135\r
136 // Weapon\r
137 tok_iter++;\r
138 if (tok_iter == tokens.end())\r
139 {\r
140 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
141 line), __FILE__, __LINE__);\r
142 }\r
143 spMaster->WeaponName((*tok_iter));\r
144\r
145 // Strength\r
146 tok_iter++;\r
147 if (tok_iter == tokens.end())\r
148 {\r
149 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
150 line), __FILE__, __LINE__);\r
151 }\r
152 try\r
153 {\r
154 spMaster->Strength(lexical_cast<int>((*tok_iter)));\r
155 }\r
156 catch (bad_lexical_cast)\r
157 {\r
158 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
159 line % (*tok_iter)));\r
160 }\r
161\r
162 // Defense\r
163 tok_iter++;\r
164 if (tok_iter == tokens.end())\r
165 {\r
166 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
167 line), __FILE__, __LINE__);\r
168 }\r
169 try\r
170 {\r
171 spMaster->Defense(lexical_cast<int>((*tok_iter)));\r
172 }\r
173 catch (bad_lexical_cast)\r
174 {\r
175 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
176 line % (*tok_iter)));\r
177 }\r
178\r
179\r
180 // Gold\r
181 tok_iter++;\r
182 if (tok_iter == tokens.end())\r
183 {\r
184 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
185 line), __FILE__, __LINE__);\r
186 }\r
187 try\r
188 {\r
189 spMaster->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r
190 }\r
191 catch (bad_lexical_cast)\r
192 {\r
193 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
194 line % (*tok_iter)));\r
195 }\r
196\r
197 // Experience\r
198 tok_iter++;\r
199 if (tok_iter == tokens.end())\r
200 {\r
201 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
202 line), __FILE__, __LINE__);\r
203 }\r
204 try\r
205 {\r
206 spMaster->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r
207 }\r
208 catch (bad_lexical_cast)\r
209 {\r
210 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
211 line % (*tok_iter)));\r
212 }\r
213\r
214 // Health and Max Health\r
215 tok_iter++;\r
216 if (tok_iter == tokens.end())\r
217 {\r
218 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
219 line), __FILE__, __LINE__);\r
220 }\r
221 try\r
222 {\r
223 spMaster->Health(lexical_cast<int>((*tok_iter)));\r
224 spMaster->MaxHealth(spMaster->Health());\r
225 }\r
226 catch (bad_lexical_cast)\r
227 {\r
228 throw DataLayerException(str(format("Corrupt master line %1%. Invalid integer value %2%") % \r
229 line % (*tok_iter)));\r
230 }\r
231\r
232 // Parting Words\r
233 tok_iter++;\r
234 if (tok_iter == tokens.end())\r
235 {\r
236 throw DataLayerException(str(format("Corrupt master line %1%. Missing information") %\r
237 line), __FILE__, __LINE__);\r
238 }\r
239 spMaster->PartingWords((*tok_iter));\r
240 // # level~name~weapon~strength~defense~gold~exp~hp~parting words\r
241 return spMaster;\r
242}\r
243\r
244bool FileMasterDAO::IdExists(const string &Id) const\r
245{\r
246 map<string, shared_ptr<MasterGO> >::const_iterator iter;\r
247 iter = spMasterCache.find(Id);\r
248 return (iter != spMasterCache.end());\r
249}