]>
jfr.im git - irc/gameservirc.git/blob - gameserv-2.0/libgameservgldl/src/DataLayer/File/FileArmorDAO.cpp
1 #include <GameServ/DataLayer/File/FileArmorDAO.h>
2 using GameServ::DataLayer::File::FileArmorDAO
;
3 #include <GameServ/GameLayer/GameObjects/ArmorGO.h>
4 using GameServ::GameLayer::GameObjects::ArmorGO
;
6 #include <GameServ/DataLayer/DataLayerExceptions.h>
7 using GameServ::DataLayer::Exceptions::ResourceException
;
8 using GameServ::DataLayer::Exceptions::DataLayerException
;
10 #include <GameServ/DataLayer/File/FileId.h>
11 using GameServ::DataLayer::File::FileId
;
13 #include <GameServ/Types.h>
14 using GameServ::Types::ItemTypes
;
15 using GameServ::Types::Modifiers
;
17 #include <boost/shared_ptr.hpp>
18 #include <boost/format.hpp>
19 #include <boost/algorithm/string.hpp>
20 #include <boost/lexical_cast.hpp>
21 using boost::shared_ptr
;
24 using boost::algorithm::to_upper
;
25 using boost::lexical_cast
;
26 #include <boost/tokenizer.hpp>
27 typedef boost::tokenizer
<boost::char_separator
<char> >
42 // TODO: Switch filename to be loaded from a config file
43 FileArmorDAO::FileArmorDAO() : mFilename("data/items/masteritems.dat")
45 Initialize(GetArmorFilePath());
48 FileArmorDAO::FileArmorDAO(const string
&filename
)
53 FileArmorDAO::~FileArmorDAO()
57 void FileArmorDAO::Initialize(const string
&filename
)
63 string
FileArmorDAO::GetArmorFilePath() const
68 shared_ptr
<ArmorGO
> FileArmorDAO::GetById(const string
&Id
) const
72 infile
.open(GetArmorFilePath().c_str());
76 throw ResourceException(str(format("Unable to open file %1%") % GetArmorFilePath()), __FILE__
, __LINE__
);
80 while (getline(infile
, line
))
82 shared_ptr
<ArmorGO
> spArmor
= CreateArmorFromLine(line
);
83 if (spArmor
->Id() == Id
)
88 return shared_ptr
<ArmorGO
>();
91 shared_ptr
<ArmorGO
> FileArmorDAO::CreateArmorFromLine(const string
&line
) const
93 assert(!line
.empty());
94 shared_ptr
<ArmorGO
> spArmor
;
95 map
<Modifiers::Modifier
, int> modifiers
;
96 spArmor
= shared_ptr
<ArmorGO
>(new ArmorGO());
97 boost::char_separator
<char> sep("~", 0, boost::keep_empty_tokens
);
98 tokenizer
tokens(line
, sep
);
99 tokenizer::iterator tok_iter
= tokens
.begin();
100 if ((*tok_iter
) != "2")
101 return shared_ptr
<ArmorGO
>();
103 spArmor
->Id(FileId::CreateItemId(ItemTypes::Armor
, (*tok_iter
)));
106 spArmor
->Name((*tok_iter
));
108 spArmor
->Price(lexical_cast
<unsigned long int>((*tok_iter
)));
110 spArmor
->Uses(lexical_cast
<int>((*tok_iter
)));
112 modifiers
[Modifiers::strength
] = lexical_cast
<int>((*tok_iter
));
114 modifiers
[Modifiers::defense
] = lexical_cast
<int>((*tok_iter
));
116 modifiers
[Modifiers::maxhp
] = lexical_cast
<int>((*tok_iter
));
118 modifiers
[Modifiers::hp
] = lexical_cast
<int>((*tok_iter
));
120 modifiers
[Modifiers::forestfights
] = lexical_cast
<int>((*tok_iter
));
122 modifiers
[Modifiers::playerfights
] = lexical_cast
<int>((*tok_iter
));
124 modifiers
[Modifiers::gold
] = lexical_cast
<int>((*tok_iter
));
126 modifiers
[Modifiers::bank
] = lexical_cast
<int>((*tok_iter
));
127 spArmor
->Modifiers(modifiers
);
131 bool FileArmorDAO::IdExists(const string
&Id
) const
133 map
<string
, shared_ptr
<ArmorGO
> >::const_iterator iter
;
134 iter
= spArmorCache
.find(Id
);
135 return (iter
!= spArmorCache
.end());
138 void FileArmorDAO::LoadArmorCache(void)
141 infile
.open(mFilename
.c_str());
145 throw DataLayerException(str(format("Unable to open %1% for reading") % mFilename
), __FILE__
, __LINE__
);
148 while (getline(infile
, line
))
150 if (line
.length() == 0)
158 shared_ptr
<ArmorGO
> spArmor
= CreateArmorFromLine(line
);
161 spArmorCache
[spArmor
->Id()] = spArmor
;