]> jfr.im git - irc/gameservirc.git/commitdiff
Changed the ItemGO class to be abstract so you cannot define a simple ItemGO object...
authorkainazzzo <redacted>
Fri, 18 Sep 2009 17:05:09 +0000 (17:05 +0000)
committerkainazzzo <redacted>
Fri, 18 Sep 2009 17:05:09 +0000 (17:05 +0000)
Added an ObjectType to all GameObjects to be able to distinguish between them before any casts are made.
Added some more output to testdriver/main.cpp

git-svn-id: https://svn.code.sf.net/p/gameservirc/code/trunk@528 bc333340-6410-0410-a689-9d09f3c113fa

19 files changed:
gameserv-2.0/data/players.dat
gameserv-2.0/libgameservcore/include/GameServ/Types.h
gameserv-2.0/libgameservcore/src/Types.cpp
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ArmorGO.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/GameObject.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ItemGO.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MasterGO.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MonsterGO.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PlayerGO.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PotionGO.h
gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/WeaponGO.h
gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ArmorGO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ItemGO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/MasterGO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PlayerGO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PotionGO.cpp
gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/WeaponGO.cpp
gameserv-2.0/testdriver/main.cpp

index abaee08942fb14d0d55857b3a5937cef460a4ef7..889f40e2c6c1d1656c11e2cb160738c2c36eb25a 100644 (file)
@@ -1,2 +1 @@
-Kain 1 1 100 0 10 10 10 10 100 3 0 test 19730303T094640 1 3001 3001 -1 1 -1 3002 -1 6001 1 6002 1 6003 1\r
-Kainazzzo 1 1 100 0 10 10 10 10 100 3 0 test 19730303T094640 1 3001 3001 -1 1 -1 3002 -1 6001 1 6002 1 6003 1\r
+Kain 1 1 100 0 10 10 10 10 100 3 0 test 19730303T094640 1 3001 3001 -1 1 -1 3002 -1 6001 1 6002 1 6003 1
\ No newline at end of file
index 83e6bd99e8e5d7a6cc57586301d5a3356a18ac41..1d8fcfcd6d215e135a7346fde8da6835f2458feb 100644 (file)
@@ -51,6 +51,33 @@ namespace GameServ
 \r
                }; // ItemTypes class\r
 \r
+               class ObjectTypes\r
+               {\r
+               public:\r
+                       //! Logical ObjectType enumerator\r
+                       enum ObjectType \r
+                       { \r
+                               Player, Item, Level, Master, Monster\r
+                       };\r
+\r
+                       //! Get the name of an object type\r
+                       static string GetName(ObjectType objecttype);\r
+\r
+                       //! Parse the name and return the enumeration value\r
+                       static ObjectType Parse(const string &objecttype);\r
+\r
+               private:\r
+                       //! Internal struct to hold type information statically in a table\r
+                       typedef struct objecttypeinfo\r
+                       {\r
+                               ObjectTypes::ObjectType objecttype;     //!< The ObjectType enumeration value\r
+                               string name;                            //!< The Name of the type\r
+                       } objecttypeinfo;\r
+\r
+                       static const objecttypeinfo mObjectTypeInfoTable[];\r
+\r
+               }; // ObjectTypes class\r
+\r
                class Modifiers\r
                {\r
                public:\r
@@ -95,10 +122,14 @@ namespace GameServ
 \r
                        //! Property set - Low\r
                        void Low(const int &value);\r
+\r
+                       //! Property get - Last random number to be generated\r
+                       int LastRandom(void) const;\r
                        \r
                private:\r
                        int mHigh;\r
                        int mLow;\r
+                       int mLastRandom;\r
                };\r
        } \r
 }\r
index d99923fc7814fb14a6507871a07f5229a2ae8ee4..fd5c059e391f118b2150e4b7ea65a944fc9889d3 100644 (file)
@@ -2,6 +2,7 @@
 using GameServ::Types::ItemTypes;\r
 using GameServ::Types::Modifiers;\r
 using GameServ::Types::Range;\r
+using GameServ::Types::ObjectTypes;\r
 using GameServ::Types::Exceptions::TypeException;\r
 \r
 #include <string>\r
