Armor~3014~Dragon Scales~100000000~-1~0~600~0~0\r
Armor~3015~Adamantium~400000000~-1~0~1000~0~0\r
# Potions 6001-9000\r
-# type~ID~name~price~uses~strengthmax~defensemax~maxhpmod~hpmod~forestfightsmod~playerfightsmod~goldmod~bankbalmod\r
-Potion~6001~Very Weak Healing Potion~600~1~0~0~0~30~0~0~0~0\r
-Potion~6002~Weak Healing Potion~1200~1~0~0~0~60~0~0~0~0\r
-Potion~6003~Healing Potion~5400~1~0~0~0~250~0~0~0~0\r
-Potion~6004~Strong Healing Potion~50000~1~0~0~0~1000~0~0~0~0\r
-Potion~6005~Defense Potion~25000~1~0~2~0~0~0~0~0~0\r
-Potion~6006~Strength Potion~25000~1~2~0~0~0~0~0~0~0\r
-Potion~6007~Max Health Potion~25000~1~0~0~4~0~0~0~0~0\r
+#type~id~name~price~uses~strength low~strength high~defense l~defense h~maxhp range~hp range~forest fights range\\r
+#~player fights range~gold range~bank range\r
+Potion~6001~Very Weak Healing Potion~600~1~0~0~0~0~0~0~10~40~0~0~0~0~0~0~0~0\r
+Potion~6002~Weak Healing Potion~1200~1~0~0~0~0~0~0~20~60~0~0~0~0~0~0~0~0\r
+Potion~6003~Healing Potion~5400~1~0~0~0~0~0~0~100~250~0~0~0~0~0~0~0~0\r
+Potion~6004~Strong Healing Potion~50000~1~0~0~0~0~0~0~500~1000~0~0~0~0~0~0~0~0\r
+Potion~6005~Defense Potion~25000~1~0~0~1~2~0~0~0~0~0~0~0~0~0~0~0~0\r
+Potion~6006~Strength Potion~25000~1~1~2~0~0~0~0~0~0~0~0~0~0~0~0~0~0\r
+Potion~6007~Health Potion~25000~1~0~0~0~0~2~6~0~0~0~0~0~0~0~0~0~0\r
# Miscellaneous 9001-12000
\ No newline at end of file
#include <GameServ/GameServException.h>\r
using GameServ::Exceptions::GameServException;\r
\r
-\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
-\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
namespace GameServ \r
{ \r
namespace Types\r
class Range\r
{\r
public:\r
+ Range();\r
Range(const unsigned int &high, const unsigned int &low);\r
~Range();\r
\r
private:\r
unsigned int mHigh;\r
unsigned int mLow;\r
- base_generator_type generator;\r
};\r
} \r
}\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
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
+}\r
+\r
Range::Range(const unsigned int &high, const unsigned int &low)\r
{\r
mHigh = high;\r
mLow = low;\r
- generator.seed(static_cast<unsigned int>(std::time(0)));\r
}\r
\r
Range::~Range()\r
\r
unsigned int Range::Random()\r
{\r
+ static base_generator_type generator(static_cast<unsigned 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<unsigned int>(uni());\r
\r
//! Creates the ItemGO found at iterator position\r
shared_ptr<ItemGO> CreateItemFromLine(const string &line) const;\r
+ shared_ptr<ItemGO> CreatePotionFromLine(const string &line) const;\r
\r
//! Get the Item database file path\r
string GetItemFilePath(void) const;\r
#include <GameServ/Types.h>\r
using GameServ::Types::ItemTypes;\r
using GameServ::Types::Modifiers;\r
+using GameServ::Types::Range;\r
\r
#include <string>\r
using std::string;\r
void Type(const ItemTypes::ItemType &value);\r
\r
//! Property get - Modifiers\r
- map<Modifiers::Modifier, int> Modifiers(void) const;\r
+ map<Modifiers::Modifier, Range> Modifiers(void) const;\r
\r
//! Property set - Modifiers\r
- void Modifiers(const map<Modifiers::Modifier, int> &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
unsigned long int mPrice;\r
int mUses;\r
ItemTypes::ItemType mType;\r
- map<Modifiers::Modifier, int> mModifiers;\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, const int &num);\r
+ virtual void ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range r);\r
};\r
}}}\r
#endif
\ No newline at end of file
return shared_ptr<ItemGO>();\r
}\r
}\r
+shared_ptr<ItemGO> FileItemDAO::CreatePotionFromLine(const string &line) const\r
+{\r
+ shared_ptr<PotionGO> spPotion = shared_ptr<PotionGO>(new PotionGO());\r
+\r
+ return spPotion;\r
+}\r
\r
shared_ptr<ItemGO> FileItemDAO::CreateItemFromLine(const string &line) const\r
{\r
assert(!line.empty());\r
shared_ptr<ItemGO> spItem;\r
- map<Modifiers::Modifier, int> modifiers;\r
+ map<Modifiers::Modifier, Range> 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
spItem = shared_ptr<ArmorGO>(new ArmorGO());\r
break;\r
case ItemTypes::Potion:\r
- spItem = shared_ptr<PotionGO>(new PotionGO());\r
+ return CreatePotionFromLine(line);\r
break;\r
default:\r
throw DataLayerException(str(format("Unknown Item type: %1%") % type), __FILE__, __LINE__);\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
+ modifiers[Modifiers::strength] = Range(lexical_cast<int>((*tok_iter)), 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
+ modifiers[Modifiers::defense] = Range(lexical_cast<int>((*tok_iter)), 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::maxhealth] = lexical_cast<int>((*tok_iter));\r
+ modifiers[Modifiers::maxhealth] = Range(lexical_cast<int>((*tok_iter)), 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::health] = lexical_cast<int>((*tok_iter));\r
+ modifiers[Modifiers::health] = Range(lexical_cast<int>((*tok_iter)), 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
+ modifiers[Modifiers::forestfights] = Range(lexical_cast<int>((*tok_iter)), 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
+ modifiers[Modifiers::playerfights] = Range(lexical_cast<int>((*tok_iter)), 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
+ modifiers[Modifiers::gold] = Range(lexical_cast<int>((*tok_iter)), 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
+ modifiers[Modifiers::bank] = Range(lexical_cast<int>((*tok_iter)), lexical_cast<int>((*tok_iter)));\r
spItem->Modifiers(modifiers);\r
\r
return spItem;\r
mPrice = price;\r
mUses = uses;\r
mModifiers.clear();\r
- mModifiers[Modifiers::strength] = strength;\r
- mModifiers[Modifiers::defense] = defense;\r
- mModifiers[Modifiers::maxhealth] = maxhealth;\r
+ 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
#include <GameServ/Types.h>\r
using GameServ::Types::ItemTypes;\r
using GameServ::Types::Modifiers;\r
+using GameServ::Types::Range;\r
\r
#include <string>\r
using std::string;\r
\r
void ItemGO::Use(shared_ptr<GameObject> spPlayer)\r
{\r
- map<Modifiers::Modifier, int>::const_iterator iter;\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
}\r
}\r
\r
-void ItemGO::ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, const int &num)\r
+void ItemGO::ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range r)\r
{\r
shared_ptr<PlayerGO> spPlayer = shared_static_cast<PlayerGO>(spObject);\r
switch (modifier)\r
{\r
case Modifiers::strength:\r
- spPlayer->Strength(spPlayer->Strength() + num);\r
+ spPlayer->Strength(spPlayer->Strength() + r.Random());\r
break;\r
case Modifiers::defense:\r
- spPlayer->Defense(spPlayer->Defense() + num);\r
+ spPlayer->Defense(spPlayer->Defense() + r.Random());\r
break;\r
case Modifiers::health:\r
- spPlayer->Health(spPlayer->Health() + num);\r
+ spPlayer->Health(spPlayer->Health() + r.Random());\r
break;\r
case Modifiers::maxhealth:\r
- spPlayer->MaxHealth(spPlayer->MaxHealth() + num);\r
+ spPlayer->MaxHealth(spPlayer->MaxHealth() + r.Random());\r
break;\r
case Modifiers::gold:\r
- spPlayer->Gold(spPlayer->Gold() + num);\r
+ spPlayer->Gold(spPlayer->Gold() + r.Random());\r
break;\r
case Modifiers::bank:\r
- spPlayer->Bank(spPlayer->Bank() + num);\r
+ spPlayer->Bank(spPlayer->Bank() + r.Random());\r
break;\r
case Modifiers::forestfights:\r
- spPlayer->ForestFights(spPlayer->ForestFights() + num);\r
+ spPlayer->ForestFights(spPlayer->ForestFights() + r.Random());\r
break;\r
case Modifiers::playerfights:\r
- spPlayer->PlayerFights(spPlayer->PlayerFights() + num);\r
+ spPlayer->PlayerFights(spPlayer->PlayerFights() + r.Random());\r
break;\r
default:\r
throw GameServException(str(format("Invalid modifier %1%") % modifier), __FILE__, __LINE__);\r
mType = value;\r
}\r
\r
-map<Modifiers::Modifier, int> ItemGO::Modifiers(void) const\r
+map<Modifiers::Modifier, Range> ItemGO::Modifiers(void) const\r
{\r
return mModifiers;\r
}\r
\r
-void ItemGO::Modifiers(const map<Modifiers::Modifier, int> &modifiers)\r
+void ItemGO::Modifiers(const map<Modifiers::Modifier, Range> &modifiers)\r
{\r
mModifiers.clear();\r
mModifiers.insert(modifiers.begin(), modifiers.end());\r
mPrice = price;\r
mUses = uses;\r
mModifiers.clear();\r
- mModifiers[Modifiers::strength] = strength;\r
- mModifiers[Modifiers::defense] = defense;\r
- mModifiers[Modifiers::maxhealth] = maxhealth;\r
+ 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
mPrice = price;\r
mUses = uses;\r
mModifiers.clear();\r
- mModifiers[Modifiers::strength] = strength;\r
- mModifiers[Modifiers::defense] = defense;\r
- mModifiers[Modifiers::maxhealth] = maxhealth;\r
+ 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
spPlayer->Name("Kainazzzo");\r
pgl.Insert(spPlayer);*/\r
\r
- Range testrange(20, 100);\r
-\r
- for (int x = 0; x < 100; x++)\r
+ \r
+ map <unsigned int, unsigned int> frequencies;\r
+ int x;\r
+ for (x = 0; x < 1000000; x++)\r
+ {\r
+ Range testrange(1, 100);\r
+ unsigned int randnum = testrange.Random();\r
+ frequencies[randnum]++;\r
+ }\r
+ map<unsigned int, unsigned int>::const_iterator iter;\r
+ for (iter = frequencies.begin(); iter != frequencies.end(); iter++)\r
{\r
- cout << testrange.Random() << endl;\r
+ cout << iter->first << ": ";\r
+ cout << (iter->second / (double)(x + 1)) * 100 << '%' << endl;\r
}\r
}\r
catch (GameServException &e)\r