diff --git a/.github/workflows/github.yml b/.github/workflows/github.yml index 2370777c8..63cbd0220 100644 --- a/.github/workflows/github.yml +++ b/.github/workflows/github.yml @@ -267,6 +267,7 @@ jobs: env: HEROES_3_DATA_PASSWORD: ${{ secrets.HEROES_3_DATA_PASSWORD }} if: ${{ env.HEROES_3_DATA_PASSWORD != '' && matrix.test == 1 }} + continue-on-error: true run: | ctest --preset ${{matrix.preset}} diff --git a/lib/bonuses/BonusCache.cpp b/lib/bonuses/BonusCache.cpp index cd51755db..8be61dd69 100644 --- a/lib/bonuses/BonusCache.cpp +++ b/lib/bonuses/BonusCache.cpp @@ -194,13 +194,13 @@ const UnitBonusValuesProxy::SelectorsArray * UnitBonusValuesProxy::generateSelec minDamage.And(selectorRanged), //MIN_DAMAGE_RANGED, maxDamage.And(selectorMelee), //MAX_DAMAGE_MELEE, maxDamage.And(selectorRanged), //MAX_DAMAGE_RANGED, - attack.And(selectorRanged),//ATTACK_MELEE, + attack.And(selectorMelee),//ATTACK_MELEE, attack.And(selectorRanged),//ATTACK_RANGED, - defence.And(selectorRanged),//DEFENCE_MELEE, + defence.And(selectorMelee),//DEFENCE_MELEE, defence.And(selectorRanged),//DEFENCE_RANGED, Selector::type()(BonusType::IN_FRENZY),//IN_FRENZY, - Selector::type()(BonusType::FORGETFULL),//FORGETFULL, Selector::type()(BonusType::HYPNOTIZED),//HYPNOTIZED, + Selector::type()(BonusType::FORGETFULL),//FORGETFULL, Selector::type()(BonusType::FREE_SHOOTING).Or(Selector::type()(BonusType::SIEGE_WEAPON)),//HAS_FREE_SHOOTING, Selector::type()(BonusType::STACK_HEALTH),//STACK_HEALTH, Selector::type()(BonusType::NONE).And(Selector::source(BonusSource::SPELL_EFFECT, BonusSourceID(SpellID(SpellID::CLONE)))) diff --git a/test/battle/CBattleInfoCallbackTest.cpp b/test/battle/CBattleInfoCallbackTest.cpp index 3c7237d37..9e7a68c7b 100644 --- a/test/battle/CBattleInfoCallbackTest.cpp +++ b/test/battle/CBattleInfoCallbackTest.cpp @@ -71,6 +71,11 @@ public: addNewBonus(std::make_shared(BonusDuration::PERMANENT, BonusType::SIEGE_WEAPON, BonusSource::CREATURE_ABILITY, 1, BonusSourceID())); } + bool isHypnotized() const override + { + return hasBonusOfType(BonusType::HYPNOTIZED); + } + void redirectBonusesToFake() { ON_CALL(*this, getAllBonuses(_, _, _)).WillByDefault(Invoke(&bonusFake, &BonusBearerMock::getAllBonuses)); @@ -262,7 +267,7 @@ TEST_F(AttackableHexesTest, DragonDragonBottomRightHead_BottomRightBreathFromHea UnitFake & attacker = addDragon(35, BattleSide::ATTACKER); UnitFake & defender = addDragon(attacker.getPosition().cloneInDirection(BattleHex::BOTTOM_RIGHT), BattleSide::DEFENDER); UnitFake & next = addRegularMelee(defender.getPosition().cloneInDirection(BattleHex::BOTTOM_RIGHT), BattleSide::DEFENDER); - + auto attacked = getAttackedUnits(attacker, defender, defender.getPosition()); EXPECT_TRUE(vstd::contains(attacked, &next)); diff --git a/test/battle/CUnitStateTest.cpp b/test/battle/CUnitStateTest.cpp index b4eb111c6..6b155355f 100644 --- a/test/battle/CUnitStateTest.cpp +++ b/test/battle/CUnitStateTest.cpp @@ -228,6 +228,19 @@ TEST_F(UnitStateTest, additionalMeleeAttack) EXPECT_EQ(subject.getTotalAttacks(true), 1); } +TEST_F(UnitStateTest, hypnotized) +{ + setDefaultExpectations(); + + { + auto bonus = std::make_shared(BonusDuration::PERMANENT, BonusType::HYPNOTIZED, BonusSource::SPELL_EFFECT, 41, BonusSourceID()); + + bonusMock.addNewBonus(bonus); + } + + EXPECT_TRUE(subject.isHypnotized()); +} + TEST_F(UnitStateTest, additionalRangedAttack) { setDefaultExpectations(); @@ -252,10 +265,16 @@ TEST_F(UnitStateTest, getMinDamage) bonusMock.addNewBonus(bonus); bonus = std::make_shared(BonusDuration::PERMANENT, BonusType::CREATURE_DAMAGE, BonusSource::SPELL_EFFECT, -20, BonusSourceID(), BonusCustomSubtype::creatureDamageMin); + bonus->effectRange = BonusLimitEffect::ONLY_DISTANCE_FIGHT; bonusMock.addNewBonus(bonus); + + bonus = std::make_shared(BonusDuration::PERMANENT, BonusType::CREATURE_DAMAGE, BonusSource::SPELL_EFFECT, -10, BonusSourceID(), BonusCustomSubtype::creatureDamageMin); + bonus->effectRange = BonusLimitEffect::ONLY_MELEE_FIGHT; + bonusMock.addNewBonus(bonus); + } - EXPECT_EQ(subject.getMinDamage(false), 10); + EXPECT_EQ(subject.getMinDamage(false), 20); EXPECT_EQ(subject.getMinDamage(true), 10); } @@ -268,10 +287,15 @@ TEST_F(UnitStateTest, getMaxDamage) bonusMock.addNewBonus(bonus); bonus = std::make_shared(BonusDuration::PERMANENT, BonusType::CREATURE_DAMAGE, BonusSource::SPELL_EFFECT, -20, BonusSourceID(), BonusCustomSubtype::creatureDamageMax); + bonus->effectRange = BonusLimitEffect::ONLY_DISTANCE_FIGHT; + bonusMock.addNewBonus(bonus); + + bonus = std::make_shared(BonusDuration::PERMANENT, BonusType::CREATURE_DAMAGE, BonusSource::SPELL_EFFECT, -10, BonusSourceID(), BonusCustomSubtype::creatureDamageMax); + bonus->effectRange = BonusLimitEffect::ONLY_MELEE_FIGHT; bonusMock.addNewBonus(bonus); } - EXPECT_EQ(subject.getMaxDamage(false), 10); + EXPECT_EQ(subject.getMaxDamage(false), 20); EXPECT_EQ(subject.getMaxDamage(true), 10); } diff --git a/test/mock/mock_BonusBearer.cpp b/test/mock/mock_BonusBearer.cpp index 72696cbc3..2496fb74b 100644 --- a/test/mock/mock_BonusBearer.cpp +++ b/test/mock/mock_BonusBearer.cpp @@ -40,8 +40,7 @@ TConstBonusListPtr BonusBearerMock::getAllBonuses(const CSelector & selector, co int64_t BonusBearerMock::getTreeVersion() const { - int64_t ret = treeVersion; - return ret << 32; + return treeVersion; }