@@ -49,7 +50,7 @@ TypeException::TypeException(void)
 \r
 const ItemTypes::itemtypeinfo ItemTypes::mItemTypeInfoTable[] =\r
 {\r
-       { Weapon, "Weapon" }, { Armor, "Armor" }, { Potion, "Potion"}\r
+       { Weapon, "Weapon" }, { Armor, "Armor" }, { Potion, "Potion"}, { NOTYPE, "NOTYPE" }\r
 }; // mItemTypeInfoTable[]\r
 \r
 string ItemTypes::GetName(ItemTypes::ItemType itemtype)\r
@@ -76,13 +77,47 @@ ItemTypes::ItemType ItemTypes::Parse(const string &itemtype)
                        return mItemTypeInfoTable[i].itemtype;\r
                }\r
        }\r
-       return ItemTypes::NOTYPE;\r
+       throw TypeException(str(format("No itemtype enumeration found for %1%") % itemtype), __FILE__, __LINE__);\r
 }\r
 \r
+const ObjectTypes::objecttypeinfo ObjectTypes::mObjectTypeInfoTable[] =\r
+{\r
+       { Player, "Player" }, { Level, "Level" }, { Item, "Item" },\r
+       { Master, "Master" }, { Monster, "Monster" }\r
+}; // mObjectTypeInfoTable[]\r
+\r
+string ObjectTypes::GetName(ObjectTypes::ObjectType objecttype)\r
+{\r
+       for (unsigned int i = 0; i < sizeof(mObjectTypeInfoTable) / sizeof(objecttypeinfo); i++)\r
+       {\r
+               if (mObjectTypeInfoTable[i].objecttype == objecttype)\r
+               {\r
+                       return mObjectTypeInfoTable[i].name;\r
+               }\r
+       }\r
+\r
+       // This should never happen because an enumeration is passed, but in the case where a user\r
+       // may attempt an invalid integer cast, it provides protection\r
+       throw TypeException(str(format("No object type found for %1% enumeration value") % objecttype).c_str());\r
+}\r
+\r
+ObjectTypes::ObjectType ObjectTypes::Parse(const string &objecttype)\r
+{\r
+       for (unsigned int i = 0; i < sizeof(mObjectTypeInfoTable) / sizeof(objecttypeinfo); i++)\r
+       {\r
+               if (mObjectTypeInfoTable[i].name == objecttype)\r
+               {\r
+                       return mObjectTypeInfoTable[i].objecttype;\r
+               }\r
+       }\r
+       throw TypeException(str(format("No object type enumeration found for %1%") % objecttype), __FILE__, __LINE__);\r
+}\r
+\r
+\r
 const Modifiers::modifierinfo Modifiers::mModifierInfoTable[] =\r
 {\r
-       { strength, "Strength"}, { defense, "Defense" }, { maxhealth, "MaxHealth" }, { health, "Health" }, { forestfights, "Forest Fights" },\r
-       { playerfights, "Player Fights" }, { gold, "Gold" }, { bank, "Bank" }\r
+       { strength, "Strength"}, { defense, "Defense" }, { maxhealth, "MaxHealth" }, { health, "Health" }, { forestfights, "ForestFights" },\r
+       { playerfights, "PlayerFights" }, { gold, "Gold" }, { bank, "Bank" }\r
 };\r
 \r
 string Modifiers::GetName(Modifiers::Modifier modifier)\r
@@ -117,16 +152,21 @@ Range::Range()
 {\r
        mHigh = 0;\r
        mLow = 0;\r
+       mLastRandom = 0;\r
 }\r
 \r
 Range::Range(const int &high, const int &low)\r
 {\r
        mHigh = high;\r
        mLow = low;\r
+       mLastRandom = 0;\r
 }\r
 \r
 Range::~Range()\r
 {\r
+       mHigh = 0;\r
+       mLow = 0;\r
+       mLastRandom = 0;\r
 }\r
 \r
 void Range::High(const int &value)\r
@@ -156,5 +196,11 @@ int Range::Random()
        static base_generator_type generator(static_cast<int>(std::time(0)));\r
        boost::uniform_int<> uni_dist(mHigh, mLow);\r
        boost::variate_generator<base_generator_type&, boost::uniform_int<> > uni(generator, uni_dist);\r
