]> jfr.im git - irc/gameservirc.git/commitdiff
Almost have FilePlayerDAO 100% working
authorkainazzzo <redacted>
Wed, 16 Sep 2009 03:19:08 +0000 (03:19 +0000)
committerkainazzzo <redacted>
Wed, 16 Sep 2009 03:19:08 +0000 (03:19 +0000)
git-svn-id: https://svn.code.sf.net/p/gameservirc/code/trunk@522 bc333340-6410-0410-a689-9d09f3c113fa

gameserv-2.0/libgameservgldl/include/GameServ/DataLayer/File/FileId.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PlayerGO.h
gameserv-2.0/libgameservgldl/src/DataLayer/File/FileId.cpp
gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp
gameserv-2.0/libgameservgldl/src/DataLayer/File/FilePlayerDAO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PlayerGO.cpp
gameserv-2.0/testdriver/main.cpp

index fe93d669b3dd3b6ecfb90dc6f873c5a82122703c..b419b33f9b1bd3b1e02632b4030af44fc58f5167 100644 (file)
@@ -15,7 +15,6 @@ namespace GameServ { namespace DataLayer { namespace File {
                static string GetNameFromPlayerId(const string &Id);\r
 \r
                static string CreateItemId(const string &Number);\r
-               static ItemTypes::ItemType GetItemTypeFromId(const string &Id);\r
                static string GetItemNumberFromId(const string &Id);\r
        private:\r
                FileId();\r
index 47c83018625345b60a3f8a3c72c55e30f9ac3618..044607971d3664e01b8e313fce4c154d91624317 100644 (file)
@@ -19,7 +19,6 @@ using std::string;
 #include <vector>\r
 using std::vector;\r
 \r
-\r
 #include <boost/date_time/posix_time/posix_time.hpp>\r
 using boost::posix_time::ptime;\r
 \r
@@ -127,15 +126,15 @@ namespace GameServ { namespace GameLayer { namespace GameObjects
                void Alive(const bool &value);\r
 \r
                //! Property set - Inventory\r
-               void Inventory(const vector<string> &value);\r
+               void Inventory(const vector< shared_ptr<ItemGO> > &items);\r
 \r
                //! Property get - Inventory\r
-               vector<string> Inventory(void) const;\r
+               vector< shared_ptr<ItemGO> > Inventory(void) const;\r
 \r
                //! Add item to inventory\r
-               void AddItemToInventory(const string &fkItemId, const int &Number=1);\r
+               void AddItemToInventory(shared_ptr<ItemGO> spItem, const int &Number=1);\r
                //! Remove item from inventory\r
-               void RemoveItemFromInventory(const string &fkItemId, const int &Number=1);\r
+               void RemoveItemFromInventory(shared_ptr<ItemGO> spItem, const int &Number=1);\r
 \r
                bool operator==(const PlayerGO &right) const;\r
                bool operator!=(const PlayerGO &right) const;\r
@@ -162,7 +161,7 @@ namespace GameServ { namespace GameLayer { namespace GameObjects
                bool mFoughtMaster;\r
                bool mAlive;\r
 \r
-               vector<string> mfkItemIds;\r
+               vector< shared_ptr<ItemGO> > mItems;\r
        };\r
 }}} // GameServ::GameLayer::GameObjects\r
 #endif
\ No newline at end of file
index 999a17abf6a6da6519b087899bb28a44b45735f9..fe807ee182a1abc0e712f0263bfdc7583c8871e1 100644 (file)
@@ -40,19 +40,7 @@ string FileId::CreateItemId(const string &Number)
        return Number;\r
 }\r
 \r
-ItemTypes::ItemType FileId::GetItemTypeFromId(const string &Id)\r
-{\r
-       size_t colon = Id.find_first_of(":");\r
-       if (colon == string::npos)\r
-               throw GameServException(str(format("Invalid Item ID %1%") % Id), __FILE__, __LINE__);\r
-       \r
-       return ItemTypes::Parse(Id.substr(0, colon));\r
-}\r
-\r
 string FileId::GetItemNumberFromId(const string &Id)\r
 {\r
-       size_t colon = Id.find_first_of(":");\r
-       if (colon == string::npos)\r
-               throw GameServException(str(format("Invalid Item ID %1%") % Id), __FILE__, __LINE__);\r
-       return Id.substr(colon + 1);\r
+       return Id;\r
 }\r
index a98a450bd7e3ec61fd99a25f8afa88b8979f7803..ed6bca78edc0d5e9cc3330e99c80ceaa114ae4c6 100644 (file)
@@ -47,7 +47,7 @@ using std::endl;
 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
@@ -147,33 +147,90 @@ shared_ptr<ItemGO> FileItemDAO::CreateItemFromLine(const string &line) const
                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
index 716663e791734e9a85b787307e4c9e0ec9d6b3eb..d40108829a7f94132fbc9fc2b48e02903e9400e7 100644 (file)
@@ -46,7 +46,7 @@ using std::endl;
 #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
@@ -115,26 +115,13 @@ string FilePlayerDAO::GetPlayerFilePath() const
 \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
@@ -151,33 +138,99 @@ shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) con
        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
@@ -192,19 +245,51 @@ shared_ptr<PlayerGO> FilePlayerDAO::CreatePlayerFromLine(const string &line) con
        \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
@@ -215,11 +300,21 @@ string FilePlayerDAO::CreateLineFromPlayer(shared_ptr<PlayerGO> spPlayer) const
 {\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
@@ -291,14 +386,15 @@ void FilePlayerDAO::Insert(shared_ptr<PlayerGO> spPlayer)
                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
index 846f33294c002d15952f7ee59b10bc5bdc7de879..28206fa8de16e5eb2a3377c5b0ac91e31b040027 100644 (file)
@@ -224,37 +224,35 @@ ptime PlayerGO::LastLogin(void) const
        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
index 0616d44fbb1ac80eb5126b54cc3ab20cac363973..5c962a3d5d97f6ba08efd77c30b454fa68e0a0f5 100644 (file)
@@ -15,6 +15,8 @@ int main()
                PlayerGL pgl;\r
                shared_ptr<PlayerGO> spPlayer = pgl.GetById("Kain");\r
                cout << spPlayer->Name() << endl;\r
+               spPlayer->Name("Kainazzzo");\r
+               pgl.Insert(spPlayer);\r
        }\r
        catch (GameServException &e)\r
        {\r