]>
jfr.im git - irc/gameservirc.git/blob - gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp
1 #include <GameServ/DataLayer/File/FileItemDAO.h>
2 using GameServ::DataLayer::File::FileItemDAO
;
3 #include <GameServ/GameLayer/GameObjects/ItemGO.h>
4 using GameServ::GameLayer::GameObjects::ItemGO
;
5 #include <GameServ/GameLayer/GameObjects/ArmorGO.h>
6 using GameServ::GameLayer::GameObjects::ArmorGO
;
7 #include <GameServ/GameLayer/GameObjects/WeaponGO.h>
8 using GameServ::GameLayer::GameObjects::WeaponGO
;
9 #include <GameServ/GameLayer/GameObjects/PotionGO.h>
10 using GameServ::GameLayer::GameObjects::PotionGO
;
12 #include <GameServ/DataLayer/DataLayerExceptions.h>
13 using GameServ::DataLayer::Exceptions::ResourceException
;
14 using GameServ::DataLayer::Exceptions::DataLayerException
;
16 #include <GameServ/DataLayer/File/FileId.h>
17 using GameServ::DataLayer::File::FileId
;
19 #include <GameServ/Types.h>
20 using GameServ::Types::ItemTypes
;
21 using GameServ::Types::Modifiers
;
22 using GameServ::Types::Exceptions::TypeException
;
24 #include <boost/shared_ptr.hpp>
25 #include <boost/format.hpp>
26 #include <boost/algorithm/string.hpp>
27 #include <boost/lexical_cast.hpp>
28 using boost::shared_ptr
;
31 using boost::algorithm::to_upper
;
32 using boost::lexical_cast
;
33 #include <boost/tokenizer.hpp>
34 typedef boost::tokenizer
<boost::char_separator
<char> >
49 // TODO: Switch filename to be loaded from a config file
50 FileItemDAO::FileItemDAO() : mFilename("data/items/masteritems.dat")
52 Initialize(GetItemFilePath());
55 FileItemDAO::FileItemDAO(const string
&filename
)
60 FileItemDAO::~FileItemDAO()
64 void FileItemDAO::Initialize(const string
&filename
)
70 string
FileItemDAO::GetItemFilePath() const
75 shared_ptr
<ItemGO
> FileItemDAO::GetById(const string
&Id
) const
79 infile
.open(GetItemFilePath().c_str());
83 throw ResourceException(str(format("Unable to open file %1%") % GetItemFilePath()), __FILE__
, __LINE__
);
87 while (getline(infile
, line
))
97 size_t tilde1
= line
.find_first_of("~");
98 if (tilde1
== string::npos
)
100 throw DataLayerException(str(format("Invalid Item in %1%: %2%") % mFilename
% line
), __FILE__
,
103 size_t tilde2
= line
.find_first_of("~", tilde1
+ 1);
104 if (tilde2
== string::npos
)
106 throw DataLayerException(str(format("Invalid Item in %1%: %2%") % mFilename
% line
), __FILE__
,
109 string lineId
= FileId::CreateItemId(line
.substr(tilde1
+ 1, tilde2
- tilde1
- 1));
113 shared_ptr
<ItemGO
> spItem
= CreateItemFromLine(line
);
117 return shared_ptr
<ItemGO
>();
120 shared_ptr
<ItemGO
> FileItemDAO::CreateItemFromLine(const string
&line
) const
122 assert(!line
.empty());
123 shared_ptr
<ItemGO
> spItem
;
124 map
<Modifiers::Modifier
, int> modifiers
;
125 boost::char_separator
<char> sep("~", 0, boost::keep_empty_tokens
);
126 tokenizer
tokens(line
, sep
);
127 tokenizer::iterator tok_iter
= tokens
.begin();
129 ItemTypes::ItemType type
;
133 type
= ItemTypes::Parse((*tok_iter
));
135 catch (TypeException
)
137 return shared_ptr
<ItemGO
>();
142 case ItemTypes::Weapon
:
143 spItem
= shared_ptr
<WeaponGO
>(new WeaponGO());
145 case ItemTypes::Armor
:
146 spItem
= shared_ptr
<ArmorGO
>(new ArmorGO());
148 case ItemTypes::Potion
:
149 spItem
= shared_ptr
<PotionGO
>(new PotionGO());
151 throw DataLayerException(str(format("Unknown Item type: %1%") % type
), __FILE__
, __LINE__
);
154 spItem
->Id(FileId::CreateItemId((*tok_iter
)));
157 spItem
->Name((*tok_iter
));
159 spItem
->Price(lexical_cast
<unsigned long int>((*tok_iter
)));
161 spItem
->Uses(lexical_cast
<int>((*tok_iter
)));
163 modifiers
[Modifiers::strength
] = lexical_cast
<int>((*tok_iter
));
165 modifiers
[Modifiers::defense
] = lexical_cast
<int>((*tok_iter
));
167 modifiers
[Modifiers::maxhp
] = lexical_cast
<int>((*tok_iter
));
169 modifiers
[Modifiers::hp
] = lexical_cast
<int>((*tok_iter
));
171 modifiers
[Modifiers::forestfights
] = lexical_cast
<int>((*tok_iter
));
173 modifiers
[Modifiers::playerfights
] = lexical_cast
<int>((*tok_iter
));
175 modifiers
[Modifiers::gold
] = lexical_cast
<int>((*tok_iter
));
177 modifiers
[Modifiers::bank
] = lexical_cast
<int>((*tok_iter
));
178 spItem
->Modifiers(modifiers
);
182 bool FileItemDAO::IdExists(const string
&Id
) const
184 map
<string
, shared_ptr
<ItemGO
> >::const_iterator iter
;
185 iter
= spItemCache
.find(Id
);
186 return (iter
!= spItemCache
.end());
189 void FileItemDAO::LoadItemCache(void)
192 infile
.open(mFilename
.c_str());
196 throw DataLayerException(str(format("Unable to open %1% for reading") % mFilename
), __FILE__
, __LINE__
);
199 while (getline(infile
, line
))
201 if (line
.length() == 0)
209 shared_ptr
<ItemGO
> spItem
= CreateItemFromLine(line
);
212 spItemCache
[spItem
->Id()] = spItem
;