-       return static_cast<int>(uni());\r
+       mLastRandom = uni();\r
+       return mLastRandom;\r
+}\r
+\r
+int Range::LastRandom(void) const\r
+{\r
+       return mLastRandom;\r
 }
\ No newline at end of file
index aaae64f26106282693dde63d97762977879afc88..cd127b95e4d3fd0afc2e2073e0cb3209b39c3804 100644 (file)
@@ -16,6 +16,9 @@ public:
        ArmorGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth);\r
        virtual ~ArmorGO();\r
 \r
+       virtual ItemTypes::ItemType Type(void) const;\r
+       virtual ArmorGO *Clone(void) const;\r
+\r
 private:\r
 };\r
 \r
index 2bf44427490787125f9af74d425a7338cb547e04..f6d5335a4a9936d52a2458144c0fa72332954470 100644 (file)
@@ -1,5 +1,9 @@
 #ifndef __GS__GAMEOBJECT_H__\r
 #define __GS__GAMEOBJECT_H__\r
+\r
+#include <GameServ/Types.h>\r
+using GameServ::Types::ObjectTypes;\r
+\r
 #include <functional>\r
 #include <string>\r
 using std::string;\r
@@ -29,9 +33,12 @@ namespace GameServ { namespace GameLayer { namespace GameObjects
                */\r
                virtual GameObject *Clone(void) const = 0;\r
 \r
+               virtual ObjectTypes::ObjectType ObjectType(void) const = 0;\r
+\r
                bool operator==(const GameObject &right) const;\r
                bool operator!=(const GameObject &right) const;\r
 \r
+\r
        protected:\r
                string mId;\r
                friend class GameObjectIds_Eq;\r
index 534eaf0610d0530ca7350154484051520d07437f..3e23295b451334321685b87891c6c2d7e15f09b6 100644 (file)
@@ -6,6 +6,7 @@ using GameServ::GameLayer::GameObjects::GameObject;
 using GameServ::Types::ItemTypes;\r
 using GameServ::Types::Modifiers;\r
 using GameServ::Types::Range;\r
+using GameServ::Types::ObjectTypes;\r
 \r
 #include <string>\r
 using std::string;\r
@@ -36,10 +37,7 @@ namespace GameServ { namespace GameLayer { namespace GameObjects {
                void Uses(const int &value);\r
 \r
                //! Property get - Item Type\r
-               ItemTypes::ItemType Type(void) const;\r
-\r
-               //! Property set - Item Type\r
-               void Type(const ItemTypes::ItemType &value);\r
+               virtual ItemTypes::ItemType Type(void) const = 0;\r
 \r
                //! Property get - Modifiers\r
                map<Modifiers::Modifier, Range> Modifiers(void) const;\r
@@ -47,20 +45,24 @@ namespace GameServ { namespace GameLayer { namespace GameObjects {
                //! Property set - Modifiers\r
                void Modifiers(const map<Modifiers::Modifier, Range> &modifiers);\r
 \r
-               //! Use item on a player.\r
-               void Use(shared_ptr<GameObject> spPlayer);\r
+               //! Use item on a game object\r
+               virtual void Use(shared_ptr<GameObject> spObject);\r
+               //! Undo item's last effect on a game object\r
+               virtual void Undo(shared_ptr<GameObject> spObject);\r
+\r
+               virtual ItemGO *Clone(void) const = 0;\r
 \r
-               virtual ItemGO *Clone(void) const;\r
+               virtual ObjectTypes::ObjectType ObjectType(void) const;\r
 \r
        protected:\r
                string mName;\r
                unsigned long int mPrice;\r
                int mUses;\r
-               ItemTypes::ItemType mType;\r
                map<Modifiers::Modifier, Range> mModifiers;\r
 \r
                //! Base class standard modifier applier. Simply adds the modified stat to the correct stat\r
                virtual void ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range r);\r
+               virtual void UndoModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range r);\r
        };\r
 }}}\r
 #endif
\ No newline at end of file
index c1744570c89a0cdb43b3a70c959d14614e5ecc8f..c5d70489df395750734db990a264a1c7647ac396 100644 (file)
@@ -64,6 +64,8 @@ namespace GameServ { namespace GameLayer { namespace GameObjects
 \r
                virtual MasterGO *Clone(void) const;\r
 \r
+               virtual ObjectTypes::ObjectType ObjectType(void) const;\r
+\r
        private:\r
                string mName;\r
                unsigned long int mGold;\r
index feecfcc0756433e2672cd3fd583c5cc5330891d5..482ecfa6c847398b8bd1e2de2d0f80ffaaeeaf60 100644 (file)
@@ -64,6 +64,8 @@ namespace GameServ { namespace GameLayer { namespace GameObjects
 \r
                virtual MonsterGO *Clone(void) const;\r
 \r
+               virtual ObjectTypes::ObjectType ObjectType(void) const;\r
+\r
        private:\r
                string mName;\r
                unsigned long int mGold;\r
index 4f160cb9121251027096b79338dca39bf2ca30e7..7e035ae94294e33b126e21ab448a85404b0f9662 100644 (file)
@@ -11,6 +11,9 @@ using GameServ::GameLayer::GameObjects::ArmorGO;
 #include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
 using GameServ::GameLayer::GameObjects::WeaponGO;\r
 \r
+#include <GameServ/Types.h>\r
+using GameServ::Types::ObjectTypes;\r
+\r
 #include <boost/smart_ptr/shared_ptr.hpp>\r
 using boost::shared_ptr;\r
 \r
@@ -136,6 +139,8 @@ namespace GameServ { namespace GameLayer { namespace GameObjects
 \r
                virtual PlayerGO *Clone(void) const;\r
 \r
+               virtual ObjectTypes::ObjectType ObjectType(void) const;\r
+\r
        private:\r
                string mName;\r
                int mLevel;\r
index 2361e1c76a088296f845a57e59844e570cca14fd..3ac59509232d82704e3265ff14abd9483eabd318 100644 (file)
@@ -16,6 +16,9 @@ public:
        PotionGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth);\r
        virtual ~PotionGO();\r
 \r
+       virtual ItemTypes::ItemType Type(void) const;\r
+       virtual PotionGO *Clone(void) const;\r
+\r
 private:\r
 };\r
 \r
index fdd7bcadf83c61b0171a2c31f4a27ea211596756..92a3ea5252dae4839fef57c20d05c5c8b5adc925 100644 (file)
@@ -18,6 +18,9 @@ namespace GameServ { namespace GameLayer { namespace GameObjects {
                WeaponGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth);\r
                virtual ~WeaponGO();\r
 \r
+               virtual ItemTypes::ItemType Type(void) const;\r
+               virtual WeaponGO *Clone(void) const;\r
+\r
        private:\r
        };\r
 \r
index 71e7037aec4d6d9fb18d415f13474a820c1953f5..3b654e0045a8aa5fa4fbf143c9c4f1a4857f277e 100644 (file)
@@ -326,52 +326,80 @@ shared_ptr<ItemGO> FileItemDAO::CreateItemFromLine(const string &line) const
                throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") %\r
                        mFilename %  line), __FILE__, __LINE__);\r
        }\r
-       modifiers[Modifiers::strength] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::strength] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*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
-       modifiers[Modifiers::defense] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::defense] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*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
-       modifiers[Modifiers::maxhealth] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::maxhealth] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*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
-       modifiers[Modifiers::health] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::health] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       }\r
        tok_iter++;\r
        if (tok_iter == tokens.end())\r
        {\r
+               spItem->Modifiers(modifiers);\r
                return spItem;\r
        }\r
