using GameServ::DataLayer::DataAccessObjects::IPlayerDAO;\r
#include <GameServ/DataLayer/IArmorDAO.h>\r
using GameServ::DataLayer::DataAccessObjects::IArmorDAO;\r
+#include <GameServ/DataLayer/IWeaponDAO.h>\r
+using GameServ::DataLayer::DataAccessObjects::IWeaponDAO;\r
\r
#include <boost/smart_ptr/shared_ptr.hpp>\r
using boost::shared_ptr;\r
\r
virtual shared_ptr<IPlayerDAO> GetPlayerDAO(void) const;\r
virtual shared_ptr<IArmorDAO> GetArmorDAO(void) const;\r
+ virtual shared_ptr<IWeaponDAO> GetWeaponDAO(void) const;\r
+\r
private:\r
\r
\r
--- /dev/null
+#ifndef __GS__FILEWEAPONDAO_H__\r
+#define __GS__FILEWEAPONDAO_H__\r
+\r
+#include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
+#include <GameServ/DataLayer/IWeaponDAO.h>\r
+using GameServ::GameLayer::GameObjects::WeaponGO;\r
+using GameServ::DataLayer::DataAccessObjects::IWeaponDAO;\r
+\r
+#include <boost/shared_ptr.hpp>\r
+using boost::shared_ptr;\r
+\r
+#include <string>\r
+using std::string;\r
+\r
+#include <list>\r
+using std::list;\r
+\r
+#include <map>\r
+using std::map;\r
+\r
+namespace GameServ { namespace DataLayer { namespace File\r
+{\r
+ //! File implementation of IWeaponDAO interface\r
+ /*!\r
+ If you're using an File datasource, you will be using this\r
+ DAO to access Weapons.\r
+ */\r
+ class FileWeaponDAO : public IWeaponDAO\r
+ {\r
+ public:\r
+ // Ctors, Dtors ///////////////////////////////////////////////////////\r
+ FileWeaponDAO(void);\r
+ FileWeaponDAO(const string &filename);\r
+ virtual ~FileWeaponDAO();\r
+\r
+ // Methods ////////////////////////////////////////////////////////////\r
+ virtual shared_ptr<WeaponGO> GetById(const string &Id) const;\r
+\r
+ virtual bool IdExists(const string &Id) const;\r
+\r
+ void LoadWeaponCache(void);\r
+\r
+ private:\r
+ //! Data file\r
+ string mFilename;\r
+\r
+ // Helper Methods /////////////////////////////////////////////////////\r
+\r
+ //! Creates the WeaponGO found at iterator position\r
+ shared_ptr<WeaponGO> CreateWeaponFromLine(const string &line) const;\r
+\r
+ //! Get the Weapon database file path\r
+ string GetWeaponFilePath(void) const;\r
+\r
+ void Initialize(const string &filename);\r
+\r
+\r
+ map<string, shared_ptr<WeaponGO> > spWeaponCache;\r
+ };\r
+} } } // GameServ.DataLayer.DataAccessObjects.File\r
+\r
+#endif // __GS__FileWeaponDAO_H__\r
using GameServ::DataLayer::DataAccessObjects::IPlayerDAO;\r
#include <GameServ/DataLayer/IArmorDAO.h>\r
using GameServ::DataLayer::DataAccessObjects::IArmorDAO;\r
+#include <GameServ/DataLayer/IWeaponDAO.h>\r
+using GameServ::DataLayer::DataAccessObjects::IWeaponDAO;\r
\r
#include <boost/smart_ptr/shared_ptr.hpp>\r
using boost::shared_ptr;\r
//! Base abstract class, we need virtual dtor\r
virtual ~IDAOFactory(void) { }\r
\r
- //! Test DataAccessObject for all test related operations\r
+ //! Player DataAccessObject for all Player related operations\r
virtual shared_ptr<IPlayerDAO> GetPlayerDAO(void) const = 0;\r
\r
+ //! Armor DataAccessObject for all armor related operations\r
virtual shared_ptr<IArmorDAO> GetArmorDAO(void) const = 0;\r
\r
+ //! Weapon DataAccessObject for all weapon related operations\r
+ virtual shared_ptr<IWeaponDAO> GetWeaponDAO(void) const = 0;\r
+\r
private:\r
\r
};\r
--- /dev/null
+#ifndef __GS_IWEAPONDAO_H__\r
+#define __GS_IWEAPONDAO_H__\r
+\r
+#include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
+using GameServ::GameLayer::GameObjects::WeaponGO;\r
+\r
+#include <boost/shared_ptr.hpp>\r
+using boost::shared_ptr;\r
+\r
+#include <list>\r
+using std::list;\r
+#include <string>\r
+using std::string;\r
+\r
+namespace GameServ { namespace DataLayer { namespace DataAccessObjects\r
+{\r
+ //! Interface for Weapon Data Access Objects \r
+ /*! \r
+ This is the interface for all Weapon DAOs. Each specific datasource\r
+ will need to inherit this common interface.\r
+ */\r
+ class IWeaponDAO\r
+ {\r
+ public:\r
+ // Ctors, Dtors ///////////////////////////////////////////////////////\r
+ IWeaponDAO(void);\r
+ virtual ~IWeaponDAO(void); // Needs to be virtual \r
+\r
+ //! Get the Weapon using a unique data/object Id\r
+ /*!\r
+ \param Id Unique identifier\r
+ \return A boost shared pointer to a Weapon game object if found\r
+ otherwise the list is empty.\r
+ */\r
+ virtual shared_ptr<WeaponGO> GetById(const string &Id) const = 0;\r
+\r
+ //! Function to quickly search to see if an Id exists or not\r
+ /*!\r
+ \param Id The Id of the game object to search for\r
+ \return true if the Id is valid and exists in the data, false otherwise\r
+ */\r
+ virtual bool IdExists(const string &Id) const = 0;\r
+\r
+ private:\r
+ \r
+ \r
+ };\r
+} } }\r
+\r
+#endif
\ No newline at end of file
#include <string>\r
using std::string;\r
\r
+#include <GameServ/GameLayer/GameObjects/GameObject.h>\r
+using GameServ::GameLayer::GameObjects::GameObject;\r
+#include <GameServ/GameLayer/GameObjects/ItemGO.h>\r
+using GameServ::GameLayer::GameObjects::ItemGO;\r
+\r
namespace GameServ { namespace GameLayer { namespace GameObjects {\r
\r
class WeaponGO : public ItemGO\r
RelativePath=".\include\GameServ\DataLayer\IPlayerDAO.h"\r
>\r
</File>\r
+ <File\r
+ RelativePath=".\src\DataLayer\IWeaponDAO.cpp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\include\GameServ\DataLayer\IWeaponDAO.h"\r
+ >\r
+ </File>\r
<Filter\r
Name="File"\r
>\r
RelativePath=".\include\GameServ\DataLayer\File\FilePlayerDAO.h"\r
>\r
</File>\r
+ <File\r
+ RelativePath=".\src\DataLayer\File\FileWeaponDAO.cpp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\include\GameServ\DataLayer\File\FileWeaponDAO.h"\r
+ >\r
+ </File>\r
</Filter>\r
</Filter>\r
<Filter\r
#include <GameServ/DataLayer/File/FileDAOFactory.h>\r
#include <GameServ/DataLayer/File/FilePlayerDAO.h>\r
#include <GameServ/DataLayer/File/FileArmorDAO.h>\r
+#include <GameServ/DataLayer/File/FileWeaponDAO.h>\r
\r
using GameServ::DataLayer::File::FileDAOFactory;\r
using GameServ::DataLayer::File::FilePlayerDAO;\r
using GameServ::DataLayer::File::FileArmorDAO;\r
+using GameServ::DataLayer::File::FileWeaponDAO;\r
\r
#include <boost/smart_ptr/shared_ptr.hpp>\r
using boost::shared_ptr;\r
{\r
}\r
\r
-\r
shared_ptr<IPlayerDAO> FileDAOFactory::GetPlayerDAO(void) const\r
{\r
return shared_ptr<IPlayerDAO>(new FilePlayerDAO());\r
return shared_ptr<IArmorDAO>(new FileArmorDAO());\r
}\r
\r
-\r
+shared_ptr<IWeaponDAO> FileDAOFactory::GetWeaponDAO(void) const\r
+{\r
+ return shared_ptr<IWeaponDAO>(new FileWeaponDAO());\r
+}\r
using GameServ::DataLayer::File::FilePlayerDAO;\r
#include <GameServ/DataLayer/File/FileArmorDAO.h>\r
using GameServ::DataLayer::File::FileArmorDAO;\r
+#include <GameServ/DataLayer/File/FileWeaponDAO.h>\r
+using GameServ::DataLayer::File::FileWeaponDAO;\r
\r
#include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r
using GameServ::GameLayer::GameObjects::PlayerGO;\r
using boost::algorithm::to_upper;\r
using boost::algorithm::to_lower;\r
using boost::lexical_cast;\r
+using boost::bad_lexical_cast;\r
#include <boost/tokenizer.hpp>\r
typedef boost::tokenizer<boost::char_separator<char> > \r
tokenizer;\r
\r
#include <boost/date_time/posix_time/posix_time.hpp>\r
-using boost::posix_time::ptime;\r
+using namespace boost::posix_time;\r
\r
#include <time.h>\r
\r
\r
\r
tok_iter++;\r
- unsigned long int intlast = lexical_cast<unsigned long int>((*tok_iter));\r
- time_t t = (time_t)intlast;\r
- struct tm *tmlastlogin = localtime(&t);\r
- spPlayer->LastLogin(boost::posix_time::ptime_from_tm(*tmlastlogin));\r
+ try\r
+ {\r
+ unsigned long int intlast = lexical_cast<unsigned long int>((*tok_iter));\r
+ time_t t = (time_t)intlast;\r
+ spPlayer->LastLogin(from_time_t(t));\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ spPlayer->LastLogin(from_iso_string((*tok_iter)));\r
+ }\r
\r
\r
// Weapon\r
tok_iter++;\r
+ FileWeaponDAO wdao;\r
+ string weaponid = FileId::CreateItemId(ItemTypes::Weapon, (*tok_iter));\r
+ spPlayer->Weapon(wdao.GetById(weaponid));\r
\r
// Armor\r
tok_iter++;\r
FileArmorDAO adao;\r
string armorid = FileId::CreateItemId(ItemTypes::Armor, (*tok_iter));\r
- \r
+ spPlayer->Armor(adao.GetById(armorid));\r
\r
+ tok_iter++;\r
+ while (tok_iter != tokens.end())\r
+ {\r
+ // Load all the items into the player's inventory\r
+ tok_iter++;\r
+ }\r
\r
return spPlayer;\r
}\r
{\r
string line;\r
// TODO: Add weapons, armor, and items\r
- line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12% %13%") % \r
+ line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12% %13% %14%") % \r
spPlayer->Name() % spPlayer->Level() % spPlayer->Experience() % spPlayer->Gold() %\r
spPlayer->Bank() % spPlayer->Health() % spPlayer->MaxHealth() % spPlayer->Strength() %\r
spPlayer->Defense() % spPlayer->ForestFights() % spPlayer->PlayerFights() %\r
- GetFlags(spPlayer) % spPlayer->Password());\r
+ GetFlags(spPlayer) % spPlayer->Password() % (to_iso_string(spPlayer->LastLogin())));\r
return line;\r
}\r
\r
--- /dev/null
+#include <GameServ/DataLayer/File/FileWeaponDAO.h>\r
+using GameServ::DataLayer::File::FileWeaponDAO;\r
+#include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
+using GameServ::GameLayer::GameObjects::WeaponGO;\r
+\r
+#include <GameServ/DataLayer/DataLayerExceptions.h>\r
+using GameServ::DataLayer::Exceptions::ResourceException;\r
+using GameServ::DataLayer::Exceptions::DataLayerException;\r
+\r
+#include <GameServ/DataLayer/File/FileId.h>\r
+using GameServ::DataLayer::File::FileId;\r
+\r
+#include <GameServ/Types.h>\r
+using GameServ::Types::ItemTypes;\r
+using GameServ::Types::Modifiers;\r
+\r
+#include <boost/shared_ptr.hpp>\r
+#include <boost/format.hpp>\r
+#include <boost/algorithm/string.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+using boost::shared_ptr;\r
+using boost::format;\r
+using boost::str;\r
+using boost::algorithm::to_upper;\r
+using boost::lexical_cast;\r
+#include <boost/tokenizer.hpp>\r
+typedef boost::tokenizer<boost::char_separator<char> > \r
+ tokenizer;\r
+\r
+#include <string>\r
+using std::string;\r
+\r
+#include <fstream>\r
+using std::ifstream;\r
+using std::getline;\r
+using std::ofstream;\r
+using std::endl;\r
+\r
+#include <map>\r
+using std::map;\r
+\r
+// TODO: Switch filename to be loaded from a config file\r
+FileWeaponDAO::FileWeaponDAO() : mFilename("data/items/masteritems.dat")\r
+{\r
+ Initialize(GetWeaponFilePath());\r
+}\r
+\r
+FileWeaponDAO::FileWeaponDAO(const string &filename)\r
+{\r
+ Initialize(filename);\r
+}\r
+\r
+FileWeaponDAO::~FileWeaponDAO()\r
+{\r
+}\r
+\r
+void FileWeaponDAO::Initialize(const string &filename)\r
+{\r
+ mFilename = filename;\r
+ LoadWeaponCache();\r
+}\r
+\r
+string FileWeaponDAO::GetWeaponFilePath() const\r
+{\r
+ return mFilename;\r
+}\r
+\r
+shared_ptr<WeaponGO> FileWeaponDAO::GetById(const string &Id) const\r
+{\r
+ string line;\r
+ ifstream infile;\r
+ infile.open(GetWeaponFilePath().c_str());\r
+\r
+ if (infile.fail())\r
+ {\r
+ throw ResourceException(str(format("Unable to open file %1%") % GetWeaponFilePath()), __FILE__, __LINE__);\r
+ }\r
+\r
+\r
+ while (getline(infile, line))\r
+ {\r
+ shared_ptr<WeaponGO> spWeapon = CreateWeaponFromLine(line);\r
+ if (spWeapon->Id() == Id)\r
+ {\r
+ return spWeapon;\r
+ }\r
+ }\r
+ return shared_ptr<WeaponGO>();\r
+}\r
+\r
+shared_ptr<WeaponGO> FileWeaponDAO::CreateWeaponFromLine(const string &line) const\r
+{\r
+ assert(!line.empty());\r
+ shared_ptr<WeaponGO> spWeapon;\r
+ map<Modifiers::Modifier, int> modifiers;\r
+ spWeapon = shared_ptr<WeaponGO>(new WeaponGO());\r
+ boost::char_separator<char> sep("~", 0, boost::keep_empty_tokens);\r
+ tokenizer tokens(line, sep);\r
+ tokenizer::iterator tok_iter = tokens.begin();\r
+ if ((*tok_iter) != "1")\r
+ return shared_ptr<WeaponGO>();\r
+ tok_iter++;\r
+ spWeapon->Id(FileId::CreateItemId(ItemTypes::Weapon, (*tok_iter)));\r
+\r
+ tok_iter++;\r
+ spWeapon->Name((*tok_iter));\r
+ tok_iter++;\r
+ spWeapon->Price(lexical_cast<unsigned long int>((*tok_iter)));\r
+ tok_iter++;\r
+ spWeapon->Uses(lexical_cast<int>((*tok_iter)));\r
+ tok_iter++;\r
+ modifiers[Modifiers::strength] = lexical_cast<int>((*tok_iter));\r
+ tok_iter++;\r
+ modifiers[Modifiers::defense] = lexical_cast<int>((*tok_iter));\r
+ tok_iter++;\r
+ modifiers[Modifiers::maxhp] = lexical_cast<int>((*tok_iter));\r
+ tok_iter++;\r
+ modifiers[Modifiers::hp] = lexical_cast<int>((*tok_iter));\r
+ tok_iter++;\r
+ modifiers[Modifiers::forestfights] = lexical_cast<int>((*tok_iter));\r
+ tok_iter++;\r
+ modifiers[Modifiers::playerfights] = lexical_cast<int>((*tok_iter));\r
+ tok_iter++;\r
+ modifiers[Modifiers::gold] = lexical_cast<int>((*tok_iter));\r
+ tok_iter++;\r
+ modifiers[Modifiers::bank] = lexical_cast<int>((*tok_iter));\r
+ spWeapon->Modifiers(modifiers);\r
+\r
+ return spWeapon;\r
+}\r
+bool FileWeaponDAO::IdExists(const string &Id) const\r
+{\r
+ map<string, shared_ptr<WeaponGO> >::const_iterator iter;\r
+ iter = spWeaponCache.find(Id);\r
+ return (iter != spWeaponCache.end());\r
+}\r
+\r
+void FileWeaponDAO::LoadWeaponCache(void)\r
+{\r
+ ifstream infile;\r
+ infile.open(mFilename.c_str());\r
+\r
+ if (infile.fail())\r
+ {\r
+ throw DataLayerException(str(format("Unable to open %1% for reading") % mFilename), __FILE__, __LINE__);\r
+ }\r
+ string line;\r
+ while (getline(infile, line))\r
+ {\r
+ if (line.length() == 0)\r
+ {\r
+ continue;\r
+ }\r
+ if (line[0] == '#')\r
+ {\r
+ continue;\r
+ }\r
+ shared_ptr<WeaponGO> spWeapon = CreateWeaponFromLine(line);\r
+ if (spWeapon != 0)\r
+ {\r
+ spWeaponCache[spWeapon->Id()] = spWeapon;\r
+ }\r
+ }\r
+ infile.close();\r
+}\r
--- /dev/null
+#include <GameServ/DataLayer/IWeaponDAO.h>\r
+using GameServ::DataLayer::DataAccessObjects::IWeaponDAO;\r
+\r
+IWeaponDAO::IWeaponDAO()\r
+{\r
+}\r
+\r
+IWeaponDAO::~IWeaponDAO()\r
+{\r
+}
\ No newline at end of file