]> jfr.im git - irc/gameservirc.git/blame - gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp
Almost have FilePlayerDAO 100% working
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / DataLayer / File / FileItemDAO.cpp
CommitLineData
317ce8de 1#include <GameServ/DataLayer/File/FileItemDAO.h>\r
2using GameServ::DataLayer::File::FileItemDAO;\r
3#include <GameServ/GameLayer/GameObjects/ItemGO.h>\r
4using GameServ::GameLayer::GameObjects::ItemGO;\r
5#include <GameServ/GameLayer/GameObjects/ArmorGO.h>\r
6using GameServ::GameLayer::GameObjects::ArmorGO;\r
7#include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
8using GameServ::GameLayer::GameObjects::WeaponGO;\r
9#include <GameServ/GameLayer/GameObjects/PotionGO.h>\r
10using GameServ::GameLayer::GameObjects::PotionGO;\r
11\r
12#include <GameServ/DataLayer/DataLayerExceptions.h>\r
13using GameServ::DataLayer::Exceptions::ResourceException;\r
14using GameServ::DataLayer::Exceptions::DataLayerException;\r
15\r
16#include <GameServ/DataLayer/File/FileId.h>\r
17using GameServ::DataLayer::File::FileId;\r
18\r
19#include <GameServ/Types.h>\r
20using GameServ::Types::ItemTypes;\r
21using GameServ::Types::Modifiers;\r
22using 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
28using boost::shared_ptr;\r
29using boost::format;\r
30using boost::str;\r
31using boost::algorithm::to_upper;\r
32using boost::lexical_cast;\r
33#include <boost/tokenizer.hpp>\r
34typedef boost::tokenizer<boost::char_separator<char> > \r
35 tokenizer;\r
36\r
37#include <string>\r
38using std::string;\r
39\r
40#include <fstream>\r
41using std::ifstream;\r
42using std::getline;\r
43using std::ofstream;\r
44using std::endl;\r
45\r
46#include <map>\r
47using std::map;\r
48\r
49// TODO: Switch filename to be loaded from a config file\r
e823e42a 50FileItemDAO::FileItemDAO() : mFilename("data\\items\\masteritems.dat")\r
317ce8de 51{\r
52 Initialize(GetItemFilePath());\r
53}\r
54\r
55FileItemDAO::FileItemDAO(const string &filename)\r
56{\r
57 Initialize(filename);\r
58}\r
59\r
60FileItemDAO::~FileItemDAO()\r
61{\r
62}\r
63\r
64void FileItemDAO::Initialize(const string &filename)\r
65{\r
66 mFilename = filename;\r
67 LoadItemCache();\r
68}\r
69\r
70string FileItemDAO::GetItemFilePath() const\r
71{\r
72 return mFilename;\r
73}\r
74\r
75shared_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
120shared_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
239bool 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
246void 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