Fixed a possible division by zero.
This commit is contained in:
parent
0d6672bf5d
commit
9e9459a367
|
@ -1021,26 +1021,34 @@ cEnchantments cEnchantments::GetRandomEnchantmentFromVector(cWeightedEnchantment
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cEnchantments cEnchantments::GenerateEnchantmentFromVector(cWeightedEnchantments & a_Enchantments, int a_Seed)
|
cEnchantments cEnchantments::SelectEnchantmentFromVector(const cWeightedEnchantments & a_Enchantments, int a_Seed)
|
||||||
{
|
{
|
||||||
|
// Sum up all the enchantments' weights:
|
||||||
int AllWeights = 0;
|
int AllWeights = 0;
|
||||||
for (const auto Enchantment : a_Enchantments)
|
for (const auto Enchantment : a_Enchantments)
|
||||||
{
|
{
|
||||||
AllWeights += Enchantment.m_Weight;
|
AllWeights += Enchantment.m_Weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If there's no weight for any of the enchantments, return an empty enchantment
|
||||||
|
if (AllWeights <= 0)
|
||||||
|
{
|
||||||
|
return cEnchantments();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pick a random enchantment:
|
||||||
cNoise Noise(a_Seed);
|
cNoise Noise(a_Seed);
|
||||||
int RandomNumber = Noise.IntNoise1DInt(AllWeights) / 7 % AllWeights;
|
int RandomNumber = Noise.IntNoise1DInt(AllWeights) / 7 % AllWeights;
|
||||||
|
|
||||||
for (const auto Enchantment : a_Enchantments)
|
for (const auto Enchantment : a_Enchantments)
|
||||||
{
|
{
|
||||||
RandomNumber -= Enchantment.m_Weight;
|
RandomNumber -= Enchantment.m_Weight;
|
||||||
if (RandomNumber < 0)
|
if (RandomNumber <= 0)
|
||||||
{
|
{
|
||||||
return Enchantment.m_Enchantments;
|
return Enchantment.m_Enchantments;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No enchantment picked, return an empty one (we probably shouldn't ever get here):
|
||||||
return cEnchantments();
|
return cEnchantments();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,8 +128,10 @@ public:
|
||||||
/** Gets random enchantment from Vector and returns it */
|
/** Gets random enchantment from Vector and returns it */
|
||||||
static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments);
|
static cEnchantments GetRandomEnchantmentFromVector(cWeightedEnchantments & a_Enchantments);
|
||||||
|
|
||||||
/** Returns an enchantment from a Vector using cNoise. Mostly used for generators.*/
|
/** Selects one enchantment from a Vector using cNoise. Mostly used for generators.
|
||||||
static cEnchantments GenerateEnchantmentFromVector(cWeightedEnchantments & a_Enchantments, int a_Seed);
|
Uses the enchantments' weights for the random distribution.
|
||||||
|
If a_Enchantments is empty, returns an empty enchantment. */
|
||||||
|
static cEnchantments SelectEnchantmentFromVector(const cWeightedEnchantments & a_Enchantments, int a_Seed);
|
||||||
|
|
||||||
/** Returns true if a_Other doesn't contain exactly the same enchantments and levels */
|
/** Returns true if a_Other doesn't contain exactly the same enchantments and levels */
|
||||||
bool operator !=(const cEnchantments & a_Other) const;
|
bool operator !=(const cEnchantments & a_Other) const;
|
||||||
|
|
|
@ -646,7 +646,7 @@ void cItemGrid::GenerateRandomLootWithBooks(const cLootProbab * a_LootProbabs, s
|
||||||
|
|
||||||
for (int j = 0; j <= NumEnchantments; j++)
|
for (int j = 0; j <= NumEnchantments; j++)
|
||||||
{
|
{
|
||||||
cEnchantments Enchantment = cEnchantments::GenerateEnchantmentFromVector(Enchantments, Noise.IntNoise2DInt(NumEnchantments, i));
|
cEnchantments Enchantment = cEnchantments::SelectEnchantmentFromVector(Enchantments, Noise.IntNoise2DInt(NumEnchantments, i));
|
||||||
CurrentLoot.m_Enchantments.Add(Enchantment);
|
CurrentLoot.m_Enchantments.Add(Enchantment);
|
||||||
cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment);
|
cEnchantments::RemoveEnchantmentWeightFromVector(Enchantments, Enchantment);
|
||||||
cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment);
|
cEnchantments::CheckEnchantmentConflictsFromVector(Enchantments, Enchantment);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user