summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Enchantments.cpp6
-rw-r--r--src/Enchantments.h2
-rw-r--r--src/FastRandom.cpp11
-rw-r--r--src/FastRandom.h2
-rw-r--r--src/ItemGrid.cpp15
5 files changed, 30 insertions, 6 deletions
diff --git a/src/Enchantments.cpp b/src/Enchantments.cpp
index 264878c22..e106ef398 100644
--- a/src/Enchantments.cpp
+++ b/src/Enchantments.cpp
@@ -994,9 +994,13 @@ void cEnchantments::CheckEnchantmentConflictsFromVector(cWeightedEnchantments &
-cEnchantments cEnchantments::GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments)
+cEnchantments cEnchantments::GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments, int a_Seed)
{
cFastRandom Random;
+ if (a_Seed != -1)
+ {
+ Random = cFastRandom(a_Seed);
+ }
int AllWeights = 0;
for (cWeightedEnchantments::iterator it = a_Enchantments.begin(); it != a_Enchantments.end(); ++it)
diff --git a/src/Enchantments.h b/src/Enchantments.h
index 824f6aa55..798d3bf61 100644
--- a/src/Enchantments.h
+++ b/src/Enchantments.h
@@ -126,7 +126,7 @@ public:
static void CheckEnchantmentConflictsFromVector(cWeightedEnchantments & a_Enchantments, cEnchantments a_FirstEnchantment);
/** Gets random enchantment from Vector and returns it */
- static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments);
+ static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments, int a_Seed = -1);
/** Returns true if a_Other doesn't contain exactly the same enchantments and levels */
bool operator !=(const cEnchantments & a_Other) const;
diff --git a/src/FastRandom.cpp b/src/FastRandom.cpp
index 42bf5f3f9..052d976da 100644
--- a/src/FastRandom.cpp
+++ b/src/FastRandom.cpp
@@ -90,10 +90,17 @@ int cFastRandom::m_SeedCounter = 0;
-cFastRandom::cFastRandom(void) :
- m_Seed(m_SeedCounter++),
+cFastRandom::cFastRandom(int a_Seed) :
m_Counter(0)
{
+ if (a_Seed == -1)
+ {
+ m_Seed = m_SeedCounter++;
+ }
+ else
+ {
+ m_Seed = a_Seed;
+ }
}
diff --git a/src/FastRandom.h b/src/FastRandom.h
index cebebad96..5a8ac097a 100644
--- a/src/FastRandom.h
+++ b/src/FastRandom.h
@@ -30,7 +30,7 @@ salts, the values they get will be different.
class cFastRandom
{
public:
- cFastRandom(void);
+ cFastRandom(int a_Seed = -1);
/// Returns a random int in the range [0 .. a_Range - 1]; a_Range must be less than 1M
int NextInt(int a_Range);
diff --git a/src/ItemGrid.cpp b/src/ItemGrid.cpp
index 2344dc0a5..68e753e08 100644
--- a/src/ItemGrid.cpp
+++ b/src/ItemGrid.cpp
@@ -637,7 +637,20 @@ void cItemGrid::GenerateRandomLootWithBooks(const cLootProbab * a_LootProbabs, s
int Rnd = (Noise.IntNoise1DInt(i) / 7);
int LootRnd = Rnd % TotalProbab;
Rnd >>= 8;
- cItem CurrentLoot = cItem(E_ITEM_BOOK, 1, 0); // TODO: enchantment
+ cItem CurrentLoot = cItem(E_ITEM_ENCHANTED_BOOK, 1, 0);
+
+ // Choose the enchantments
+ cWeightedEnchantments Enchantments;
+ cEnchantments::AddItemEnchantmentWeights(Enchantments, E_ITEM_BOOK, 24 + Noise.IntNoise2DInt(a_Seed, TotalProbab) % 7);
+ int NumEnchantments = Noise.IntNoise3DInt(TotalProbab, Rnd, a_Seed) % 5; // The number of enchantments this book wil get.
+
+ for (int I = 0; I <= NumEnchantments; I++)
+ {
+ cEnchantments Enchantment = cEnchantments::GetRandomEnchantmentFromVector(Enchantments, a_Seed);
+ CurrentLoot.m_Enchantments.AddFromString(Enchantment.ToString());
+ cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment);
+ }
+
for (size_t j = 0; j < a_CountLootProbabs; j++)
{
LootRnd -= a_LootProbabs[i].m_Weight;