]>
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 | |
24 | #include <boost/shared_ptr.hpp>\r | |
25 | #include <boost/format.hpp>\r | |
26 | #include <boost/algorithm/string.hpp>\r | |
27 | #include <boost/lexical_cast.hpp>\r | |
28 | using boost::shared_ptr;\r | |
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 | |
75 | shared_ptr<ItemGO> FileItemDAO::GetById(const string &Id) const\r | |
76 | {\r | |
77 | string line;\r | |
78 | ifstream infile;\r | |
79 | infile.open(GetItemFilePath().c_str());\r | |
80 | \r | |
81 | if (infile.fail())\r | |
82 | {\r | |
83 | throw ResourceException(str(format("Unable to open file %1%") % GetItemFilePath()), __FILE__, __LINE__);\r | |
84 | }\r | |
85 | \r | |
86 | \r | |
87 | while (getline(infile, line))\r | |
88 | {\r | |
89 | if (line.empty())\r | |
90 | {\r | |
91 | continue;\r | |
92 | }\r | |
93 | if (line[0] == '#')\r | |
94 | {\r | |
95 | continue;\r | |
96 | }\r | |
97 | size_t tilde1 = line.find_first_of("~");\r | |
98 | if (tilde1 == string::npos)\r | |
99 | {\r | |
100 | throw DataLayerException(str(format("Invalid Item in %1%: %2%") % mFilename % line), __FILE__,\r | |
101 | __LINE__);\r | |
102 | }\r | |
103 | size_t tilde2 = line.find_first_of("~", tilde1 + 1);\r | |
104 | if (tilde2 == string::npos)\r | |
105 | {\r | |
106 | throw DataLayerException(str(format("Invalid Item in %1%: %2%") % mFilename % line), __FILE__,\r | |
107 | __LINE__);\r | |
108 | }\r | |
109 | string lineId = FileId::CreateItemId(line.substr(tilde1 + 1, tilde2 - tilde1 - 1));\r | |
110 | \r | |
111 | if (lineId == Id)\r | |
112 | {\r | |
113 | shared_ptr<ItemGO> spItem = CreateItemFromLine(line);\r | |
114 | return spItem;\r | |
115 | }\r | |
116 | }\r | |
117 | return shared_ptr<ItemGO>();\r | |
118 | }\r | |
119 | \r | |
120 | shared_ptr<ItemGO> FileItemDAO::CreateItemFromLine(const string &line) const\r | |
121 | {\r | |
122 | assert(!line.empty());\r | |
123 | shared_ptr<ItemGO> spItem;\r | |
124 | map<Modifiers::Modifier, int> modifiers;\r | |
125 | boost::char_separator<char> sep("~", 0, boost::keep_empty_tokens);\r | |
126 | tokenizer tokens(line, sep);\r | |
127 | tokenizer::iterator tok_iter = tokens.begin();\r | |
128 | \r | |
129 | ItemTypes::ItemType type;\r | |
130 | \r | |
131 | try\r | |
132 | {\r | |
133 | type = ItemTypes::Parse((*tok_iter));\r | |
134 | }\r | |
135 | catch (TypeException)\r | |
136 | {\r | |
137 | return shared_ptr<ItemGO>();\r | |
138 | }\r | |
139 | \r | |
140 | switch(type)\r | |
141 | {\r | |
142 | case ItemTypes::Weapon:\r | |
143 | spItem = shared_ptr<WeaponGO>(new WeaponGO());\r | |
144 | break;\r | |
145 | case ItemTypes::Armor:\r | |
146 | spItem = shared_ptr<ArmorGO>(new ArmorGO());\r | |
147 | break;\r | |
148 | case ItemTypes::Potion:\r | |
149 | spItem = shared_ptr<PotionGO>(new PotionGO());\r | |
e823e42a | 150 | break;\r |
317ce8de | 151 | default:\r |
152 | throw DataLayerException(str(format("Unknown Item type: %1%") % type), __FILE__, __LINE__);\r | |
153 | }\r | |
154 | tok_iter++;\r | |
e823e42a | 155 | if (tok_iter == tokens.end())\r |
156 | {\r | |
157 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
158 | mFilename % line), __FILE__, __LINE__);\r | |
159 | }\r | |
317ce8de | 160 | spItem->Id(FileId::CreateItemId((*tok_iter)));\r |
161 | \r | |
162 | tok_iter++;\r | |
e823e42a | 163 | if (tok_iter == tokens.end())\r |
164 | {\r | |
165 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
166 | mFilename % line), __FILE__, __LINE__);\r | |
167 | }\r | |
317ce8de | 168 | spItem->Name((*tok_iter));\r |
169 | tok_iter++;\r | |
e823e42a | 170 | if (tok_iter == tokens.end())\r |
171 | {\r | |
172 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
173 | mFilename % line), __FILE__, __LINE__);\r | |
174 | }\r | |
317ce8de | 175 | spItem->Price(lexical_cast<unsigned long int>((*tok_iter)));\r |
176 | tok_iter++;\r | |
e823e42a | 177 | if (tok_iter == tokens.end())\r |
178 | {\r | |
179 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
180 | mFilename % line), __FILE__, __LINE__);\r | |
181 | }\r | |
317ce8de | 182 | spItem->Uses(lexical_cast<int>((*tok_iter)));\r |
183 | tok_iter++;\r | |
e823e42a | 184 | if (tok_iter == tokens.end())\r |
185 | {\r | |
186 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
187 | mFilename % line), __FILE__, __LINE__);\r | |
188 | }\r | |
317ce8de | 189 | modifiers[Modifiers::strength] = lexical_cast<int>((*tok_iter));\r |
190 | tok_iter++;\r | |
e823e42a | 191 | if (tok_iter == tokens.end())\r |
192 | {\r | |
193 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
194 | mFilename % line), __FILE__, __LINE__);\r | |
195 | }\r | |
317ce8de | 196 | modifiers[Modifiers::defense] = lexical_cast<int>((*tok_iter));\r |
197 | tok_iter++;\r | |
e823e42a | 198 | if (tok_iter == tokens.end())\r |
199 | {\r | |
200 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
201 | mFilename % line), __FILE__, __LINE__);\r | |
202 | }\r | |
317ce8de | 203 | modifiers[Modifiers::maxhp] = lexical_cast<int>((*tok_iter));\r |
204 | tok_iter++;\r | |
e823e42a | 205 | if (tok_iter == tokens.end())\r |
206 | {\r | |
207 | throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r | |
208 | mFilename % line), __FILE__, __LINE__);\r | |
209 | }\r | |
317ce8de | 210 | modifiers[Modifiers::hp] = lexical_cast<int>((*tok_iter));\r |
211 | tok_iter++;\r | |
e823e42a | 212 | if (tok_iter == tokens.end())\r |
213 | {\r | |
214 | return spItem;\r | |
215 | }\r | |
317ce8de | 216 | modifiers[Modifiers::forestfights] = lexical_cast<int>((*tok_iter));\r |
217 | tok_iter++;\r | |
e823e42a | 218 | if (tok_iter == tokens.end())\r |
219 | {\r | |
220 | return spItem;\r | |
221 | }\r | |
317ce8de | 222 | modifiers[Modifiers::playerfights] = lexical_cast<int>((*tok_iter));\r |
223 | tok_iter++;\r | |
e823e42a | 224 | if (tok_iter == tokens.end())\r |
225 | {\r | |
226 | return spItem;\r | |
227 | }\r | |
317ce8de | 228 | modifiers[Modifiers::gold] = lexical_cast<int>((*tok_iter));\r |
229 | tok_iter++;\r | |
e823e42a | 230 | if (tok_iter == tokens.end())\r |
231 | {\r | |
232 | return spItem;\r | |
233 | }\r | |
317ce8de | 234 | modifiers[Modifiers::bank] = lexical_cast<int>((*tok_iter));\r |
235 | spItem->Modifiers(modifiers);\r | |
236 | \r | |
237 | return spItem;\r | |
238 | }\r | |
239 | bool FileItemDAO::IdExists(const string &Id) const\r | |
240 | {\r | |
241 | map<string, shared_ptr<ItemGO> >::const_iterator iter;\r | |
242 | iter = spItemCache.find(Id);\r | |
243 | return (iter != spItemCache.end());\r | |
244 | }\r | |
245 | \r | |
246 | void FileItemDAO::LoadItemCache(void)\r | |
247 | {\r | |
248 | ifstream infile;\r | |
249 | infile.open(mFilename.c_str());\r | |
250 | \r | |
251 | if (infile.fail())\r | |
252 | {\r | |
253 | throw DataLayerException(str(format("Unable to open %1% for reading") % mFilename), __FILE__, __LINE__);\r | |
254 | }\r | |
255 | string line;\r | |
256 | while (getline(infile, line))\r | |
257 | {\r | |
258 | if (line.length() == 0)\r | |
259 | {\r | |
260 | continue;\r | |
261 | }\r | |
262 | if (line[0] == '#')\r | |
263 | {\r | |
264 | continue;\r | |
265 | }\r | |
266 | shared_ptr<ItemGO> spItem = CreateItemFromLine(line);\r | |
267 | if (spItem != 0)\r | |
268 | {\r | |
269 | spItemCache[spItem->Id()] = spItem;\r | |
270 | }\r | |
271 | }\r | |
272 | infile.close();\r | |
273 | }\r |