diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index cd4c8ca1b..07a9a6cf2 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -4271,13 +4271,20 @@ bool CGameHandler::makeBattleAction(BattleAction &ba) const CGHeroInstance * attackingHero = gs->curB->battleGetFightingHero(ba.side); - CHeroHandler::SBallisticsLevelInfo sbi; + CHeroHandler::SBallisticsLevelInfo stackBallisticsParameters; if(stack->getCreature()->idNumber == CreatureID::CATAPULT) - sbi = VLC->heroh->ballistics.at(attackingHero->valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, SecondarySkill::BALLISTICS)); - else //may need to use higher ballistics level for creatures in future for some cases to match original H3 (upgraded cyclops etc) + stackBallisticsParameters = VLC->heroh->ballistics.at(attackingHero->valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, SecondarySkill::BALLISTICS)); + else { - sbi = VLC->heroh->ballistics.at(1); - sbi.shots += std::max(stack->valOfBonuses(Bonus::CATAPULT_EXTRA_SHOTS), 0); + if(stack->hasBonusOfType(Bonus::CATAPULT_EXTRA_SHOTS)) //by design use advanced ballistics parameters with this bonus present, upg. cyclops use advanced ballistics, nonupg. use basic in OH3 + { + stackBallisticsParameters = VLC->heroh->ballistics.at(2); + stackBallisticsParameters.shots = 1; //skip default "2 shots" from adv. ballistics + } + else + stackBallisticsParameters = VLC->heroh->ballistics.at(1); + + stackBallisticsParameters.shots += std::max(stack->valOfBonuses(Bonus::CATAPULT_EXTRA_SHOTS), 0); //0 is allowed minimum to let modders force advanced ballistics for "oneshotting creatures" } auto wallPart = gs->curB->battleHexToWallPart(destination); @@ -4296,7 +4303,7 @@ bool CGameHandler::makeBattleAction(BattleAction &ba) break; } - for (int g=0; g