-       modifiers[Modifiers::forestfights] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::forestfights] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       }\r
        tok_iter++;\r
        if (tok_iter == tokens.end())\r
        {\r
+               spItem->Modifiers(modifiers);\r
                return spItem;\r
        }\r
-       modifiers[Modifiers::playerfights] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::playerfights] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       }\r
        tok_iter++;\r
        if (tok_iter == tokens.end())\r
        {\r
+               spItem->Modifiers(modifiers);\r
                return spItem;\r
        }\r
-       modifiers[Modifiers::gold] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::gold] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       }\r
        tok_iter++;\r
        if (tok_iter == tokens.end())\r
        {\r
+               spItem->Modifiers(modifiers);\r
                return spItem;\r
        }\r
-       modifiers[Modifiers::bank] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       if ((*tok_iter) != "0")\r
+       {\r
+               modifiers[Modifiers::bank] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+       }\r
        spItem->Modifiers(modifiers);\r
 \r
        return spItem;\r
index 7c29dd7ecda8623291916948672f72ab790a7e4a..6e8301de22e9c1717f75b57b5fe53c8753cb56b1 100644 (file)
@@ -18,7 +18,6 @@ using boost::str;
 \r
 ArmorGO::ArmorGO() : ItemGO()\r
 {\r
-       mType = ItemTypes::Armor;\r
 }\r
 \r
 ArmorGO::ArmorGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth) :\r
