]>
Commit | Line | Data |
---|---|---|
317ce8de | 1 | #include <GameServ/DataLayer/File/FileItemDAO.h>\r |
2 | using GameServ::DataLayer::File::FileItemDAO;\r | |
3 | #include <GameServ/GameLayer/GameObjects/ItemGO.h>\r | |
4 | using GameServ::GameLayer::GameObjects::ItemGO;\r | |
5 | #include <GameServ/GameLayer/GameObjects/ArmorGO.h>\r | |
6 | using GameServ::GameLayer::GameObjects::ArmorGO;\r | |
7 | #include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r | |
8 | using GameServ::GameLayer::GameObjects::WeaponGO;\r | |
9 | #include <GameServ/GameLayer/GameObjects/PotionGO.h>\r | |
10 | using GameServ::GameLayer::GameObjects::PotionGO;\r | |
11 | \r | |
12 | #include <GameServ/DataLayer/DataLayerExceptions.h>\r | |
13 | using GameServ::DataLayer::Exceptions::ResourceException;\r | |
14 | using GameServ::DataLayer::Exceptions::DataLayerException;\r | |
15 | \r | |
16 | #include <GameServ/DataLayer/File/FileId.h>\r | |
17 | using GameServ::DataLayer::File::FileId;\r | |
18 | \r | |
19 | #include <GameServ/Types.h>\r | |
20 | using GameServ::Types::ItemTypes;\r | |
21 | using GameServ::Types::Modifiers;\r | |
22 | using GameServ::Types::Exceptions::TypeException;\r | |
23 | \r | |
33ae7ca7 | 24 | #include <boost/smart_ptr/shared_ptr.hpp>\r |
317ce8de | 25 | #include <boost/format.hpp>\r |
26 | #include <boost/algorithm/string.hpp>\r | |
27 | #include <boost/lexical_cast.hpp>\r | |
33ae7ca7 | 28 | \r |
317ce8de | 29 | using boost::format;\r |
30 | using boost::str;\r | |
31 | using boost::algorithm::to_upper;\r | |
32 | using boost::lexical_cast;\r | |
33 | #include <boost/tokenizer.hpp>\r | |
34 | typedef boost::tokenizer<boost::char_separator<char> > \r | |
35 | tokenizer;\r | |
36 | \r | |
37 | #include <string>\r | |
38 | using std::string;\r | |
39 | \r | |
40 | #include <fstream>\r | |
41 | using std::ifstream;\r | |
42 | using std::getline;\r | |
43 | using std::ofstream;\r | |
44 | using std::endl;\r | |
45 | \r | |
46 | #include <map>\r | |
47 | using std::map;\r | |
48 | \r | |
49 | // TODO: Switch filename to be loaded from a config file\r | |
e823e42a | 50 | FileItemDAO::FileItemDAO() : mFilename("data\\items\\masteritems.dat")\r |
317ce8de | 51 | {\r |
52 | Initialize(GetItemFilePath());\r | |
53 | }\r | |
54 | \r | |
55 | FileItemDAO::FileItemDAO(const string &filename)\r | |
56 | {\r | |
57 | Initialize(filename);\r | |
58 | }\r | |
59 | \r | |
60 | FileItemDAO::~FileItemDAO()\r | |
61 | {\r | |
62 | }\r | |
63 | \r | |
64 | void FileItemDAO::Initialize(const string &filename)\r | |
65 | {\r | |
66 | mFilename = filename;\r | |
67 | LoadItemCache();\r | |
68 | }\r | |
69 | \r | |
70 | string FileItemDAO::GetItemFilePath() const\r | |
71 | {\r | |
72 | return mFilename;\r | |
73 | }\r | |
74 | \r | |
33ae7ca7 | 75 | boost::shared_ptr<ItemGO> FileItemDAO::GetById(const string &Id) const\r |
317ce8de | 76 | {\r |
33ae7ca7 | 77 | map<string, boost::shared_ptr<ItemGO> >::const_iterator iter;\r |
4757f72f | 78 | iter = spItemCache.find(Id);\r |
79 | if (iter != spItemCache.end())\r | |
317ce8de | 80 | {\r |
33ae7ca7 | 81 | return boost::shared_ptr<ItemGO>(iter->second->Clone());\r |
317ce8de | 82 | }\r |
4757f72f | 83 | else\r |
317ce8de | 84 | {\r |
33ae7ca7 | 85 | return boost::shared_ptr<ItemGO>();\r |
317ce8de | 86 | }\r |
317ce8de | 87 | }\r |
33ae7ca7 | 88 | boost::shared_ptr<ItemGO> FileItemDAO::CreatePotionFromLine(const string &line) const\r |
8e6e952d | 89 | {\r |
16655a31 | 90 | assert(!line.empty());\r |
33ae7ca7 | 91 | boost::shared_ptr<PotionGO> spPotion = boost::shared_ptr<PotionGO>(new PotionGO());\r |
92 | map<Modifiers::Modifier, IntRange> modifiers;\r | |
16655a31 | 93 | boost::char_separator<char> sep("~", 0, boost::keep_empty_tokens);\r |
94 | tokenizer tokens(line, sep);\r | |
95 | tokenizer::iterator tok_iter = tokens.begin();\r | |
96 | \r | |
97 | tok_iter++;\r | |
98 | if (tok_iter == tokens.end())\r | |
99 | {\r | |
100 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
101 | mFilename % line), __FILE__, __LINE__);\r | |
102 | }\r | |
103 | spPotion->Id(FileId::CreateItemId((*tok_iter)));\r | |
104 | \r | |
105 | tok_iter++;\r | |
106 | if (tok_iter == tokens.end())\r | |
107 | {\r | |
108 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
109 | mFilename % line), __FILE__, __LINE__);\r | |
110 | }\r | |
111 | \r | |
112 | spPotion->Name((*tok_iter));\r | |
113 | \r | |
114 | tok_iter++;\r | |
115 | if (tok_iter == tokens.end())\r | |
116 | {\r | |
117 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
118 | mFilename % line), __FILE__, __LINE__);\r | |
119 | }\r | |
120 | spPotion->Price(lexical_cast<unsigned long int>((*tok_iter)));\r | |
121 | \r | |
122 | tok_iter++;\r | |
123 | if (tok_iter == tokens.end())\r | |
124 | {\r | |
125 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
126 | mFilename % line), __FILE__, __LINE__);\r | |
127 | }\r | |
128 | spPotion->Uses(lexical_cast<int>((*tok_iter)));\r | |
129 | \r | |
130 | tok_iter++;\r | |
131 | if (tok_iter == tokens.end())\r | |
132 | {\r | |
133 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
134 | mFilename % line), __FILE__, __LINE__);\r | |
135 | }\r | |
136 | int low = lexical_cast<int>((*tok_iter));\r | |
137 | tok_iter++;\r | |
138 | if (tok_iter == tokens.end())\r | |
139 | {\r | |
140 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
141 | mFilename % line), __FILE__, __LINE__);\r | |
142 | }\r | |
143 | int high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 144 | modifiers[Modifiers::strength] = IntRange(high, low);\r |
16655a31 | 145 | tok_iter++;\r |
146 | if (tok_iter == tokens.end())\r | |
147 | {\r | |
148 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
149 | mFilename % line), __FILE__, __LINE__);\r | |
150 | }\r | |
151 | low = lexical_cast<int>((*tok_iter));\r | |
152 | tok_iter++;\r | |
153 | if (tok_iter == tokens.end())\r | |
154 | {\r | |
155 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
156 | mFilename % line), __FILE__, __LINE__);\r | |
157 | }\r | |
158 | high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 159 | modifiers[Modifiers::defense] = IntRange(high, low);\r |
16655a31 | 160 | \r |
161 | tok_iter++;\r | |
162 | if (tok_iter == tokens.end())\r | |
163 | {\r | |
164 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
165 | mFilename % line), __FILE__, __LINE__);\r | |
166 | }\r | |
167 | low = lexical_cast<int>((*tok_iter));\r | |
168 | tok_iter++;\r | |
169 | if (tok_iter == tokens.end())\r | |
170 | {\r | |
171 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
172 | mFilename % line), __FILE__, __LINE__);\r | |
173 | }\r | |
174 | high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 175 | modifiers[Modifiers::maxhealth] = IntRange(high, low);\r |
16655a31 | 176 | \r |
177 | tok_iter++;\r | |
178 | if (tok_iter == tokens.end())\r | |
179 | {\r | |
180 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
181 | mFilename % line), __FILE__, __LINE__);\r | |
182 | }\r | |
183 | low = lexical_cast<int>((*tok_iter));\r | |
184 | tok_iter++;\r | |
185 | if (tok_iter == tokens.end())\r | |
186 | {\r | |
187 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
188 | mFilename % line), __FILE__, __LINE__);\r | |
189 | }\r | |
190 | high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 191 | modifiers[Modifiers::health] = IntRange(high, low);\r |
16655a31 | 192 | \r |
193 | tok_iter++;\r | |
194 | if (tok_iter == tokens.end())\r | |
195 | {\r | |
196 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
197 | mFilename % line), __FILE__, __LINE__);\r | |
198 | }\r | |
199 | low = lexical_cast<int>((*tok_iter));\r | |
200 | tok_iter++;\r | |
201 | if (tok_iter == tokens.end())\r | |
202 | {\r | |
203 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
204 | mFilename % line), __FILE__, __LINE__);\r | |
205 | }\r | |
206 | high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 207 | modifiers[Modifiers::forestfights] = IntRange(high, low);\r |
16655a31 | 208 | \r |
209 | tok_iter++;\r | |
210 | if (tok_iter == tokens.end())\r | |
211 | {\r | |
212 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
213 | mFilename % line), __FILE__, __LINE__);\r | |
214 | }\r | |
215 | low = lexical_cast<int>((*tok_iter));\r | |
216 | tok_iter++;\r | |
217 | if (tok_iter == tokens.end())\r | |
218 | {\r | |
219 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
220 | mFilename % line), __FILE__, __LINE__);\r | |
221 | }\r | |
222 | high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 223 | modifiers[Modifiers::playerfights] = IntRange(high, low);\r |
16655a31 | 224 | \r |
225 | tok_iter++;\r | |
226 | if (tok_iter == tokens.end())\r | |
227 | {\r | |
228 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
229 | mFilename % line), __FILE__, __LINE__);\r | |
230 | }\r | |
231 | low = lexical_cast<int>((*tok_iter));\r | |
232 | tok_iter++;\r | |
233 | if (tok_iter == tokens.end())\r | |
234 | {\r | |
235 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
236 | mFilename % line), __FILE__, __LINE__);\r | |
237 | }\r | |
238 | high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 239 | modifiers[Modifiers::gold] = IntRange(high, low);\r |
16655a31 | 240 | \r |
241 | tok_iter++;\r | |
242 | if (tok_iter == tokens.end())\r | |
243 | {\r | |
244 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
245 | mFilename % line), __FILE__, __LINE__);\r | |
246 | }\r | |
247 | low = lexical_cast<int>((*tok_iter));\r | |
248 | tok_iter++;\r | |
249 | if (tok_iter == tokens.end())\r | |
250 | {\r | |
251 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
252 | mFilename % line), __FILE__, __LINE__);\r | |
253 | }\r | |
254 | high = lexical_cast<int>((*tok_iter));\r | |
33ae7ca7 | 255 | modifiers[Modifiers::bank] = IntRange(high, low);\r |
8e6e952d | 256 | \r |
257 | return spPotion;\r | |
258 | }\r | |
317ce8de | 259 | \r |
33ae7ca7 | 260 | boost::shared_ptr<ItemGO> FileItemDAO::CreateItemFromLine(const string &line) const\r |
317ce8de | 261 | {\r |
262 | assert(!line.empty());\r | |
33ae7ca7 | 263 | boost::shared_ptr<ItemGO> spItem;\r |
264 | map<Modifiers::Modifier, IntRange> modifiers;\r | |
317ce8de | 265 | boost::char_separator<char> sep("~", 0, boost::keep_empty_tokens);\r |
266 | tokenizer tokens(line, sep);\r | |
267 | tokenizer::iterator tok_iter = tokens.begin();\r | |
268 | \r | |
269 | ItemTypes::ItemType type;\r | |
270 | \r | |
271 | try\r | |
272 | {\r | |
273 | type = ItemTypes::Parse((*tok_iter));\r | |
274 | }\r | |
275 | catch (TypeException)\r | |
276 | {\r | |
33ae7ca7 | 277 | return boost::shared_ptr<ItemGO>();\r |
317ce8de | 278 | }\r |
279 | \r | |
280 | switch(type)\r | |
281 | {\r | |
282 | case ItemTypes::Weapon:\r | |
33ae7ca7 | 283 | spItem = boost::shared_ptr<WeaponGO>(new WeaponGO());\r |
317ce8de | 284 | break;\r |
285 | case ItemTypes::Armor:\r | |
33ae7ca7 | 286 | spItem = boost::shared_ptr<ArmorGO>(new ArmorGO());\r |
317ce8de | 287 | break;\r |
288 | case ItemTypes::Potion:\r | |
8e6e952d | 289 | return CreatePotionFromLine(line);\r |
e823e42a | 290 | break;\r |
317ce8de | 291 | default:\r |
292 | throw DataLayerException(str(format("Unknown Item type: %1%") % type), __FILE__, __LINE__);\r | |
293 | }\r | |
294 | tok_iter++;\r | |
e823e42a | 295 | if (tok_iter == tokens.end())\r |
296 | {\r | |
297 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
298 | mFilename % line), __FILE__, __LINE__);\r | |
299 | }\r | |
317ce8de | 300 | spItem->Id(FileId::CreateItemId((*tok_iter)));\r |
301 | \r | |
302 | tok_iter++;\r | |
e823e42a | 303 | if (tok_iter == tokens.end())\r |
304 | {\r | |
305 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
306 | mFilename % line), __FILE__, __LINE__);\r | |
307 | }\r | |
317ce8de | 308 | spItem->Name((*tok_iter));\r |
309 | tok_iter++;\r | |
e823e42a | 310 | if (tok_iter == tokens.end())\r |
311 | {\r | |
312 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
313 | mFilename % line), __FILE__, __LINE__);\r | |
314 | }\r | |
317ce8de | 315 | spItem->Price(lexical_cast<unsigned long int>((*tok_iter)));\r |
316 | tok_iter++;\r | |
e823e42a | 317 | if (tok_iter == tokens.end())\r |
318 | {\r | |
319 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
320 | mFilename % line), __FILE__, __LINE__);\r | |
321 | }\r | |
317ce8de | 322 | spItem->Uses(lexical_cast<int>((*tok_iter)));\r |
323 | tok_iter++;\r | |
e823e42a | 324 | if (tok_iter == tokens.end())\r |
325 | {\r | |
326 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
327 | mFilename % line), __FILE__, __LINE__);\r | |
328 | }\r | |
1134c368 | 329 | if ((*tok_iter) != "0")\r |
330 | {\r | |
33ae7ca7 | 331 | modifiers[Modifiers::strength] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 332 | }\r |
317ce8de | 333 | tok_iter++;\r |
e823e42a | 334 | if (tok_iter == tokens.end())\r |
335 | {\r | |
336 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
337 | mFilename % line), __FILE__, __LINE__);\r | |
338 | }\r | |
1134c368 | 339 | if ((*tok_iter) != "0")\r |
340 | {\r | |
33ae7ca7 | 341 | modifiers[Modifiers::defense] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 342 | }\r |
317ce8de | 343 | tok_iter++;\r |
e823e42a | 344 | if (tok_iter == tokens.end())\r |
345 | {\r | |
346 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
347 | mFilename % line), __FILE__, __LINE__);\r | |
348 | }\r | |
1134c368 | 349 | if ((*tok_iter) != "0")\r |
350 | {\r | |
33ae7ca7 | 351 | modifiers[Modifiers::maxhealth] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 352 | }\r |
317ce8de | 353 | tok_iter++;\r |
e823e42a | 354 | if (tok_iter == tokens.end())\r |
355 | {\r | |
356 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
357 | mFilename % line), __FILE__, __LINE__);\r | |
358 | }\r | |
1134c368 | 359 | if ((*tok_iter) != "0")\r |
360 | {\r | |
33ae7ca7 | 361 | modifiers[Modifiers::health] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 362 | }\r |
317ce8de | 363 | tok_iter++;\r |
e823e42a | 364 | if (tok_iter == tokens.end())\r |
365 | {\r | |
1134c368 | 366 | spItem->Modifiers(modifiers);\r |
e823e42a | 367 | return spItem;\r |
368 | }\r | |
1134c368 | 369 | if ((*tok_iter) != "0")\r |
370 | {\r | |
33ae7ca7 | 371 | modifiers[Modifiers::forestfights] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 372 | }\r |
317ce8de | 373 | tok_iter++;\r |
e823e42a | 374 | if (tok_iter == tokens.end())\r |
375 | {\r | |
1134c368 | 376 | spItem->Modifiers(modifiers);\r |
e823e42a | 377 | return spItem;\r |
378 | }\r | |
1134c368 | 379 | if ((*tok_iter) != "0")\r |
380 | {\r | |
33ae7ca7 | 381 | modifiers[Modifiers::playerfights] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 382 | }\r |
317ce8de | 383 | tok_iter++;\r |
e823e42a | 384 | if (tok_iter == tokens.end())\r |
385 | {\r | |
1134c368 | 386 | spItem->Modifiers(modifiers);\r |
e823e42a | 387 | return spItem;\r |
388 | }\r | |
1134c368 | 389 | if ((*tok_iter) != "0")\r |
390 | {\r | |
33ae7ca7 | 391 | modifiers[Modifiers::gold] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 392 | }\r |
317ce8de | 393 | tok_iter++;\r |
e823e42a | 394 | if (tok_iter == tokens.end())\r |
395 | {\r | |
1134c368 | 396 | spItem->Modifiers(modifiers);\r |
e823e42a | 397 | return spItem;\r |
398 | }\r | |
1134c368 | 399 | if ((*tok_iter) != "0")\r |
400 | {\r | |
33ae7ca7 | 401 | modifiers[Modifiers::bank] = IntRange(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r |
1134c368 | 402 | }\r |
317ce8de | 403 | spItem->Modifiers(modifiers);\r |
404 | \r | |
405 | return spItem;\r | |
406 | }\r | |
407 | bool FileItemDAO::IdExists(const string &Id) const\r | |
408 | {\r | |
33ae7ca7 | 409 | map<string, boost::shared_ptr<ItemGO> >::const_iterator iter;\r |
317ce8de | 410 | iter = spItemCache.find(Id);\r |
411 | return (iter != spItemCache.end());\r | |
412 | }\r | |
413 | \r | |
414 | void FileItemDAO::LoadItemCache(void)\r | |
415 | {\r | |
416 | ifstream infile;\r | |
417 | infile.open(mFilename.c_str());\r | |
418 | \r | |
419 | if (infile.fail())\r | |
420 | {\r | |
421 | throw DataLayerException(str(format("Unable to open %1% for reading") % mFilename), __FILE__, __LINE__);\r | |
422 | }\r | |
423 | string line;\r | |
424 | while (getline(infile, line))\r | |
425 | {\r | |
426 | if (line.length() == 0)\r | |
427 | {\r | |
428 | continue;\r | |
429 | }\r | |
430 | if (line[0] == '#')\r | |
431 | {\r | |
432 | continue;\r | |
433 | }\r | |
33ae7ca7 | 434 | boost::shared_ptr<ItemGO> spItem = CreateItemFromLine(line);\r |
317ce8de | 435 | if (spItem != 0)\r |
436 | {\r | |
437 | spItemCache[spItem->Id()] = spItem;\r | |
438 | }\r | |
439 | }\r | |
440 | infile.close();\r | |
441 | }\r | |
cdc7e562 | 442 | \r |
33ae7ca7 | 443 | void FileItemDAO::Insert(boost::shared_ptr<ItemGO> spItem)\r |
cdc7e562 | 444 | {\r |
445 | throw DataLayerException("Not implemented", __FILE__, __LINE__);\r | |
446 | }\r | |
33ae7ca7 | 447 | void FileItemDAO::Update(boost::shared_ptr<ItemGO> spItem)\r |
cdc7e562 | 448 | {\r |
449 | throw DataLayerException("Not implemented", __FILE__, __LINE__);\r | |
450 | }\r | |
451 | \r |