]> jfr.im git - irc/gameservirc.git/blame - gameserv-2.0/libgameservgldl/src/DataLayer/File/FileLevelDAO.cpp
Changed Range to be a template class so it can be used with unsigned & signed ints...
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / File / FileLevelDAO.cpp
CommitLineData
142e3ca5 1#include <GameServ/DataLayer/File/FileLevelDAO.h>\r
2using GameServ::DataLayer::File::FileLevelDAO;\r
3\r
4#include <GameServ/GameLayer/GameObjects/LevelGO.h>\r
5using GameServ::GameLayer::GameObjects::LevelGO;\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
40FileLevelDAO::FileLevelDAO() : mFilename("data\\levels.dat")\r
41{\r
42 Initialize(GetLevelFilePath());\r
43}\r
44\r
45FileLevelDAO::FileLevelDAO(const string &filename)\r
46{\r
47 Initialize(filename);\r
48}\r
49\r
50FileLevelDAO::~FileLevelDAO()\r
51{\r
52}\r
53\r
54void FileLevelDAO::Initialize(const string &filename)\r
55{\r
56 mFilename = filename;\r
57 LoadLevelCache();\r
58}\r
59\r
60void FileLevelDAO::LoadLevelCache(void)\r
61{\r
62 assert(!mFilename.empty());\r
63 spLevelCache.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 Levels") % mFilename),\r
69 __FILE__, __LINE__);\r
70 }\r
71 while (!infile.eof())\r
72 {\r
73 string line;\r
74 shared_ptr<LevelGO> spLevel;\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 spLevel = CreateLevelFromLine(line);\r
85 spLevelCache[spLevel->Id()] = spLevel;\r
86 }\r
87 infile.close();\r
88}\r
89\r
90string FileLevelDAO::GetLevelFilePath() const\r
91{\r
92 return mFilename;\r
93}\r
94\r
95shared_ptr<LevelGO> FileLevelDAO::GetById(const string &Id) const\r
96{\r
97 map<string, shared_ptr<LevelGO> >::const_iterator iter;\r
98 iter = spLevelCache.find(Id);\r
99 if (iter != spLevelCache.end())\r
100 {\r
101 return shared_ptr<LevelGO>(iter->second);\r
102 }\r
103 return shared_ptr<LevelGO>();\r
104}\r
105\r
106shared_ptr<LevelGO> FileLevelDAO::CreateLevelFromLine(const string &line) const\r
107{\r
108 assert(!line.empty());\r
109 shared_ptr<LevelGO> spLevel;\r
110 spLevel = shared_ptr<LevelGO>(new LevelGO());\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 try\r
116 {\r
117 spLevel->Number(lexical_cast<unsigned int>((*tok_iter)));\r
118 }\r
119 catch (bad_lexical_cast)\r
120 {\r
121 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
122 line % (*tok_iter)));\r
123 }\r
124 spLevel->Id(FileId::CreateLevelId(spLevel->Number()));\r
125 tok_iter++;\r
126 if (tok_iter == tokens.end())\r
127 {\r
128 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
129 line), __FILE__, __LINE__);\r
130 }\r
131 int low, high;\r
132 try\r
133 {\r
134 low = lexical_cast<int>((*tok_iter));\r
135 }\r
136 catch (bad_lexical_cast)\r
137 {\r
138 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
139 line % (*tok_iter)));\r
140 }\r
141 tok_iter++;\r
142 if (tok_iter == tokens.end())\r
143 {\r
144 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
145 line), __FILE__, __LINE__);\r
146 }\r
147 try\r
148 {\r
149 high = lexical_cast<int>((*tok_iter));\r
150 }\r
151 catch (bad_lexical_cast)\r
152 {\r
153 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
154 line % (*tok_iter)));\r
155 }\r
156\r
fadef98f 157 spLevel->StrengthRange(Range<int>(high, low));\r
142e3ca5 158\r
fadef98f 159 tok_iter++;\r
160 if (tok_iter == tokens.end())\r
161 {\r
162 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
163 line), __FILE__, __LINE__);\r
164 }\r
142e3ca5 165 try\r
166 {\r
167 low = lexical_cast<int>((*tok_iter));\r
168 }\r
169 catch (bad_lexical_cast)\r
170 {\r
171 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
172 line % (*tok_iter)));\r
173 }\r
174 tok_iter++;\r
175 if (tok_iter == tokens.end())\r
176 {\r
177 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
178 line), __FILE__, __LINE__);\r
179 }\r
180 try\r
181 {\r
182 high = lexical_cast<int>((*tok_iter));\r
183 }\r
184 catch (bad_lexical_cast)\r
185 {\r
186 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
187 line % (*tok_iter)));\r
188 }\r
fadef98f 189 spLevel->DefenseRange(Range<int>(high, low));\r
142e3ca5 190\r
fadef98f 191 tok_iter++;\r
192 if (tok_iter == tokens.end())\r
193 {\r
194 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
195 line), __FILE__, __LINE__);\r
196 }\r
142e3ca5 197 try\r
198 {\r
199 low = lexical_cast<int>((*tok_iter));\r
200 }\r
201 catch (bad_lexical_cast)\r
202 {\r
203 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
204 line % (*tok_iter)));\r
205 }\r
206 tok_iter++;\r
207 if (tok_iter == tokens.end())\r
208 {\r
209 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
210 line), __FILE__, __LINE__);\r
211 }\r
212 try\r
213 {\r
214 high = lexical_cast<int>((*tok_iter));\r
215 }\r
216 catch (bad_lexical_cast)\r
217 {\r
218 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
219 line % (*tok_iter)));\r
220 }\r
fadef98f 221 spLevel->GoldRange(Range<int>(high, low));\r
142e3ca5 222\r
fadef98f 223 tok_iter++;\r
224 if (tok_iter == tokens.end())\r
225 {\r
226 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
227 line), __FILE__, __LINE__);\r
228 }\r
142e3ca5 229 try\r
230 {\r
231 low = lexical_cast<int>((*tok_iter));\r
232 }\r
233 catch (bad_lexical_cast)\r
234 {\r
235 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
236 line % (*tok_iter)));\r
237 }\r
238 tok_iter++;\r
239 if (tok_iter == tokens.end())\r
240 {\r
241 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
242 line), __FILE__, __LINE__);\r
243 }\r
244 try\r
245 {\r
246 high = lexical_cast<int>((*tok_iter));\r
247 }\r
248 catch (bad_lexical_cast)\r
249 {\r
250 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
251 line % (*tok_iter)));\r
252 }\r
fadef98f 253 spLevel->ExperienceRange(Range<int>(high, low));\r
142e3ca5 254\r
fadef98f 255 tok_iter++;\r
256 if (tok_iter == tokens.end())\r
257 {\r
258 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
259 line), __FILE__, __LINE__);\r
260 }\r
142e3ca5 261 try\r
262 {\r
263 low = lexical_cast<int>((*tok_iter));\r
264 }\r
265 catch (bad_lexical_cast)\r
266 {\r
267 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
268 line % (*tok_iter)));\r
269 }\r
270 tok_iter++;\r
271 if (tok_iter == tokens.end())\r
272 {\r
273 throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
274 line), __FILE__, __LINE__);\r
275 }\r
276 try\r
277 {\r
278 high = lexical_cast<int>((*tok_iter));\r
279 }\r
280 catch (bad_lexical_cast)\r
281 {\r
282 throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
283 line % (*tok_iter)));\r
284 }\r
fadef98f 285 spLevel->HealthRange(Range<int>(high, low));\r
142e3ca5 286 \r
287 return spLevel;\r
288}\r
289\r
290bool FileLevelDAO::IdExists(const string &Id) const\r
291{\r
292 map<string, shared_ptr<LevelGO> >::const_iterator iter;\r
293 iter = spLevelCache.find(Id);\r
294 return (iter != spLevelCache.end());\r
295}