@@ -31,14 +30,21 @@ ItemGO()
        mModifiers[Modifiers::strength] = Range(strength, strength);\r
        mModifiers[Modifiers::defense] = Range(defense, defense);\r
        mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth);\r
-       mType = ItemTypes::Armor;\r
 }\r
 \r
 ArmorGO::~ArmorGO()\r
 {\r
 }\r
 \r
+ItemTypes::ItemType ArmorGO::Type(void) const\r
+{\r
+       return ItemTypes::Armor;\r
+}\r
 \r
+ArmorGO *ArmorGO::Clone(void) const\r
+{\r
+       return new ArmorGO(*this);\r
+}\r
 \r
 \r
 \r
index 6c8246e8407822270dc7033c8513fdf07e2474c0..208eb26d7321f76c31419a64e0cffdf67021f881 100644 (file)
@@ -7,6 +7,10 @@ using GameServ::GameLayer::GameObjects::PlayerGO;
 using GameServ::Types::ItemTypes;\r
 using GameServ::Types::Modifiers;\r
 using GameServ::Types::Range;\r
+using GameServ::Types::ObjectTypes;\r
+\r
+#include <GameServ/GameServException.h>\r
+using GameServ::Exceptions::GameServException;\r
 \r
 #include <string>\r
 using std::string;\r
@@ -22,7 +26,7 @@ using boost::shared_static_cast;
 using boost::str;\r
 using boost::format;\r
 \r
-ItemGO::ItemGO() : GameObject(), mName(""), mPrice(0), mUses(1), mType(ItemTypes::NOTYPE)\r
+ItemGO::ItemGO() : GameObject(), mName(""), mPrice(0), mUses(1)\r
 {\r
 }\r
 \r
@@ -60,18 +64,34 @@ void ItemGO::Uses(const int &value)
        mUses = value;\r
 }\r
 \r
-void ItemGO::Use(shared_ptr<GameObject> spPlayer)\r
+void ItemGO::Use(shared_ptr<GameObject> spObject)\r
 {\r
        map<Modifiers::Modifier, Range>::const_iterator iter;\r
        for (iter = mModifiers.begin(); iter != mModifiers.end(); iter++)\r
        {\r
-               ApplyModifier(spPlayer, iter->first, iter->second);\r
+               ApplyModifier(spObject, iter->first, iter->second);\r
+       }\r
+}\r
+\r
+void ItemGO::Undo(shared_ptr<GameObject> spObject)\r
+{\r
+       map<Modifiers::Modifier, Range>::const_iterator iter;\r
+       for (iter = mModifiers.begin(); iter != mModifiers.end(); iter++)\r
+       {\r
+               UndoModifier(spObject, iter->first, iter->second);\r
        }\r
 }\r
 \r
 void ItemGO::ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range r)\r
 {\r
+       if (spObject->ObjectType() != ObjectTypes::Player)\r
+       {\r
+               throw GameServException(str(format("Item %1%:%2% used on an unsupported object type: %3%") %\r
+                       Id() % Name() % ObjectTypes::GetName(spObject->ObjectType())), __FILE__, __LINE__);\r
+       }\r
+\r
        shared_ptr<PlayerGO> spPlayer = shared_static_cast<PlayerGO>(spObject);\r
+\r
        switch (modifier)\r
        {\r
        case Modifiers::strength:\r
@@ -103,14 +123,45 @@ void ItemGO::ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Mod
        }\r
 }\r
 \r
-ItemTypes::ItemType ItemGO::Type(void) const\r
+void ItemGO::UndoModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range r)\r
 {\r
-       return mType;\r
-}\r
+       if (spObject->ObjectType() != ObjectTypes::Player)\r
+       {\r
+               throw GameServException(str(format("Item %1%:%2% used on an unsupported object type: %3%") %\r
+                       Id() % Name() % ObjectTypes::GetName(spObject->ObjectType())), __FILE__, __LINE__);\r
+       }\r
 \r
