#include <GameServ/GameServException.h>\r
using GameServ::Exceptions::GameServException;\r
\r
+#include <ctime>\r
+#include <boost/random/linear_congruential.hpp>\r
+#include <boost/random/uniform_int.hpp>\r
+#include <boost/random/uniform_real.hpp>\r
+#include <boost/random/variate_generator.hpp>\r
+// Sun CC doesn't handle boost::iterator_adaptor yet\r
+#if !defined(__SUNPRO_CC) || (__SUNPRO_CC > 0x530)\r
+#include <boost/generator_iterator.hpp>\r
+#endif\r
+\r
+#ifdef BOOST_NO_STDC_NAMESPACE\r
+namespace std {\r
+ using ::time;\r
+}\r
+#endif\r
+\r
+// This is a typedef for a random number generator.\r
+// Try boost::mt19937 or boost::ecuyer1988 instead of boost::minstd_rand\r
+typedef boost::minstd_rand base_generator_type;\r
+\r
+\r
namespace GameServ \r
{ \r
namespace Types\r
static const modifierinfo mModifierInfoTable[];\r
}; // Modifiers class\r
\r
+ template <class T>\r
class Range\r
{\r
public:\r
- Range();\r
- Range(const int &high, const int &low);\r
- ~Range();\r
+\r
+ Range()\r
+ {\r
+ }\r
+\r
+ Range(const T &high, const T &low)\r
+ {\r
+ mHigh = high;\r
+ mLow = low;\r
+ }\r
+\r
+ ~Range()\r
+ {\r
+ }\r
\r
//! Generate a random number within the range\r
- int Random();\r
+ T Random()\r
+ {\r
+ static base_generator_type generator(static_cast<T>(std::time(0)));\r
+ if (mLow == mHigh)\r
+ {\r
+ return mLow;\r
+ }\r
+ else\r
+ {\r
+ boost::uniform_int<> uni_dist(mLow, mHigh);\r
+ boost::variate_generator<base_generator_type&, boost::uniform_int<> > uni(generator, uni_dist);\r
+ mLastRandom = uni();\r
+ return mLastRandom;\r
+ }\r
+ }\r
\r
//! Property get - High\r
- int High(void) const;\r
+ T High(void) const\r
+ {\r
+ return mHigh;\r
+ }\r
\r
//! Property set - High\r
- void High(const int &value);\r
+ void High(const T &value)\r
+ {\r
+ if (value >= mLow)\r
+ {\r
+ mHigh = value;\r
+ }\r
+ }\r
\r
//! Property get - Low\r
- int Low(void) const;\r
+ T Low(void) const\r
+ {\r
+ return mLow;\r
+ }\r
\r
//! Property set - Low\r
- void Low(const int &value);\r
+ void Low(const T &value)\r
+ {\r
+ if (value <= mHigh)\r
+ {\r
+ mLow = value;\r
+ }\r
+ }\r
\r
//! Property get - Last random number to be generated\r
- int LastRandom(void) const;\r
+ T LastRandom(void) const\r
+ {\r
+ return mLastRandom;\r
+ }\r
\r
private:\r
- int mHigh;\r
- int mLow;\r
- int mLastRandom;\r
+ T mHigh;\r
+ T mLow;\r
+ T mLastRandom;\r
};\r
} \r
}\r
using boost::format;\r
using boost::str;\r
\r
-#include <ctime>\r
-#include <boost/random/linear_congruential.hpp>\r
-#include <boost/random/uniform_int.hpp>\r
-#include <boost/random/uniform_real.hpp>\r
-#include <boost/random/variate_generator.hpp>\r
-// Sun CC doesn't handle boost::iterator_adaptor yet\r
-#if !defined(__SUNPRO_CC) || (__SUNPRO_CC > 0x530)\r
-#include <boost/generator_iterator.hpp>\r
-#endif\r
-\r
-#ifdef BOOST_NO_STDC_NAMESPACE\r
-namespace std {\r
- using ::time;\r
-}\r
-#endif\r
-\r
-// This is a typedef for a random number generator.\r
-// Try boost::mt19937 or boost::ecuyer1988 instead of boost::minstd_rand\r
-typedef boost::minstd_rand base_generator_type;\r
\r
TypeException::TypeException(const string &ErrorMsg, const char *pFilename, int SourceLine)\r
: GameServException(ErrorMsg, pFilename, SourceLine)\r
\r
throw TypeException(str(format("No modifier enumeration found for %1%") % modifier), __FILE__, __LINE__);\r
}\r
-\r
-Range::Range()\r
-{\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
-{\r
- if (mHigh >= mLow)\r
- mHigh = value;\r
-}\r
-\r
-int Range::High(void) const\r
-{\r
- return mHigh;\r
-}\r
-\r
-void Range::Low(const int &value)\r
-{\r
- if (mLow <= mHigh)\r
- mLow = value;\r
-}\r
-\r
-int Range::Low(void) const\r
-{\r
- return mLow;\r
-}\r
-\r
-int Range::Random()\r
-{\r
- static base_generator_type generator(static_cast<int>(std::time(0)));\r
- if (mLow == mHigh)\r
- {\r
- return mLow;\r
- }\r
- else\r
- {\r
- boost::uniform_int<> uni_dist(mHigh, mLow);\r
- boost::variate_generator<base_generator_type&, boost::uniform_int<> > uni(generator, uni_dist);\r
- mLastRandom = uni();\r
- return mLastRandom;\r
- }\r
-}\r
-\r
-int Range::LastRandom(void) const\r
-{\r
- return mLastRandom;\r
-}
\ No newline at end of file
// Methods ////////////////////////////////////////////////////////////\r
virtual shared_ptr<MonsterGO> GetById(const string &Id) const;\r
\r
- virtual vector< shared_ptr<MonsterGO> > GetMonstersByLevelId(const string &LevelId) const;\r
+ virtual vector<string> GetMonsterIdsByLevelId(const string &LevelId) const;\r
\r
virtual bool IdExists(const string &Id) const;\r
\r
*/\r
virtual bool IdExists(const string &Id) const = 0;\r
\r
- virtual vector< shared_ptr<MonsterGO> > GetMonstersByLevelId(const string &LevelId) const = 0;\r
+ virtual vector<string> GetMonsterIdsByLevelId(const string &LevelId) const = 0;\r
\r
private:\r
\r
--- /dev/null
+#ifndef __GS__FIGHTGL_H__\r
+#define __GS__FIGHTGL_H__\r
+\r
+#include <GameServ/GameLayer/GameObjects/PlayerGO.h>\r
+#include <GameServ/GameLayer/GameObjects/MonsterGO.h>\r
+using GameServ::GameLayer::GameObjects::PlayerGO;\r
+using GameServ::GameLayer::GameObjects::MonsterGO;\r
+\r
+#include <GameServ/DataLayer/IPlayerDAO.h>\r
+using GameServ::DataLayer::DataAccessObjects::IPlayerDAO;\r
+\r
+\r
+#include <boost/smart_ptr/shared_ptr.hpp>\r
+using boost::shared_ptr;\r
+\r
+#include <string>\r
+using std::string;\r
+\r
+namespace GameServ { namespace GameLayer {\r
+\r
+class FightGL\r
+{\r
+public:\r
+ FightGL();\r
+ ~FightGL();\r
+ \r
+ unsigned int PlayerAttackMonster(shared_ptr<PlayerGO> spPlayer, shared_ptr<MonsterGO> spMonster);\r
+ unsigned int MonsterAttackPlayer(shared_ptr<MonsterGO> spMonster, shared_ptr<PlayerGO> spPlayer);\r
+\r
+ unsigned int PlayerAttackPlayer(shared_ptr<PlayerGO> spPlayerAttacker, shared_ptr<PlayerGO> spPlayerDefender);\r
+ \r
+\r
+private:\r
+\r
+ unsigned int CalculateAttack(unsigned int strength, unsigned int defense);\r
+ void Initialize();\r
+ shared_ptr<IPlayerDAO> mspPlayerDAO;\r
+};\r
+\r
+}}\r
+\r
+#endif
\ No newline at end of file
virtual ItemTypes::ItemType Type(void) const = 0;\r
\r
//! Property get - Modifiers\r
- map<Modifiers::Modifier, Range> Modifiers(void) const;\r
+ map<Modifiers::Modifier, Range<int> > Modifiers(void) const;\r
\r
//! Property set - Modifiers\r
- void Modifiers(const map<Modifiers::Modifier, Range> &modifiers);\r
+ void Modifiers(const map<Modifiers::Modifier, Range<int> > &modifiers);\r
\r
//! Use item on a game object\r
virtual void Use(shared_ptr<GameObject> spObject);\r
string mName;\r
unsigned long int mPrice;\r
int mUses;\r
- map<Modifiers::Modifier, Range> mModifiers;\r
+ map<Modifiers::Modifier, Range<int> > 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
+ virtual void ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range<int> r);\r
+ virtual void UndoModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range<int> r);\r
};\r
}}}\r
#endif
\ No newline at end of file
unsigned int Number(void) const;\r
\r
//! Property set - Strength Range\r
- void StrengthRange(const Range &value);\r
+ void StrengthRange(const Range<int> &value);\r
//! Property get - Strength Range\r
- Range StrengthRange(void) const;\r
+ Range<int> StrengthRange(void) const;\r
\r
\r
//! Property set - Defense Range\r
- void DefenseRange(const Range &value);\r
+ void DefenseRange(const Range<int> &value);\r
//! Property get - Defense Range\r
- Range DefenseRange(void) const;\r
+ Range<int> DefenseRange(void) const;\r
\r
//! Property set - Gold Range\r
- void GoldRange(const Range &value);\r
+ void GoldRange(const Range<int> &value);\r
//! Property get - Gold Range\r
- Range GoldRange(void) const;\r
+ Range<int> GoldRange(void) const;\r
\r
//! Property set - Experience Range\r
- void ExperienceRange(const Range &value);\r
+ void ExperienceRange(const Range<int> &value);\r
//! Property get - Experience Range\r
- Range ExperienceRange(void) const;\r
+ Range<int> ExperienceRange(void) const;\r
\r
\r
//! Property set - Health Range\r
- void HealthRange(const Range &value);\r
+ void HealthRange(const Range<int> &value);\r
//! Property get - Health Range\r
- Range HealthRange(void) const;\r
+ Range<int> HealthRange(void) const;\r
\r
\r
private:\r
unsigned int mNumber;\r
- Range mStrength;\r
- Range mDefense;\r
- Range mGold;\r
- Range mExperience;\r
- Range mHealth;\r
+ Range<int> mStrength;\r
+ Range<int> mDefense;\r
+ Range<int> mGold;\r
+ Range<int> mExperience;\r
+ Range<int> mHealth;\r
};\r
}}} // GameServ::GameLayer::GameObjects\r
#endif
\ No newline at end of file
\r
virtual ~MasterGO();\r
\r
+ //! Property set - Alive\r
+ void Alive(const bool &value);\r
+ //! Property get - Alive\r
+ bool Alive(void) const;\r
+\r
//! Property set - Level\r
void Level(const unsigned int &value);\r
//! Property get - Level\r
virtual ObjectTypes::ObjectType ObjectType(void) const;\r
\r
private:\r
+ bool mAlive;\r
unsigned int mLevel;\r
string mName;\r
unsigned long int mGold;\r
//! Property set - Death Cry\r
void DeathCry(const string &value);\r
\r
+ //! Property get - Alive\r
+ bool Alive(void) const;\r
+ //! Property set - Alive\r
+ void Alive(const bool &value);\r
+\r
bool operator==(const MonsterGO &right) const;\r
bool operator!=(const MonsterGO &right) const;\r
\r
unsigned int mDefense;\r
string mWeaponName;\r
string mDeathCry;\r
+ bool mAlive;\r
};\r
}}} // GameServ::GameLayer::GameObjects\r
#endif
\ No newline at end of file
void Bank(const unsigned long int &value);\r
\r
//! Property get - Health\r
- int Health(void) const;\r
+ unsigned int Health(void) const;\r
//! Property set - Health\r
- void Health(const int &value);\r
+ void Health(const unsigned int &value);\r
\r
//! Property get - Max Health\r
- int MaxHealth(void) const;\r
+ unsigned int MaxHealth(void) const;\r
//! Property set - Max Health\r
- void MaxHealth(const int &value);\r
+ void MaxHealth(const unsigned int &value);\r
\r
//! Property get - Strength\r
- int Strength(void) const;\r
+ unsigned int Strength(void) const;\r
//! Property set - Strength\r
- void Strength(const int &value);\r
+ void Strength(const unsigned int &value);\r
\r
//! Property get - Defense\r
- int Defense(void) const;\r
+ unsigned int Defense(void) const;\r
//! Property set - Defense\r
- void Defense(const int &value);\r
+ void Defense(const unsigned int &value);\r
\r
//! Property get - Forest Fights\r
int ForestFights(void) const;\r
unsigned long int mExperience;\r
unsigned long int mGold;\r
unsigned long int mBank;\r
- int mHealth;\r
- int mMaxHealth;\r
- int mStrength;\r
- int mDefense;\r
+ unsigned int mHealth;\r
+ unsigned int mMaxHealth;\r
+ unsigned int mStrength;\r
+ unsigned int mDefense;\r
int mForestFights;\r
int mPlayerFights;\r
string mPassword;\r
<Filter\r
Name="GameLayer"\r
>\r
+ <File\r
+ RelativePath=".\src\GameLayer\FightGL.cpp"\r
+ >\r
+ </File>\r
+ <File\r
+ RelativePath=".\include\GameServ\GameLayer\FightGL.h"\r
+ >\r
+ </File>\r
<File\r
RelativePath=".\src\GameLayer\ForestGL.cpp"\r
>\r
{\r
assert(!line.empty());\r
shared_ptr<PotionGO> spPotion = shared_ptr<PotionGO>(new PotionGO());\r
- map<Modifiers::Modifier, Range> modifiers;\r
+ map<Modifiers::Modifier, Range<int> > modifiers;\r
boost::char_separator<char> sep("~", 0, boost::keep_empty_tokens);\r
tokenizer tokens(line, sep);\r
tokenizer::iterator tok_iter = tokens.begin();\r
mFilename % line), __FILE__, __LINE__);\r
}\r
int high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::strength] = Range(high, low);\r
+ modifiers[Modifiers::strength] = Range<int>(high, low);\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
{\r
mFilename % line), __FILE__, __LINE__);\r
}\r
high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::defense] = Range(high, low);\r
+ modifiers[Modifiers::defense] = Range<int>(high, low);\r
\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
mFilename % line), __FILE__, __LINE__);\r
}\r
high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::maxhealth] = Range(high, low);\r
+ modifiers[Modifiers::maxhealth] = Range<int>(high, low);\r
\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
mFilename % line), __FILE__, __LINE__);\r
}\r
high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::health] = Range(high, low);\r
+ modifiers[Modifiers::health] = Range<int>(high, low);\r
\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
mFilename % line), __FILE__, __LINE__);\r
}\r
high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::forestfights] = Range(high, low);\r
+ modifiers[Modifiers::forestfights] = Range<int>(high, low);\r
\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
mFilename % line), __FILE__, __LINE__);\r
}\r
high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::playerfights] = Range(high, low);\r
+ modifiers[Modifiers::playerfights] = Range<int>(high, low);\r
\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
mFilename % line), __FILE__, __LINE__);\r
}\r
high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::gold] = Range(high, low);\r
+ modifiers[Modifiers::gold] = Range<int>(high, low);\r
\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
mFilename % line), __FILE__, __LINE__);\r
}\r
high = lexical_cast<int>((*tok_iter));\r
- modifiers[Modifiers::bank] = Range(high, low);\r
+ modifiers[Modifiers::bank] = Range<int>(high, low);\r
\r
return spPotion;\r
}\r
{\r
assert(!line.empty());\r
shared_ptr<ItemGO> spItem;\r
- map<Modifiers::Modifier, Range> modifiers;\r
+ map<Modifiers::Modifier, Range<int> > modifiers;\r
boost::char_separator<char> sep("~", 0, boost::keep_empty_tokens);\r
tokenizer tokens(line, sep);\r
tokenizer::iterator tok_iter = tokens.begin();\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::strength] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::strength] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::defense] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::defense] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::maxhealth] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::maxhealth] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::health] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::health] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::forestfights] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::forestfights] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::playerfights] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::playerfights] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::gold] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::gold] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
tok_iter++;\r
if (tok_iter == tokens.end())\r
}\r
if ((*tok_iter) != "0")\r
{\r
- modifiers[Modifiers::bank] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
+ modifiers[Modifiers::bank] = Range<int>(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
}\r
spItem->Modifiers(modifiers);\r
\r
line % (*tok_iter)));\r
}\r
\r
- spLevel->StrengthRange(Range(high, low));\r
+ spLevel->StrengthRange(Range<int>(high, low));\r
\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
try\r
{\r
low = lexical_cast<int>((*tok_iter));\r
throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
line % (*tok_iter)));\r
}\r
- spLevel->DefenseRange(Range(high, low));\r
+ spLevel->DefenseRange(Range<int>(high, low));\r
\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
try\r
{\r
low = lexical_cast<int>((*tok_iter));\r
throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
line % (*tok_iter)));\r
}\r
- spLevel->GoldRange(Range(high, low));\r
+ spLevel->GoldRange(Range<int>(high, low));\r
\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
try\r
{\r
low = lexical_cast<int>((*tok_iter));\r
throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
line % (*tok_iter)));\r
}\r
- spLevel->ExperienceRange(Range(high, low));\r
+ spLevel->ExperienceRange(Range<int>(high, low));\r
\r
+ tok_iter++;\r
+ if (tok_iter == tokens.end())\r
+ {\r
+ throw DataLayerException(str(format("Corrupt level line %1%. Missing information") %\r
+ line), __FILE__, __LINE__);\r
+ }\r
try\r
{\r
low = lexical_cast<int>((*tok_iter));\r
throw DataLayerException(str(format("Corrupt level line %1%. Invalid integer value %2%") % \r
line % (*tok_iter)));\r
}\r
- spLevel->HealthRange(Range(high, low));\r
+ spLevel->HealthRange(Range<int>(high, low));\r
\r
return spLevel;\r
}\r
return (iter != spMonsterCache.end());\r
}\r
\r
-vector< shared_ptr<MonsterGO> > FileMonsterDAO::GetMonstersByLevelId(const string &LevelId) const\r
+vector<string> FileMonsterDAO::GetMonsterIdsByLevelId(const string &LevelId) const\r
{\r
- vector< shared_ptr<MonsterGO> > monsters;\r
-\r
- map<string, shared_ptr<MonsterGO> >::const_iterator iter;\r
- for (iter = spMonsterCache.begin(); iter != spMonsterCache.end(); iter++)\r
+ static map<string, vector<string> > MonsterLevelIndex;\r
+ map<string, vector<string> >::const_iterator leveliter;\r
+ leveliter = MonsterLevelIndex.find(LevelId);\r
+ if (leveliter == MonsterLevelIndex.end())\r
{\r
- if (iter->second->LevelId() == LevelId)\r
+ vector<string> monsterIds;\r
+ map<string, shared_ptr<MonsterGO> >::const_iterator iter;\r
+ for (iter = spMonsterCache.begin(); iter != spMonsterCache.end(); iter++)\r
{\r
- monsters.push_back(shared_ptr<MonsterGO>(iter->second->Clone()));\r
+ if (iter->second->LevelId() == LevelId)\r
+ {\r
+ monsterIds.push_back(iter->second->Id());\r
+ }\r
}\r
+ MonsterLevelIndex[LevelId] = monsterIds;\r
+ return monsterIds;\r
+ }\r
+ else\r
+ {\r
+ return MonsterLevelIndex[LevelId];\r
}\r
- return monsters;\r
}\r
--- /dev/null
+#include <GameServ/GameLayer/FightGL.h>\r
+using GameServ::GameLayer::FightGL;\r
+\r
+#include <GameServ/DataLayer/DataAccess.h>\r
+using GameServ::DataLayer::DataAccess;\r
+#include <GameServ/DataLayer/IDAOFactory.h>\r
+using GameServ::DataLayer::IDAOFactory;\r
+\r
+#include <GameServ/Types.h>\r
+using GameServ::Types::Range;\r
+using GameServ::Types::Modifiers;\r
+\r
+FightGL::FightGL()\r
+{\r
+ Initialize();\r
+}\r
+\r
+FightGL::~FightGL()\r
+{\r
+}\r
+\r
+void FightGL::Initialize()\r
+{\r
+ // TODO: Load from config\r
+ shared_ptr<IDAOFactory> factory = DataAccess::GetDataAccessFactory("File");\r
+ mspPlayerDAO = factory->GetPlayerDAO();\r
+}\r
+\r
+unsigned int FightGL::PlayerAttackMonster(shared_ptr<PlayerGO> spPlayer, shared_ptr<MonsterGO> spMonster)\r
+{\r
+ unsigned int attack = CalculateAttack(spPlayer->Strength(), spMonster->Defense());\r
+ if (attack >= spMonster->Health())\r
+ {\r
+ spMonster->Health(0);\r
+ spMonster->Alive(false);\r
+ }\r
+ else\r
+ {\r
+ spMonster->Health(spMonster->Health() - attack);\r
+ }\r
+ return attack;\r
+}\r
+\r
+unsigned int FightGL::MonsterAttackPlayer(shared_ptr<MonsterGO> spMonster, shared_ptr<PlayerGO> spPlayer)\r
+{\r
+ unsigned int attack = CalculateAttack(spMonster->Strength(), spPlayer->Defense());\r
+ if (attack >= spPlayer->Health())\r
+ {\r
+ spPlayer->Health(0);\r
+ spPlayer->Alive(false);\r
+ }\r
+ else\r
+ {\r
+ spPlayer->Health(spPlayer->Health() - attack);\r
+ }\r
+ return attack;\r
+}\r
+\r
+unsigned int FightGL::PlayerAttackPlayer(shared_ptr<PlayerGO> spPlayerAttacker, shared_ptr<PlayerGO> spPlayerDefender)\r
+{\r
+ unsigned int attack = CalculateAttack(spPlayerAttacker->Strength(), spPlayerDefender->Defense());\r
+ if (attack >= spPlayerDefender->Health())\r
+ {\r
+ spPlayerDefender->Health(0);\r
+ spPlayerDefender->Alive(false);\r
+ }\r
+ else\r
+ {\r
+ spPlayerDefender->Health(spPlayerDefender->Health() - attack);\r
+ }\r
+ return attack;\r
+}\r
+\r
+unsigned int FightGL::CalculateAttack(unsigned int strength, unsigned int defense)\r
+{\r
+ if (defense >= strength)\r
+ {\r
+ return 0;\r
+ }\r
+ Range<unsigned int> r(strength, strength / 2);\r
+ if (r.Random() <= defense)\r
+ {\r
+ return 0;\r
+ }\r
+ else\r
+ {\r
+ return r.LastRandom() - defense;\r
+ }\r
+}
\ No newline at end of file
{\r
assert (spPlayer != 0);\r
shared_ptr<LevelGO> spLevel = mspLevelDAO->GetById(spPlayer->LevelId());\r
- vector< shared_ptr<MonsterGO> > monsters = mspMonsterDAO->GetMonstersByLevelId(spLevel->Id());\r
- if (monsters.size() > 0)\r
+ vector<string> monsterIds = mspMonsterDAO->GetMonsterIdsByLevelId(spLevel->Id());\r
+ if (monsterIds.size() > 0)\r
{\r
- Range r(monsters.size() - 1, 0);\r
- shared_ptr<MonsterGO> spMonster = shared_ptr<MonsterGO>(monsters[r.Random()]->Clone());\r
+ Range<unsigned int> r(monsterIds.size() - 1, 0);\r
+ shared_ptr<MonsterGO> spMonster = mspMonsterDAO->GetById(monsterIds[r.Random()]);\r
spMonster->MaxHealth(spLevel->HealthRange().Random());\r
spMonster->Health(spMonster->MaxHealth());\r
spMonster->Strength(spLevel->StrengthRange().Random());\r
mPrice = price;\r
mUses = uses;\r
mModifiers.clear();\r
- mModifiers[Modifiers::strength] = Range(strength, strength);\r
- mModifiers[Modifiers::defense] = Range(defense, defense);\r
- mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth);\r
+ mModifiers[Modifiers::strength] = Range<int>(strength, strength);\r
+ mModifiers[Modifiers::defense] = Range<int>(defense, defense);\r
+ mModifiers[Modifiers::maxhealth] = Range<int>(maxhealth, maxhealth);\r
}\r
\r
ArmorGO::~ArmorGO()\r
\r
void ItemGO::Use(shared_ptr<GameObject> spObject)\r
{\r
- map<Modifiers::Modifier, Range>::const_iterator iter;\r
+ map<Modifiers::Modifier, Range<int> >::const_iterator iter;\r
for (iter = mModifiers.begin(); iter != mModifiers.end(); iter++)\r
{\r
ApplyModifier(spObject, iter->first, iter->second);\r
\r
void ItemGO::Undo(shared_ptr<GameObject> spObject)\r
{\r
- map<Modifiers::Modifier, Range>::const_iterator iter;\r
+ map<Modifiers::Modifier, Range<int> >::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
+void ItemGO::ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range<int> r)\r
{\r
if (spObject->ObjectType() != ObjectTypes::Player)\r
{\r
}\r
}\r
\r
-void ItemGO::UndoModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range r)\r
+void ItemGO::UndoModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range<int> r)\r
{\r
if (spObject->ObjectType() != ObjectTypes::Player)\r
{\r
}\r
}\r
\r
-map<Modifiers::Modifier, Range> ItemGO::Modifiers(void) const\r
+map<Modifiers::Modifier, Range<int> > ItemGO::Modifiers(void) const\r
{\r
return mModifiers;\r
}\r
\r
-void ItemGO::Modifiers(const map<Modifiers::Modifier, Range> &modifiers)\r
+void ItemGO::Modifiers(const map<Modifiers::Modifier, Range<int> > &modifiers)\r
{\r
mModifiers.clear();\r
mModifiers.insert(modifiers.begin(), modifiers.end());\r
return mNumber;\r
}\r
\r
-void LevelGO::StrengthRange(const Range &value)\r
+void LevelGO::StrengthRange(const Range<int> &value)\r
{\r
mStrength = value;\r
}\r
\r
-Range LevelGO::StrengthRange(void) const\r
+Range<int> LevelGO::StrengthRange(void) const\r
{\r
return mStrength;\r
}\r
\r
-void LevelGO::DefenseRange(const Range &value)\r
+void LevelGO::DefenseRange(const Range<int> &value)\r
{\r
mDefense = value;\r
}\r
\r
-Range LevelGO::DefenseRange(void) const\r
+Range<int> LevelGO::DefenseRange(void) const\r
{\r
return mDefense;\r
}\r
\r
-void LevelGO::GoldRange(const Range &value)\r
+void LevelGO::GoldRange(const Range<int> &value)\r
{\r
mGold = value;\r
}\r
\r
-Range LevelGO::GoldRange(void) const\r
+Range<int> LevelGO::GoldRange(void) const\r
{\r
return mGold;\r
}\r
\r
-void LevelGO::ExperienceRange(const Range &value)\r
+void LevelGO::ExperienceRange(const Range<int> &value)\r
{\r
mExperience = value;\r
}\r
\r
-Range LevelGO::ExperienceRange(void) const\r
+Range<int> LevelGO::ExperienceRange(void) const\r
{\r
return mExperience;\r
}\r
\r
-void LevelGO::HealthRange(const Range &value)\r
+void LevelGO::HealthRange(const Range<int> &value)\r
{\r
mHealth = value;\r
}\r
\r
-Range LevelGO::HealthRange(void) const\r
+Range<int> LevelGO::HealthRange(void) const\r
{\r
return mHealth;\r
}\r
mGold = 0;\r
mStrength = 0;\r
mDefense = 0;\r
+ mAlive = true;\r
}\r
\r
MasterGO::MasterGO(const string &Id) : GameObject(Id)\r
mGold = 0;\r
mStrength = 0;\r
mDefense = 0;\r
+ mAlive = true;\r
}\r
\r
MasterGO::~MasterGO()\r
return mPartingWords;\r
}\r
\r
+void MasterGO::Alive(const bool &value)\r
+{\r
+ mAlive = value;\r
+}\r
+\r
+bool MasterGO::Alive(void) const\r
+{\r
+ return mAlive;\r
+}\r
+\r
bool MasterGO::operator==(const MasterGO &right) const\r
{\r
return mId == right.mId && mHealth == right.mHealth &&\r
mStrength = 0;\r
mDefense = 0;\r
mExperience = 0;\r
+ mAlive = true;\r
}\r
\r
MonsterGO::~MonsterGO()\r
return mDeathCry;\r
}\r
\r
+void MonsterGO::Alive(const bool &value)\r
+{\r
+ mAlive = value;\r
+}\r
+\r
+bool MonsterGO::Alive(void) const\r
+{\r
+ return mAlive;\r
+}\r
+\r
bool MonsterGO::operator==(const MonsterGO &right) const\r
{\r
return mId == right.mId && mfkLevelId == right.mfkLevelId && mHealth == right.mHealth &&\r
mBank = value;\r
}\r
\r
-int PlayerGO::Health(void) const\r
+unsigned int PlayerGO::Health(void) const\r
{\r
return mHealth;\r
}\r
\r
-void PlayerGO::Health(const int &value)\r
+void PlayerGO::Health(const unsigned int &value)\r
{\r
assert(value >= 0);\r
mHealth = value;\r
}\r
\r
-int PlayerGO::MaxHealth(void) const\r
+unsigned int PlayerGO::MaxHealth(void) const\r
{\r
return mMaxHealth;\r
}\r
\r
-void PlayerGO::MaxHealth(const int &value)\r
+void PlayerGO::MaxHealth(const unsigned int &value)\r
{\r
assert (value >= 0);\r
mMaxHealth = value;\r
}\r
\r
-int PlayerGO::Strength(void) const\r
+unsigned int PlayerGO::Strength(void) const\r
{\r
return mStrength;\r
}\r
\r
-void PlayerGO::Strength(const int &value)\r
+void PlayerGO::Strength(const unsigned int &value)\r
{\r
assert (value > 0);\r
mStrength = value;\r
}\r
\r
-int PlayerGO::Defense(void) const\r
+unsigned int PlayerGO::Defense(void) const\r
{\r
return mDefense;\r
}\r
\r
-void PlayerGO::Defense(const int &value)\r
+void PlayerGO::Defense(const unsigned int &value)\r
{\r
assert(value > 0);\r
mDefense = value;\r
mPrice = price;\r
mUses = uses;\r
mModifiers.clear();\r
- mModifiers[Modifiers::strength] = Range(strength, strength);\r
- mModifiers[Modifiers::defense] = Range(defense, defense);\r
- mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth);\r
+ mModifiers[Modifiers::strength] = Range<int>(strength, strength);\r
+ mModifiers[Modifiers::defense] = Range<int>(defense, defense);\r
+ mModifiers[Modifiers::maxhealth] = Range<int>(maxhealth, maxhealth);\r
}\r
\r
PotionGO::~PotionGO()\r
mPrice = price;\r
mUses = uses;\r
mModifiers.clear();\r
- mModifiers[Modifiers::strength] = Range(strength, strength);\r
- mModifiers[Modifiers::defense] = Range(defense, defense);\r
- mModifiers[Modifiers::maxhealth] = Range(maxhealth, maxhealth);\r
+ mModifiers[Modifiers::strength] = Range<int>(strength, strength);\r
+ mModifiers[Modifiers::defense] = Range<int>(defense, defense);\r
+ mModifiers[Modifiers::maxhealth] = Range<int>(maxhealth, maxhealth);\r
}\r
\r
WeaponGO::~WeaponGO()\r
}\r
\r
ForestGL fgl;\r
- shared_ptr<MonsterGO> spMonster = fgl.GetRandomMonsterForPlayer(spPlayer);\r
- cout << MonsterInfo(spMonster) << endl;\r
-\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
+ for (int x = 0; x < 10000; x++)\r
{\r
- shared_ptr<ItemGO> spItem = (*iter);\r
- cout << str(format("Name: %1% Type: %2%") % spItem->Name() % ItemTypes::GetName(spItem->Type())) << endl;\r
- }*/\r
- \r
+ shared_ptr<MonsterGO> spMonster = fgl.GetRandomMonsterForPlayer(spPlayer);\r
+ //cout << "\nMonster:\n" << MonsterInfo(spMonster) << endl;\r
+ }\r
\r
\r
//map <int, int> frequencies;\r
cout << e.VerboseError() << endl;\r
\r
}\r
+ cout << "Done. Type a key and hit enter to quit." << endl;\r
string temp;\r
- cin >> temp;\r
+ getline(cin, temp);\r
return 0;\r
}\r
\r