|
@@ -938,31 +938,22 @@ void BattleActionProcessor::makeAttack(const CBattleInfoCallback & battle, const
|
|
|
bat.flags |= BattleAttack::COUNTER;
|
|
|
|
|
|
const int attackerLuck = attacker->luckVal();
|
|
|
+ ObjectInstanceID ownerArmy = battle.getBattle()->getSideArmy(attacker->unitSide())->id;
|
|
|
|
|
|
- if(attackerLuck > 0)
|
|
|
- {
|
|
|
- ObjectInstanceID ownerArmy = battle.getBattle()->getSideArmy(attacker->unitSide())->id;
|
|
|
- if (gameHandler->randomizer->rollGoodLuck(ownerArmy, attackerLuck))
|
|
|
- bat.flags |= BattleAttack::LUCKY;
|
|
|
- }
|
|
|
+ if(attackerLuck > 0 && gameHandler->randomizer->rollGoodLuck(ownerArmy, attackerLuck))
|
|
|
+ bat.flags |= BattleAttack::LUCKY;
|
|
|
|
|
|
- if(attackerLuck < 0)
|
|
|
- {
|
|
|
- ObjectInstanceID ownerArmy = battle.getBattle()->getSideArmy(attacker->unitSide())->id;
|
|
|
- if (gameHandler->randomizer->rollBadLuck(ownerArmy, -attackerLuck))
|
|
|
- bat.flags |= BattleAttack::UNLUCKY;
|
|
|
- }
|
|
|
+ if(attackerLuck < 0 && gameHandler->randomizer->rollBadLuck(ownerArmy, -attackerLuck))
|
|
|
+ bat.flags |= BattleAttack::UNLUCKY;
|
|
|
|
|
|
- if (gameHandler->getRandomGenerator().nextInt(99) < attacker->valOfBonuses(BonusType::DOUBLE_DAMAGE_CHANCE))
|
|
|
- {
|
|
|
+ if (gameHandler->randomizer->rollCombatAbility(ownerArmy, attacker->valOfBonuses(BonusType::DOUBLE_DAMAGE_CHANCE)))
|
|
|
bat.flags |= BattleAttack::DEATH_BLOW;
|
|
|
- }
|
|
|
|
|
|
const auto * owner = battle.battleGetFightingHero(attacker->unitSide());
|
|
|
if(owner)
|
|
|
{
|
|
|
int chance = owner->valOfBonuses(BonusType::BONUS_DAMAGE_CHANCE, BonusSubtypeID(attacker->creatureId()));
|
|
|
- if (chance > gameHandler->getRandomGenerator().nextInt(99))
|
|
|
+ if (gameHandler->randomizer->rollCombatAbility(ownerArmy, chance))
|
|
|
bat.flags |= BattleAttack::BALLISTA_DOUBLE_DMG;
|
|
|
}
|
|
|
|
|
@@ -1120,6 +1111,8 @@ void BattleActionProcessor::makeAttack(const CBattleInfoCallback & battle, const
|
|
|
|
|
|
void BattleActionProcessor::attackCasting(const CBattleInfoCallback & battle, bool ranged, BonusType attackMode, const battle::Unit * attacker, const CStack * defender)
|
|
|
{
|
|
|
+ ObjectInstanceID ownerArmy = battle.getBattle()->getSideArmy(attacker->unitSide())->id;
|
|
|
+
|
|
|
if(attacker->hasBonusOfType(attackMode))
|
|
|
{
|
|
|
TConstBonusListPtr spells = attacker->getBonuses(Selector::type()(attackMode));
|
|
@@ -1163,7 +1156,7 @@ void BattleActionProcessor::attackCasting(const CBattleInfoCallback & battle, bo
|
|
|
continue;
|
|
|
|
|
|
//check if spell should be cast (probability handling)
|
|
|
- if(gameHandler->getRandomGenerator().nextInt(99) >= chance)
|
|
|
+ if (!gameHandler->randomizer->rollCombatAbility(ownerArmy, chance))
|
|
|
continue;
|
|
|
|
|
|
//casting
|
|
@@ -1319,9 +1312,11 @@ void BattleActionProcessor::handleAfterAttackCasting(const CBattleInfoCallback &
|
|
|
|
|
|
int64_t acidDamage = 0;
|
|
|
TConstBonusListPtr acidBreath = attacker->getBonuses(Selector::type()(BonusType::ACID_BREATH));
|
|
|
+ ObjectInstanceID ownerArmy = battle.getBattle()->getSideArmy(attacker->unitSide())->id;
|
|
|
+
|
|
|
for(const auto & b : *acidBreath)
|
|
|
{
|
|
|
- if(b->additionalInfo[0] > gameHandler->getRandomGenerator().nextInt(99))
|
|
|
+ if (gameHandler->randomizer->rollCombatAbility(ownerArmy, b->additionalInfo[0]))
|
|
|
acidDamage += b->val;
|
|
|
}
|
|
|
|
|
@@ -1345,10 +1340,9 @@ void BattleActionProcessor::handleAfterAttackCasting(const CBattleInfoCallback &
|
|
|
|
|
|
if(attacker->hasBonusOfType(BonusType::TRANSMUTATION) && defender->isLiving()) //transmutation mechanics, similar to WoG werewolf ability
|
|
|
{
|
|
|
- double chanceToTrigger = attacker->valOfBonuses(BonusType::TRANSMUTATION) / 100.0f;
|
|
|
- vstd::amin(chanceToTrigger, 1); //cap at 100%
|
|
|
-
|
|
|
- if(gameHandler->getRandomGenerator().nextDouble(0, 1) > chanceToTrigger)
|
|
|
+ ObjectInstanceID ownerArmy = battle.getBattle()->getSideArmy(attacker->unitSide())->id;
|
|
|
+ int chanceToTrigger = attacker->valOfBonuses(BonusType::TRANSMUTATION);
|
|
|
+ if (!gameHandler->randomizer->rollCombatAbility(ownerArmy, chanceToTrigger))
|
|
|
return;
|
|
|
|
|
|
int bonusAdditionalInfo = attacker->getBonus(Selector::type()(BonusType::TRANSMUTATION))->additionalInfo[0];
|
|
@@ -1395,24 +1389,23 @@ void BattleActionProcessor::handleAfterAttackCasting(const CBattleInfoCallback &
|
|
|
|
|
|
if(attacker->hasBonusOfType(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillPercentage) || attacker->hasBonusOfType(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillAmount))
|
|
|
{
|
|
|
- double chanceToTrigger = 0;
|
|
|
+ int chanceToTrigger = 0;
|
|
|
int amountToDie = 0;
|
|
|
|
|
|
if(attacker->hasBonusOfType(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillPercentage)) //killing by percentage
|
|
|
{
|
|
|
- chanceToTrigger = attacker->valOfBonuses(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillPercentage) / 100.0f;
|
|
|
+ chanceToTrigger = attacker->valOfBonuses(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillPercentage);
|
|
|
int percentageToDie = attacker->getBonus(Selector::type()(BonusType::DESTRUCTION).And(Selector::subtype()(BonusCustomSubtype::destructionKillPercentage)))->additionalInfo[0];
|
|
|
amountToDie = static_cast<int>(defender->getCount() * percentageToDie * 0.01f);
|
|
|
}
|
|
|
else if(attacker->hasBonusOfType(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillAmount)) //killing by count
|
|
|
{
|
|
|
- chanceToTrigger = attacker->valOfBonuses(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillAmount) / 100.0f;
|
|
|
+ chanceToTrigger = attacker->valOfBonuses(BonusType::DESTRUCTION, BonusCustomSubtype::destructionKillAmount);
|
|
|
amountToDie = attacker->getBonus(Selector::type()(BonusType::DESTRUCTION).And(Selector::subtype()(BonusCustomSubtype::destructionKillAmount)))->additionalInfo[0];
|
|
|
}
|
|
|
|
|
|
- vstd::amin(chanceToTrigger, 1); //cap trigger chance at 100%
|
|
|
-
|
|
|
- if(gameHandler->getRandomGenerator().nextDouble(0, 1) > chanceToTrigger)
|
|
|
+ ObjectInstanceID ownerArmy = battle.getBattle()->getSideArmy(attacker->unitSide())->id;
|
|
|
+ if (!gameHandler->randomizer->rollCombatAbility(ownerArmy, chanceToTrigger))
|
|
|
return;
|
|
|
|
|
|
BattleStackAttacked bsa;
|