-void ItemGO::Type(const ItemTypes::ItemType &value)\r
-{\r
-       mType = value;\r
+       shared_ptr<PlayerGO> spPlayer = shared_static_cast<PlayerGO>(spObject);\r
+\r
+       switch (modifier)\r
+       {\r
+       case Modifiers::strength:\r
+               spPlayer->Strength(spPlayer->Strength() - r.LastRandom());\r
+               break;\r
+       case Modifiers::defense:\r
+               spPlayer->Defense(spPlayer->Defense() - r.LastRandom());\r
+               break;\r
+       case Modifiers::health:\r
+               spPlayer->Health(spPlayer->Health() - r.LastRandom());\r
+               break;\r
+       case Modifiers::maxhealth:\r
+               spPlayer->MaxHealth(spPlayer->MaxHealth() - r.LastRandom());\r
+               break;\r
+       case Modifiers::gold:\r
+               spPlayer->Gold(spPlayer->Gold() - r.LastRandom());\r
+               break;\r
+       case Modifiers::bank:\r
+               spPlayer->Bank(spPlayer->Bank() - r.LastRandom());\r
+               break;\r
+       case Modifiers::forestfights:\r
+               spPlayer->ForestFights(spPlayer->ForestFights() - r.LastRandom());\r
+               break;\r
+       case Modifiers::playerfights:\r
+               spPlayer->PlayerFights(spPlayer->PlayerFights() - r.LastRandom());\r
+               break;\r
+       default:\r
+               throw GameServException(str(format("Invalid modifier %1%") % modifier), __FILE__, __LINE__);\r
+       }\r
 }\r
 \r
 map<Modifiers::Modifier, Range> ItemGO::Modifiers(void) const\r
@@ -124,13 +175,20 @@ void ItemGO::Modifiers(const map<Modifiers::Modifier, Range> &modifiers)
        mModifiers.insert(modifiers.begin(), modifiers.end());\r
 }\r
 \r
-ItemGO *ItemGO::Clone(void) const\r
+//ItemGO *ItemGO::Clone(void) const\r
+//{\r
+//     return new ItemGO(*this);\r
+//}\r
+\r
+ObjectTypes::ObjectType ItemGO::ObjectType(void) const\r
 {\r
-       return new ItemGO(*this);\r
+       return ObjectTypes::Item;\r
 }\r
 \r
-\r
-\r
+//ItemTypes::ItemType ItemGO::Type(void) const\r
+//{\r
+//     return ItemTypes::NOTYPE;\r
+//}\r
 \r
 \r
 \r
index 604fbe575cb697e46ab6a4e730808c583791433a..27a670f91c6865e10389b3c0ad1c952ec77f169a 100644 (file)
@@ -3,6 +3,9 @@ using GameServ::GameLayer::GameObjects::GameObject;
 #include <GameServ/GameLayer/GameObjects/MasterGO.h>\r
 using GameServ::GameLayer::GameObjects::MasterGO;\r
 \r
+#include <GameServ/Types.h>\r
+using GameServ::Types::ObjectTypes;\r
+\r
 #include <string>\r
 using std::string;\r
 \r
@@ -120,4 +123,10 @@ bool MasterGO::operator==(const MasterGO &right) const
 bool MasterGO::operator!=(const MasterGO &right) const\r
 {\r
        return (!(*this == right));\r
-}
\ No newline at end of file
+}\r
+\r
+ObjectTypes::ObjectType MasterGO::ObjectType(void) const\r
+{\r
+       return ObjectTypes::Master;\r
+}\r
+\r
index 601b56524c334583196dbee649a78f17d963665f..050c8652b6c2e52b458605bd38bf840ae2b56fca 100644 (file)
@@ -4,12 +4,23 @@ using GameServ::GameLayer::GameObjects::PlayerGO;
 using GameServ::GameLayer::GameObjects::ArmorGO;\r
 #include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
 using GameServ::GameLayer::GameObjects::WeaponGO;\r
