From: kainazzzo Date: Fri, 18 Sep 2009 17:05:09 +0000 (+0000) Subject: Changed the ItemGO class to be abstract so you cannot define a simple ItemGO object... X-Git-Url: https://jfr.im/git/irc/gameservirc.git/commitdiff_plain/1134c36807a7fb7ffcfd9ce84f8f3ccf8b8aa8c7 Changed the ItemGO class to be abstract so you cannot define a simple ItemGO object. The polymorphic behavior of a shared_ptr wasn't quite working until now. 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 --- diff --git a/gameserv-2.0/data/players.dat b/gameserv-2.0/data/players.dat index abaee08..889f40e 100644 --- a/gameserv-2.0/data/players.dat +++ b/gameserv-2.0/data/players.dat @@ -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 -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 +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 diff --git a/gameserv-2.0/libgameservcore/include/GameServ/Types.h b/gameserv-2.0/libgameservcore/include/GameServ/Types.h index 83e6bd9..1d8fcfc 100644 --- a/gameserv-2.0/libgameservcore/include/GameServ/Types.h +++ b/gameserv-2.0/libgameservcore/include/GameServ/Types.h @@ -51,6 +51,33 @@ namespace GameServ }; // ItemTypes class + class ObjectTypes + { + public: + //! Logical ObjectType enumerator + enum ObjectType + { + Player, Item, Level, Master, Monster + }; + + //! Get the name of an object type + static string GetName(ObjectType objecttype); + + //! Parse the name and return the enumeration value + static ObjectType Parse(const string &objecttype); + + private: + //! Internal struct to hold type information statically in a table + typedef struct objecttypeinfo + { + ObjectTypes::ObjectType objecttype; //!< The ObjectType enumeration value + string name; //!< The Name of the type + } objecttypeinfo; + + static const objecttypeinfo mObjectTypeInfoTable[]; + + }; // ObjectTypes class + class Modifiers { public: @@ -95,10 +122,14 @@ namespace GameServ //! Property set - Low void Low(const int &value); + + //! Property get - Last random number to be generated + int LastRandom(void) const; private: int mHigh; int mLow; + int mLastRandom; }; } } diff --git a/gameserv-2.0/libgameservcore/src/Types.cpp b/gameserv-2.0/libgameservcore/src/Types.cpp index d99923f..fd5c059 100644 --- a/gameserv-2.0/libgameservcore/src/Types.cpp +++ b/gameserv-2.0/libgameservcore/src/Types.cpp @@ -2,6 +2,7 @@ using GameServ::Types::ItemTypes; using GameServ::Types::Modifiers; using GameServ::Types::Range; +using GameServ::Types::ObjectTypes; using GameServ::Types::Exceptions::TypeException; #include @@ -49,7 +50,7 @@ TypeException::TypeException(void) const ItemTypes::itemtypeinfo ItemTypes::mItemTypeInfoTable[] = { - { Weapon, "Weapon" }, { Armor, "Armor" }, { Potion, "Potion"} + { Weapon, "Weapon" }, { Armor, "Armor" }, { Potion, "Potion"}, { NOTYPE, "NOTYPE" } }; // mItemTypeInfoTable[] string ItemTypes::GetName(ItemTypes::ItemType itemtype) @@ -76,13 +77,47 @@ ItemTypes::ItemType ItemTypes::Parse(const string &itemtype) return mItemTypeInfoTable[i].itemtype; } } - return ItemTypes::NOTYPE; + throw TypeException(str(format("No itemtype enumeration found for %1%") % itemtype), __FILE__, __LINE__); } +const ObjectTypes::objecttypeinfo ObjectTypes::mObjectTypeInfoTable[] = +{ + { Player, "Player" }, { Level, "Level" }, { Item, "Item" }, + { Master, "Master" }, { Monster, "Monster" } +}; // mObjectTypeInfoTable[] + +string ObjectTypes::GetName(ObjectTypes::ObjectType objecttype) +{ + for (unsigned int i = 0; i < sizeof(mObjectTypeInfoTable) / sizeof(objecttypeinfo); i++) + { + if (mObjectTypeInfoTable[i].objecttype == objecttype) + { + return mObjectTypeInfoTable[i].name; + } + } + + // This should never happen because an enumeration is passed, but in the case where a user + // may attempt an invalid integer cast, it provides protection + throw TypeException(str(format("No object type found for %1% enumeration value") % objecttype).c_str()); +} + +ObjectTypes::ObjectType ObjectTypes::Parse(const string &objecttype) +{ + for (unsigned int i = 0; i < sizeof(mObjectTypeInfoTable) / sizeof(objecttypeinfo); i++) + { + if (mObjectTypeInfoTable[i].name == objecttype) + { + return mObjectTypeInfoTable[i].objecttype; + } + } + throw TypeException(str(format("No object type enumeration found for %1%") % objecttype), __FILE__, __LINE__); +} + + const Modifiers::modifierinfo Modifiers::mModifierInfoTable[] = { - { strength, "Strength"}, { defense, "Defense" }, { maxhealth, "MaxHealth" }, { health, "Health" }, { forestfights, "Forest Fights" }, - { playerfights, "Player Fights" }, { gold, "Gold" }, { bank, "Bank" } + { strength, "Strength"}, { defense, "Defense" }, { maxhealth, "MaxHealth" }, { health, "Health" }, { forestfights, "ForestFights" }, + { playerfights, "PlayerFights" }, { gold, "Gold" }, { bank, "Bank" } }; string Modifiers::GetName(Modifiers::Modifier modifier) @@ -117,16 +152,21 @@ Range::Range() { mHigh = 0; mLow = 0; + mLastRandom = 0; } Range::Range(const int &high, const int &low) { mHigh = high; mLow = low; + mLastRandom = 0; } Range::~Range() { + mHigh = 0; + mLow = 0; + mLastRandom = 0; } void Range::High(const int &value) @@ -156,5 +196,11 @@ int Range::Random() static base_generator_type generator(static_cast(std::time(0))); boost::uniform_int<> uni_dist(mHigh, mLow); boost::variate_generator > uni(generator, uni_dist); - return static_cast(uni()); + mLastRandom = uni(); + return mLastRandom; +} + +int Range::LastRandom(void) const +{ + return mLastRandom; } \ No newline at end of file diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ArmorGO.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ArmorGO.h index aaae64f..cd127b9 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ArmorGO.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ArmorGO.h @@ -16,6 +16,9 @@ public: ArmorGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth); virtual ~ArmorGO(); + virtual ItemTypes::ItemType Type(void) const; + virtual ArmorGO *Clone(void) const; + private: }; diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/GameObject.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/GameObject.h index 2bf4442..f6d5335 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/GameObject.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/GameObject.h @@ -1,5 +1,9 @@ #ifndef __GS__GAMEOBJECT_H__ #define __GS__GAMEOBJECT_H__ + +#include +using GameServ::Types::ObjectTypes; + #include #include using std::string; @@ -29,9 +33,12 @@ namespace GameServ { namespace GameLayer { namespace GameObjects */ virtual GameObject *Clone(void) const = 0; + virtual ObjectTypes::ObjectType ObjectType(void) const = 0; + bool operator==(const GameObject &right) const; bool operator!=(const GameObject &right) const; + protected: string mId; friend class GameObjectIds_Eq; diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ItemGO.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ItemGO.h index 534eaf0..3e23295 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ItemGO.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/ItemGO.h @@ -6,6 +6,7 @@ using GameServ::GameLayer::GameObjects::GameObject; using GameServ::Types::ItemTypes; using GameServ::Types::Modifiers; using GameServ::Types::Range; +using GameServ::Types::ObjectTypes; #include using std::string; @@ -36,10 +37,7 @@ namespace GameServ { namespace GameLayer { namespace GameObjects { void Uses(const int &value); //! Property get - Item Type - ItemTypes::ItemType Type(void) const; - - //! Property set - Item Type - void Type(const ItemTypes::ItemType &value); + virtual ItemTypes::ItemType Type(void) const = 0; //! Property get - Modifiers map Modifiers(void) const; @@ -47,20 +45,24 @@ namespace GameServ { namespace GameLayer { namespace GameObjects { //! Property set - Modifiers void Modifiers(const map &modifiers); - //! Use item on a player. - void Use(shared_ptr spPlayer); + //! Use item on a game object + virtual void Use(shared_ptr spObject); + //! Undo item's last effect on a game object + virtual void Undo(shared_ptr spObject); + + virtual ItemGO *Clone(void) const = 0; - virtual ItemGO *Clone(void) const; + virtual ObjectTypes::ObjectType ObjectType(void) const; protected: string mName; unsigned long int mPrice; int mUses; - ItemTypes::ItemType mType; map mModifiers; //! Base class standard modifier applier. Simply adds the modified stat to the correct stat virtual void ApplyModifier(shared_ptr spObject, const Modifiers::Modifier &modifier, Range r); + virtual void UndoModifier(shared_ptr spObject, const Modifiers::Modifier &modifier, Range r); }; }}} #endif \ No newline at end of file diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MasterGO.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MasterGO.h index c174457..c5d7048 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MasterGO.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MasterGO.h @@ -64,6 +64,8 @@ namespace GameServ { namespace GameLayer { namespace GameObjects virtual MasterGO *Clone(void) const; + virtual ObjectTypes::ObjectType ObjectType(void) const; + private: string mName; unsigned long int mGold; diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MonsterGO.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MonsterGO.h index feecfcc..482ecfa 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MonsterGO.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/MonsterGO.h @@ -64,6 +64,8 @@ namespace GameServ { namespace GameLayer { namespace GameObjects virtual MonsterGO *Clone(void) const; + virtual ObjectTypes::ObjectType ObjectType(void) const; + private: string mName; unsigned long int mGold; diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PlayerGO.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PlayerGO.h index 4f160cb..7e035ae 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PlayerGO.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PlayerGO.h @@ -11,6 +11,9 @@ using GameServ::GameLayer::GameObjects::ArmorGO; #include using GameServ::GameLayer::GameObjects::WeaponGO; +#include +using GameServ::Types::ObjectTypes; + #include using boost::shared_ptr; @@ -136,6 +139,8 @@ namespace GameServ { namespace GameLayer { namespace GameObjects virtual PlayerGO *Clone(void) const; + virtual ObjectTypes::ObjectType ObjectType(void) const; + private: string mName; int mLevel; diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PotionGO.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PotionGO.h index 2361e1c..3ac5950 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PotionGO.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/PotionGO.h @@ -16,6 +16,9 @@ public: PotionGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth); virtual ~PotionGO(); + virtual ItemTypes::ItemType Type(void) const; + virtual PotionGO *Clone(void) const; + private: }; diff --git a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/WeaponGO.h b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/WeaponGO.h index fdd7bca..92a3ea5 100644 --- a/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/WeaponGO.h +++ b/gameserv-2.0/libgameservgldl/include/GameServ/GameLayer/GameObjects/WeaponGO.h @@ -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); virtual ~WeaponGO(); + virtual ItemTypes::ItemType Type(void) const; + virtual WeaponGO *Clone(void) const; + private: }; diff --git a/gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp b/gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp index 71e7037..3b654e0 100644 --- a/gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp +++ b/gameserv-2.0/libgameservgldl/src/DataLayer/File/FileItemDAO.cpp @@ -326,52 +326,80 @@ shared_ptr FileItemDAO::CreateItemFromLine(const string &line) const throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") % mFilename % line), __FILE__, __LINE__); } - modifiers[Modifiers::strength] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::strength] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } tok_iter++; if (tok_iter == tokens.end()) { throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") % mFilename % line), __FILE__, __LINE__); } - modifiers[Modifiers::defense] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::defense] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } tok_iter++; if (tok_iter == tokens.end()) { throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") % mFilename % line), __FILE__, __LINE__); } - modifiers[Modifiers::maxhealth] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::maxhealth] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } tok_iter++; if (tok_iter == tokens.end()) { throw DataLayerException(str(format("Corrupt %1% file. Missing information on line %2%") % mFilename % line), __FILE__, __LINE__); } - modifiers[Modifiers::health] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::health] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } tok_iter++; if (tok_iter == tokens.end()) { + spItem->Modifiers(modifiers); return spItem; } - modifiers[Modifiers::forestfights] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::forestfights] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } tok_iter++; if (tok_iter == tokens.end()) { + spItem->Modifiers(modifiers); return spItem; } - modifiers[Modifiers::playerfights] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::playerfights] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } tok_iter++; if (tok_iter == tokens.end()) { + spItem->Modifiers(modifiers); return spItem; } - modifiers[Modifiers::gold] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::gold] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } tok_iter++; if (tok_iter == tokens.end()) { + spItem->Modifiers(modifiers); return spItem; } - modifiers[Modifiers::bank] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + if ((*tok_iter) != "0") + { + modifiers[Modifiers::bank] = Range(lexical_cast((*tok_iter)), lexical_cast((*tok_iter))); + } spItem->Modifiers(modifiers); return spItem; diff --git a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ArmorGO.cpp b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ArmorGO.cpp index 7c29dd7..6e8301d 100644 --- a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ArmorGO.cpp +++ b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ArmorGO.cpp @@ -18,7 +18,6 @@ using boost::str; ArmorGO::ArmorGO() : ItemGO() { - mType = ItemTypes::Armor; } ArmorGO::ArmorGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth) : @@ -31,14 +30,21 @@ ItemGO() mModifiers[Modifiers::strength] = Range(strength, strength); mModifiers[Modifiers::defense] = Range(defense, defense); mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth); - mType = ItemTypes::Armor; } ArmorGO::~ArmorGO() { } +ItemTypes::ItemType ArmorGO::Type(void) const +{ + return ItemTypes::Armor; +} +ArmorGO *ArmorGO::Clone(void) const +{ + return new ArmorGO(*this); +} diff --git a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ItemGO.cpp b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ItemGO.cpp index 6c8246e..208eb26 100644 --- a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ItemGO.cpp +++ b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ItemGO.cpp @@ -7,6 +7,10 @@ using GameServ::GameLayer::GameObjects::PlayerGO; using GameServ::Types::ItemTypes; using GameServ::Types::Modifiers; using GameServ::Types::Range; +using GameServ::Types::ObjectTypes; + +#include +using GameServ::Exceptions::GameServException; #include using std::string; @@ -22,7 +26,7 @@ using boost::shared_static_cast; using boost::str; using boost::format; -ItemGO::ItemGO() : GameObject(), mName(""), mPrice(0), mUses(1), mType(ItemTypes::NOTYPE) +ItemGO::ItemGO() : GameObject(), mName(""), mPrice(0), mUses(1) { } @@ -60,18 +64,34 @@ void ItemGO::Uses(const int &value) mUses = value; } -void ItemGO::Use(shared_ptr spPlayer) +void ItemGO::Use(shared_ptr spObject) { map::const_iterator iter; for (iter = mModifiers.begin(); iter != mModifiers.end(); iter++) { - ApplyModifier(spPlayer, iter->first, iter->second); + ApplyModifier(spObject, iter->first, iter->second); + } +} + +void ItemGO::Undo(shared_ptr spObject) +{ + map::const_iterator iter; + for (iter = mModifiers.begin(); iter != mModifiers.end(); iter++) + { + UndoModifier(spObject, iter->first, iter->second); } } void ItemGO::ApplyModifier(shared_ptr spObject, const Modifiers::Modifier &modifier, Range r) { + if (spObject->ObjectType() != ObjectTypes::Player) + { + throw GameServException(str(format("Item %1%:%2% used on an unsupported object type: %3%") % + Id() % Name() % ObjectTypes::GetName(spObject->ObjectType())), __FILE__, __LINE__); + } + shared_ptr spPlayer = shared_static_cast(spObject); + switch (modifier) { case Modifiers::strength: @@ -103,14 +123,45 @@ void ItemGO::ApplyModifier(shared_ptr spObject, const Modifiers::Mod } } -ItemTypes::ItemType ItemGO::Type(void) const +void ItemGO::UndoModifier(shared_ptr spObject, const Modifiers::Modifier &modifier, Range r) { - return mType; -} + if (spObject->ObjectType() != ObjectTypes::Player) + { + throw GameServException(str(format("Item %1%:%2% used on an unsupported object type: %3%") % + Id() % Name() % ObjectTypes::GetName(spObject->ObjectType())), __FILE__, __LINE__); + } -void ItemGO::Type(const ItemTypes::ItemType &value) -{ - mType = value; + shared_ptr spPlayer = shared_static_cast(spObject); + + switch (modifier) + { + case Modifiers::strength: + spPlayer->Strength(spPlayer->Strength() - r.LastRandom()); + break; + case Modifiers::defense: + spPlayer->Defense(spPlayer->Defense() - r.LastRandom()); + break; + case Modifiers::health: + spPlayer->Health(spPlayer->Health() - r.LastRandom()); + break; + case Modifiers::maxhealth: + spPlayer->MaxHealth(spPlayer->MaxHealth() - r.LastRandom()); + break; + case Modifiers::gold: + spPlayer->Gold(spPlayer->Gold() - r.LastRandom()); + break; + case Modifiers::bank: + spPlayer->Bank(spPlayer->Bank() - r.LastRandom()); + break; + case Modifiers::forestfights: + spPlayer->ForestFights(spPlayer->ForestFights() - r.LastRandom()); + break; + case Modifiers::playerfights: + spPlayer->PlayerFights(spPlayer->PlayerFights() - r.LastRandom()); + break; + default: + throw GameServException(str(format("Invalid modifier %1%") % modifier), __FILE__, __LINE__); + } } map ItemGO::Modifiers(void) const @@ -124,13 +175,20 @@ void ItemGO::Modifiers(const map &modifiers) mModifiers.insert(modifiers.begin(), modifiers.end()); } -ItemGO *ItemGO::Clone(void) const +//ItemGO *ItemGO::Clone(void) const +//{ +// return new ItemGO(*this); +//} + +ObjectTypes::ObjectType ItemGO::ObjectType(void) const { - return new ItemGO(*this); + return ObjectTypes::Item; } - - +//ItemTypes::ItemType ItemGO::Type(void) const +//{ +// return ItemTypes::NOTYPE; +//} diff --git a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/MasterGO.cpp b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/MasterGO.cpp index 604fbe5..27a670f 100644 --- a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/MasterGO.cpp +++ b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/MasterGO.cpp @@ -3,6 +3,9 @@ using GameServ::GameLayer::GameObjects::GameObject; #include using GameServ::GameLayer::GameObjects::MasterGO; +#include +using GameServ::Types::ObjectTypes; + #include using std::string; @@ -120,4 +123,10 @@ bool MasterGO::operator==(const MasterGO &right) const bool MasterGO::operator!=(const MasterGO &right) const { return (!(*this == right)); -} \ No newline at end of file +} + +ObjectTypes::ObjectType MasterGO::ObjectType(void) const +{ + return ObjectTypes::Master; +} + diff --git a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PlayerGO.cpp b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PlayerGO.cpp index 601b565..050c865 100644 --- a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PlayerGO.cpp +++ b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PlayerGO.cpp @@ -4,12 +4,23 @@ using GameServ::GameLayer::GameObjects::PlayerGO; using GameServ::GameLayer::GameObjects::ArmorGO; #include using GameServ::GameLayer::GameObjects::WeaponGO; +#include +using GameServ::GameLayer::GameObjects::PotionGO; + +#include +using GameServ::Exceptions::GameServException; + +#include +using GameServ::Types::ObjectTypes; #include using boost::shared_ptr; +using boost::shared_static_cast; -#include -using GameServ::Exceptions::GameServException; +#include +#include +using boost::str; +using boost::format; #include using boost::posix_time::ptime; @@ -229,8 +240,22 @@ void PlayerGO::AddItemToInventory(shared_ptr spItem, const int &Number) { for (int x = 0; x < Number; ++x) { - shared_ptr item = shared_ptr(new ItemGO(*spItem->Clone())); - mItems.push_back(item); + shared_ptr item; + switch (spItem->Type()) + { + case ItemTypes::Armor: + mItems.push_back(shared_ptr(new ArmorGO(*(ArmorGO *)spItem->Clone()))); + break; + case ItemTypes::Weapon: + mItems.push_back(shared_ptr(new WeaponGO(*(WeaponGO *)spItem->Clone()))); + break; + case ItemTypes::Potion: + mItems.push_back(shared_ptr(new PotionGO(*(PotionGO *)spItem->Clone()))); + break; + default: + throw GameServException(str(format("Unsupported item type added to Player inventory: %1%") % + ItemTypes::GetName(spItem->Type())), __FILE__, __LINE__); + } } } @@ -274,3 +299,7 @@ PlayerGO *PlayerGO::Clone(void) const return new PlayerGO(*this); } +ObjectTypes::ObjectType PlayerGO::ObjectType(void) const +{ + return ObjectTypes::Player; +} diff --git a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PotionGO.cpp b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PotionGO.cpp index 1a5c412..d266ac8 100644 --- a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PotionGO.cpp +++ b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/PotionGO.cpp @@ -18,7 +18,6 @@ using boost::str; PotionGO::PotionGO() : ItemGO() { - mType = ItemTypes::Potion; } PotionGO::PotionGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth) : @@ -31,14 +30,21 @@ ItemGO() mModifiers[Modifiers::strength] = Range(strength, strength); mModifiers[Modifiers::defense] = Range(defense, defense); mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth); - mType = ItemTypes::Potion; } PotionGO::~PotionGO() { } +ItemTypes::ItemType PotionGO::Type(void) const +{ + return ItemTypes::Potion; +} +PotionGO *PotionGO::Clone(void) const +{ + return new PotionGO(*this); +} diff --git a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/WeaponGO.cpp b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/WeaponGO.cpp index 453b449..eb89060 100644 --- a/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/WeaponGO.cpp +++ b/gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/WeaponGO.cpp @@ -18,7 +18,6 @@ using boost::str; WeaponGO::WeaponGO() : ItemGO() { - mType = ItemTypes::Weapon; } WeaponGO::WeaponGO(const string &name, const int &price, const int &uses, const int &strength, const int &defense, const int &maxhealth) : @@ -31,14 +30,21 @@ ItemGO() mModifiers[Modifiers::strength] = Range(strength, strength); mModifiers[Modifiers::defense] = Range(defense, defense); mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth); - mType = ItemTypes::Weapon; } WeaponGO::~WeaponGO() { } +ItemTypes::ItemType WeaponGO::Type(void) const +{ + return ItemTypes::Weapon; +} +WeaponGO *WeaponGO::Clone(void) const +{ + return new WeaponGO(*this); +} diff --git a/gameserv-2.0/testdriver/main.cpp b/gameserv-2.0/testdriver/main.cpp index 7cd45a1..672f86c 100644 --- a/gameserv-2.0/testdriver/main.cpp +++ b/gameserv-2.0/testdriver/main.cpp @@ -5,37 +5,67 @@ using GameServ::GameLayer::GameObjects::PlayerGO; #include using GameServ::GameLayer::PlayerGL; +#include +using GameServ::GameLayer::GameObjects::ItemGO; +#include +using GameServ::GameLayer::GameObjects::WeaponGO; +#include +using GameServ::GameLayer::GameObjects::ArmorGO; +#include +using GameServ::GameLayer::GameObjects::PotionGO; + + #include using GameServ::Exceptions::GameServException; #include using GameServ::Types::Range; +using GameServ::Types::ItemTypes; +using GameServ::Types::Modifiers; + +#include +#include +using boost::str; +using boost::format; int main() { try { - //PlayerGL pgl; - //shared_ptr spPlayer = pgl.GetById("Kain"); - //cout << spPlayer->Name() << endl; - //spPlayer->Name("Kainazzzo"); - //pgl.Insert(spPlayer); - - - map frequencies; - int x; - for (x = 0; x < 10000; x++) + PlayerGL pgl; + shared_ptr spPlayer = pgl.GetById("Kain"); + cout << "Name: " << spPlayer->Name() << endl + << "Level: " << spPlayer->Level() << endl + << "Exp: " << spPlayer->Experience() << endl + << "Strength: " << spPlayer->Strength() << endl + << "Defense: " << spPlayer->Defense() << endl + << "Gold: " << spPlayer->Gold() << endl + << "Bank: " << spPlayer->Bank() << endl + << "Items: " << endl; + vector< shared_ptr > spInventory = spPlayer->Inventory(); + vector< shared_ptr >::const_iterator iter; + for (iter = spInventory.begin(); iter != spInventory.end(); iter++) { - Range testrange(-100, 100); - int randnum = testrange.Random(); - frequencies[randnum]++; - } - map::const_iterator iter; - for (iter = frequencies.begin(); iter != frequencies.end(); iter++) - { - cout << iter->first << ": "; - cout << (iter->second / (double)(x + 1)) * 100 << '%' << endl; + shared_ptr spItem = (*iter); + cout << str(format("Name: %1% Type: %2%") % spItem->Name() % ItemTypes::GetName(spItem->Type())) << endl; } + + + + //map frequencies; + //int x; + //for (x = 0; x < 10000; x++) + //{ + // Range testrange(-100, 100); + // int randnum = testrange.Random(); + // frequencies[randnum]++; + //} + //map::const_iterator iter; + //for (iter = frequencies.begin(); iter != frequencies.end(); iter++) + //{ + // cout << iter->first << ": "; + // cout << (iter->second / (double)(x + 1)) * 100 << '%' << endl; + //} } catch (GameServException &e) {