using std::map;\r
\r
// TODO: Switch filename to be loaded from a config file\r
-FileItemDAO::FileItemDAO() : mFilename("data/items/masteritems.dat")\r
+FileItemDAO::FileItemDAO() : mFilename("data\\items\\masteritems.dat")\r
{\r
Initialize(GetItemFilePath());\r
}\r
break;\r
case ItemTypes::Potion:\r
spItem = shared_ptr<PotionGO>(new PotionGO());\r
+ break;\r
default:\r
throw DataLayerException(str(format("Unknown Item type: %1%") % type), __FILE__, __LINE__);\r
}\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
spItem->Id(FileId::CreateItemId((*tok_iter)));\r
\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
spItem->Name((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
spItem->Price(lexical_cast<unsigned long int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
spItem->Uses(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
modifiers[Modifiers::strength] = lexical_cast<int>((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
modifiers[Modifiers::defense] = lexical_cast<int>((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
modifiers[Modifiers::maxhp] = lexical_cast<int>((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
+ mFilename % line), __FILE__, __LINE__);\r
+ }\r
modifiers[Modifiers::hp] = lexical_cast<int>((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ return spItem;\r
+ }\r
modifiers[Modifiers::forestfights] = lexical_cast<int>((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ return spItem;\r
+ }\r
modifiers[Modifiers::playerfights] = lexical_cast<int>((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ return spItem;\r
+ }\r
modifiers[Modifiers::gold] = lexical_cast<int>((*tok_iter));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ return spItem;\r
+ }\r
modifiers[Modifiers::bank] = lexical_cast<int>((*tok_iter));\r
spItem->Modifiers(modifiers);\r
\r
#include <map>\r
using std::map;\r
\r
-FilePlayerDAO::FilePlayerDAO() : mFilename("players.dat")\r
+FilePlayerDAO::FilePlayerDAO() : mFilename("data\\players.dat")\r
{\r
Initialize(GetPlayerFilePath());\r
}\r
\r
shared_ptr<PlayerGO> FilePlayerDAO::GetById(const string &Id) const\r
{\r
- string line;\r
- ifstream infile;\r
- infile.open(GetPlayerFilePath().c_str());\r
-\r
- if (infile.fail())\r
- {\r
- throw ResourceException(str(format("Unable to open file %1%") % GetPlayerFilePath()), __FILE__, __LINE__);\r
- }\r
-\r
+ map<string, shared_ptr<PlayerGO> >::const_iterator iter;\r
string id = Id;\r
to_lower(id);\r
- while (getline(infile, line))\r
+ iter = spPlayerCache.find(id);\r
+ if (iter != spPlayerCache.end())\r
{\r
- shared_ptr<PlayerGO> spPlayer = CreatePlayerFromLine(line);\r
- \r
- // No need to convert the playerId to lowercase here, because it should already be lowercase\r
- if (spPlayer->Id() == id)\r
- {\r
- return spPlayer;\r
- }\r
+ return iter->second;\r
}\r
return shared_ptr<PlayerGO>();\r
}\r
spPlayer->Name((*tok_iter));\r
spPlayer->Id(FileId::CreatePlayerId(spPlayer->Name()));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Level(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Experience(lexical_cast<unsigned long int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Gold(lexical_cast<unsigned long int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Bank(lexical_cast<unsigned long int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Health(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->MaxHealth(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Strength(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Defense(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->ForestFights(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->PlayerFights(lexical_cast<int>((*tok_iter)));\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
int flags = lexical_cast<int>((*tok_iter));\r
SetFlags(spPlayer, flags);\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
spPlayer->Password((*tok_iter));\r
\r
\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+\r
try\r
{\r
unsigned long int intlast = lexical_cast<unsigned long int>((*tok_iter));\r
\r
// Weapon\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
FileItemDAO idao;\r
string weaponid = FileId::CreateItemId((*tok_iter));\r
spPlayer->Weapon(boost::shared_static_cast<WeaponGO>(idao.GetById(weaponid)));\r
\r
// Armor\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
string armorid = FileId::CreateItemId((*tok_iter));\r
spPlayer->Armor(boost::shared_static_cast<ArmorGO>(idao.GetById(armorid)));\r
\r
tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt player line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
+ // Load all the items into the player's inventory\r
while (tok_iter != tokens.end())\r
{\r
- // Load all the items into the player's inventory\r
+ string itemid = FileId::CreateItemId((*tok_iter));\r
+ shared_ptr<ItemGO> spItem = idao.GetById(itemid);\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file: Missing item uses for item %2% on player %3%") % \r
+ mFilename % itemid % spPlayer->Name()), __FILE__, __LINE__);\r
+ }\r
+ try\r
+ {\r
+ spItem->Uses(lexical_cast<int>((*tok_iter)));\r
+ }\r
+ catch (bad_lexical_cast)\r
+ {\r
+ throw DataLayerException(str(format("Corrupt %1% file: Non integer item uses for item %2% on player %3%") %\r
+ mFilename % itemid % spPlayer->Name()), __FILE__, __LINE__);\r
+ }\r
tok_iter++;\r
}\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% %14%") % \r
+ line = str(format("%1% %2% %3% %4% %5% %6% %7% %8% %9% %10% %11% %12% %13% %14% %15% %16%") % \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() % (to_iso_string(spPlayer->LastLogin())));\r
+ GetFlags(spPlayer) % spPlayer->Password() % (to_iso_string(spPlayer->LastLogin())) %\r
+ FileId::GetItemNumberFromId(spPlayer->Weapon()->Id()) % FileId::GetItemNumberFromId(spPlayer->Armor()->Id()));\r
+\r
+ vector< shared_ptr<ItemGO> > items = spPlayer->Inventory();\r
+ vector< shared_ptr<ItemGO> >::const_iterator iter;\r
+ for (iter = items.begin(); iter != items.end(); iter++)\r
+ {\r
+ shared_ptr<ItemGO> spItem = (*iter);\r
+ line += " " + FileId::GetItemNumberFromId(spItem->Id()) + " " + lexical_cast<string>(spItem->Uses());\r
+ }\r
+\r
return line;\r
}\r
\r
string id = spPlayer->Id();\r
to_lower(id);\r
spPlayerCache[id] = spPlayer;\r
- ofstream outfile;\r
+ /*ofstream outfile;\r
outfile.open(mFilename.c_str(), std::ios::app);\r
if (outfile.fail())\r
{\r
throw ResourceException(str(format("Unable to open %1% for appending.") % mFilename), __FILE__, __LINE__);\r
}\r
outfile << CreateLineFromPlayer(spPlayer) << endl;\r
- outfile.close();\r
+ outfile.close();*/\r
+ WritePlayerCache();\r
}\r
else\r
{\r
return mLastLogin;\r
}\r
\r
-\r
-void PlayerGO::Inventory(const vector<string> &value)\r
+void PlayerGO::Inventory(const vector< shared_ptr<ItemGO> > &items)\r
{\r
- mfkItemIds.clear();\r
- mfkItemIds.insert(mfkItemIds.begin(), value.begin(), value.end());\r
+ mItems.clear();\r
+ mItems.insert(mItems.begin(), items.begin(), items.end());\r
}\r
\r
-vector<string> PlayerGO::Inventory(void) const\r
+vector< shared_ptr<ItemGO> > PlayerGO::Inventory(void) const\r
{\r
- return mfkItemIds;\r
+ return mItems;\r
}\r
\r
-\r
-void PlayerGO::AddItemToInventory(const string &fkItemId, const int &Number)\r
+void PlayerGO::AddItemToInventory(shared_ptr<ItemGO> spItem, const int &Number)\r
{\r
for (int x = 0; x < Number; ++x)\r
{\r
- mfkItemIds.push_back(fkItemId);\r
+ shared_ptr<ItemGO> item = shared_ptr<ItemGO>(new ItemGO(*spItem->Clone()));\r
+ mItems.push_back(item);\r
}\r
- sort(mfkItemIds.begin(), mfkItemIds.end());\r
}\r
\r
-void PlayerGO::RemoveItemFromInventory(const string &fkItemId, const int &Number)\r
+void PlayerGO::RemoveItemFromInventory(shared_ptr<ItemGO> spItem, const int &Number)\r
{\r
- vector<string>::iterator iter;\r
+ vector< shared_ptr<ItemGO> >::iterator iter;\r
for (int x = 0; x < Number; ++x)\r
{\r
- iter = find(mfkItemIds.begin(), mfkItemIds.end(), fkItemId);\r
- if (iter != mfkItemIds.end())\r
+ iter = find(mItems.begin(), mItems.end(), spItem);\r
+ if (iter != mItems.end())\r
{\r
- mfkItemIds.erase(iter);\r
+ mItems.erase(iter);\r
}\r
else\r
{\r