|
@@ -18,7 +18,7 @@ enum class EGameSettings;
|
|
|
|
|
|
class CGHeroInstance;
|
|
|
|
|
|
-class RandomizationBias
|
|
|
+class DLL_LINKAGE RandomizationBias
|
|
|
{
|
|
|
int32_t accumulatedBias = 0;
|
|
|
|
|
@@ -26,6 +26,12 @@ public:
|
|
|
/// Performs coin flip with specified success chance
|
|
|
/// Returns true with probability successChance percents, and false with probability totalWeight-successChance percents
|
|
|
bool roll(vstd::RNG & generator, int successChance, int totalWeight, int biasValue);
|
|
|
+
|
|
|
+ template<typename Handler>
|
|
|
+ void serialize(Handler & h)
|
|
|
+ {
|
|
|
+ h & accumulatedBias;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
/// Biased randomizer that has following properties:
|
|
@@ -34,32 +40,44 @@ public:
|
|
|
/// - at bias value between 1..99 similar guarantee is also provided, but with larger number of rolls
|
|
|
/// No matter what bias is, statistical probability on large number of rolls remains the same
|
|
|
/// Its goal is to simulate human expectations of random distributions and reduce frustration from "bad" rolls
|
|
|
-class RandomGeneratorWithBias
|
|
|
+class DLL_LINKAGE RandomGeneratorWithBias
|
|
|
{
|
|
|
CRandomGenerator generator;
|
|
|
RandomizationBias bias;
|
|
|
|
|
|
public:
|
|
|
- explicit RandomGeneratorWithBias(int seed);
|
|
|
+ explicit RandomGeneratorWithBias(int seed = 0);
|
|
|
/// Performs coin flip with specified success chance
|
|
|
/// Returns true with probability successChance percents, and false with probability 100-successChance percents
|
|
|
bool roll(int successChance, int totalWeight, int biasValue);
|
|
|
+
|
|
|
+ template<typename Handler>
|
|
|
+ void serialize(Handler & h)
|
|
|
+ {
|
|
|
+ h & generator;
|
|
|
+ h & bias;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
class DLL_LINKAGE GameRandomizer final : public IGameRandomizer
|
|
|
{
|
|
|
- static constexpr int biasValueLuckMorale = 10;
|
|
|
- static constexpr int biasValueAbility = 25;
|
|
|
-
|
|
|
struct HeroSkillRandomizer
|
|
|
{
|
|
|
- explicit HeroSkillRandomizer(int seed)
|
|
|
+ explicit HeroSkillRandomizer(int seed = 0)
|
|
|
: seed(seed)
|
|
|
{}
|
|
|
|
|
|
CRandomGenerator seed;
|
|
|
int8_t magicSchoolCounter = 1;
|
|
|
int8_t wisdomCounter = 1;
|
|
|
+
|
|
|
+ template<typename Handler>
|
|
|
+ void serialize(Handler & h)
|
|
|
+ {
|
|
|
+ h & seed;
|
|
|
+ h & magicSchoolCounter;
|
|
|
+ h & wisdomCounter;
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
const IGameInfoCallback & gameInfo;
|
|
@@ -71,7 +89,6 @@ class DLL_LINKAGE GameRandomizer final : public IGameRandomizer
|
|
|
std::map<ArtifactID, int> allocatedArtifacts;
|
|
|
|
|
|
std::map<HeroTypeID, HeroSkillRandomizer> heroSkillSeed;
|
|
|
- std::map<PlayerColor, CRandomGenerator> playerTavern;
|
|
|
|
|
|
std::map<ObjectInstanceID, RandomGeneratorWithBias> goodMoraleSeed;
|
|
|
std::map<ObjectInstanceID, RandomGeneratorWithBias> badMoraleSeed;
|
|
@@ -79,7 +96,7 @@ class DLL_LINKAGE GameRandomizer final : public IGameRandomizer
|
|
|
std::map<ObjectInstanceID, RandomGeneratorWithBias> badLuckSeed;
|
|
|
std::map<ObjectInstanceID, RandomGeneratorWithBias> combatAbilitySeed;
|
|
|
|
|
|
- bool rollMoraleLuck(std::map<ObjectInstanceID, RandomGeneratorWithBias> & seeds, ObjectInstanceID actor, int moraleLuckValue, EGameSettings diceSize, EGameSettings diceWeights);
|
|
|
+ bool rollMoraleLuck(std::map<ObjectInstanceID, RandomGeneratorWithBias> & seeds, ObjectInstanceID actor, int moraleLuckValue, EGameSettings biasValue, EGameSettings diceSize, EGameSettings diceWeights);
|
|
|
|
|
|
public:
|
|
|
explicit GameRandomizer(const IGameInfoCallback & gameInfo);
|
|
@@ -111,6 +128,17 @@ public:
|
|
|
void serialize(Handler & h)
|
|
|
{
|
|
|
h & globalRandomNumberGenerator;
|
|
|
+
|
|
|
+ if (h.hasFeature(Handler::Version::RANDOMIZATION_REWORK))
|
|
|
+ {
|
|
|
+ h & allocatedArtifacts;
|
|
|
+ h & heroSkillSeed;
|
|
|
+ h & goodMoraleSeed;
|
|
|
+ h & badMoraleSeed;
|
|
|
+ h & goodLuckSeed;
|
|
|
+ h & badLuckSeed;
|
|
|
+ h & combatAbilitySeed;
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
|