+#include <GameServ/GameLayer/GameObjects/PotionGO.h>\r
+using GameServ::GameLayer::GameObjects::PotionGO;\r
+\r
+#include <GameServ/GameServException.h>\r
+using GameServ::Exceptions::GameServException;\r
+\r
+#include <GameServ/Types.h>\r
+using GameServ::Types::ObjectTypes;\r
 \r
 #include <boost/smart_ptr/shared_ptr.hpp>\r
 using boost::shared_ptr;\r
+using boost::shared_static_cast;\r
 \r
-#include <GameServ/GameServException.h>\r
-using GameServ::Exceptions::GameServException;\r
+#include <boost/algorithm/string.hpp>\r
+#include <boost/format.hpp>\r
+using boost::str;\r
+using boost::format;\r
 \r
 #include <boost/date_time/posix_time/posix_time.hpp>\r
 using boost::posix_time::ptime;\r
@@ -229,8 +240,22 @@ void PlayerGO::AddItemToInventory(shared_ptr<ItemGO> spItem, const int &Number)
 {\r
        for (int x = 0; x < Number; ++x)\r
        {\r
-               shared_ptr<ItemGO> item = shared_ptr<ItemGO>(new ItemGO(*spItem->Clone()));\r
-               mItems.push_back(item);\r
+               shared_ptr<ItemGO> item;\r
+               switch (spItem->Type())\r
+               {\r
+               case ItemTypes::Armor:\r
+                       mItems.push_back(shared_ptr<ArmorGO>(new ArmorGO(*(ArmorGO *)spItem->Clone())));\r
+                       break;\r
+               case ItemTypes::Weapon:\r
+                       mItems.push_back(shared_ptr<WeaponGO>(new WeaponGO(*(WeaponGO *)spItem->Clone())));\r
+                       break;\r
+               case ItemTypes::Potion:\r
+                       mItems.push_back(shared_ptr<PotionGO>(new PotionGO(*(PotionGO *)spItem->Clone())));\r
+                       break;\r
+               default:\r
+                       throw GameServException(str(format("Unsupported item type added to Player inventory: %1%") %\r
+                               ItemTypes::GetName(spItem->Type())), __FILE__, __LINE__);\r
+               }\r
        }\r
 }\r
 \r
@@ -274,3 +299,7 @@ PlayerGO *PlayerGO::Clone(void) const
        return new PlayerGO(*this);\r
 }\r
 \r
+ObjectTypes::ObjectType PlayerGO::ObjectType(void) const\r
+{\r
+       return ObjectTypes::Player;\r
+}\r
index 1a5c4123774b7477a568514c65fd25d5424b943a..d266ac8040d83167aca808f70559f7d86c35d086 100644 (file)
@@ -18,7 +18,6 @@ using boost::str;
 \r
 PotionGO::PotionGO() : ItemGO()\r
 {\r
-       mType = ItemTypes::Potion;\r
 }\r
 \r
 PotionGO::PotionGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth) :\r
@@ -31,14 +30,21 @@ ItemGO()
        mModifiers[Modifiers::strength] = Range(strength, strength);\r
        mModifiers[Modifiers::defense] = Range(defense, defense);\r
        mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth);\r
-       mType = ItemTypes::Potion;\r
 }\r
 \r
 PotionGO::~PotionGO()\r
 {\r
 }\r
 \r
+ItemTypes::ItemType PotionGO::Type(void) const\r
+{\r
+       return ItemTypes::Potion;\r
+}\r
 \r
+PotionGO *PotionGO::Clone(void) const\r
+{\r
+       return new PotionGO(*this);\r
+}\r
 \r
 \r
 \r
index 453b449bb4b76e2dfba4fb412ac91af62f6a105b..eb89060f2d21c054e35185df42acbc499d96ea7e 100644 (file)
@@ -18,7 +18,6 @@ using boost::str;
 \r
 WeaponGO::WeaponGO() : ItemGO()\r
 {\r
-       mType = ItemTypes::Weapon;\r
 }\r
 \r
 WeaponGO::WeaponGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth) :\r
@@ -31,14 +30,21 @@ ItemGO()
        mModifiers[Modifiers::strength] = Range(strength, strength);\r
        mModifiers[Modifiers::defense] = Range(defense, defense);\r
        mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth);\r
-       mType = ItemTypes::Weapon;\r
 }\r
 \r
 WeaponGO::~WeaponGO()\r
 {\r
 }\r
 \r
+ItemTypes::ItemType WeaponGO::Type(void) const\r
+{\r
+       return ItemTypes::Weapon;\r
+}\r
 \r
+WeaponGO *WeaponGO::Clone(void) const\r
+{\r
+       return new WeaponGO(*this);\r
+}\r
 \r
 \r
 \r
index 7cd45a1b798c4826c57d872ee5016222150e29ec..672f86c8cdb85003392051fa09ebf4f94bffcda5 100644 (file)
@@ -5,37 +5,67 @@ using GameServ::GameLayer::GameObjects::PlayerGO;
 #include <GameServ/GameLayer/PlayerGL.h>\r
 using GameServ::GameLayer::PlayerGL;\r
 \r
+#include <GameServ/GameLayer/GameObjects/ItemGO.h>\r
+using GameServ::GameLayer::GameObjects::ItemGO;\r
+#include <GameServ/GameLayer/GameObjects/WeaponGO.h>\r
+using GameServ::GameLayer::GameObjects::WeaponGO;\r
+#include <GameServ/GameLayer/GameObjects/ArmorGO.h>\r
+using GameServ::GameLayer::GameObjects::ArmorGO;\r
+#include <GameServ/GameLayer/GameObjects/PotionGO.h>\r
+using GameServ::GameLayer::GameObjects::PotionGO;\r
+\r
+\r
 #include <GameServ/GameServException.h>\r
 using GameServ::Exceptions::GameServException;\r
 \r
 #include <GameServ/Types.h>\r
 using GameServ::Types::Range;\r
+using GameServ::Types::ItemTypes;\r
+using GameServ::Types::Modifiers;\r
+\r
+#include <boost/algorithm/string.hpp>\r
+#include <boost/format.hpp>\r
+using boost::str;\r
+using boost::format;\r
 \r
 int main()\r
 {\r
        try\r
        {\r
-               //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
-               \r
-               map <int, int> frequencies;\r
-               int x;\r
-               for (x = 0; x < 10000; x++)\r
+               PlayerGL pgl;\r
+               shared_ptr<PlayerGO> spPlayer = pgl.GetById("Kain");\r
+               cout << "Name: " << spPlayer->Name() << endl\r
+                        << "Level: " << spPlayer->Level() << endl\r
+                        << "Exp: " << spPlayer->Experience() << endl\r
+                        << "Strength: " << spPlayer->Strength() << endl\r
+                        << "Defense: " << spPlayer->Defense() << endl\r
+                        << "Gold: " << spPlayer->Gold() << endl\r
+                        << "Bank: " << spPlayer->Bank() << endl\r
+                        << "Items: " << endl;\r
+               vector< shared_ptr<ItemGO> > spInventory = spPlayer->Inventory();\r
+               vector< shared_ptr<ItemGO> >::const_iterator iter;\r
+               for (iter = spInventory.begin(); iter != spInventory.end(); iter++)\r
                {\r
-                       Range testrange(-100, 100);\r
-                       int randnum = testrange.Random();\r
-                       frequencies[randnum]++;\r
-               }\r
-               map<int, int>::const_iterator iter;\r
-               for (iter = frequencies.begin(); iter != frequencies.end(); iter++)\r
-               {\r
-                       cout << iter->first << ": ";\r
-                       cout << (iter->second / (double)(x + 1)) * 100 << '%' << endl;\r
+                       shared_ptr<ItemGO> spItem = (*iter);\r
+                       cout << str(format("Name: %1%  Type: %2%") % spItem->Name() % ItemTypes::GetName(spItem->Type())) << endl;\r
                }\r
+               \r
+\r
+               \r
+               //map <int, int> frequencies;\r
+               //int x;\r
+               //for (x = 0; x < 10000; x++)\r
+               //{\r
+               //      Range testrange(-100, 100);\r
+               //      int randnum = testrange.Random();\r
+               //      frequencies[randnum]++;\r
+               //}\r
+               //map<int, int>::const_iterator iter;\r
+               //for (iter = frequencies.begin(); iter != frequencies.end(); iter++)\r
+               //{\r
+               //      cout << iter->first << ": ";\r
+               //      cout << (iter->second / (double)(x + 1)) * 100 << '%' << endl;\r
+               //}\r
        }\r
        catch (GameServException &e)\r
        {\r