diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/HarmonizeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/HarmonizeTest.java new file mode 100644 index 00000000000..e8f83318ab7 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/HarmonizeTest.java @@ -0,0 +1,51 @@ +package org.mage.test.cards.abilities.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * @author TheElk801 + */ +public class HarmonizeTest extends CardTestPlayerBase { + + private static final String bear = "Grizzly Bears"; + private static final String dragonfire = "Channeled Dragonfire"; + + @Test + public void testNoTap() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 7); + addCard(Zone.BATTLEFIELD, playerA, bear); + addCard(Zone.GRAVEYARD, playerA, dragonfire); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Harmonize", playerB); + setChoice(playerA, false); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertTapped(bear, false); + assertLife(playerB, 20 - 2); + } + + @Test + public void testTap() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5); + addCard(Zone.BATTLEFIELD, playerA, bear); + addCard(Zone.GRAVEYARD, playerA, dragonfire); + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Harmonize", playerB); + setChoice(playerA, true); + setChoice(playerA, bear); + setChoice(playerA, bear); + + setStrictChooseMode(true); + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertTapped(bear, true); + assertLife(playerB, 20 - 2); + } +} diff --git a/Mage/src/main/java/mage/abilities/keyword/HarmonizeAbility.java b/Mage/src/main/java/mage/abilities/keyword/HarmonizeAbility.java index 9b4a4de7514..cb8d082be43 100644 --- a/Mage/src/main/java/mage/abilities/keyword/HarmonizeAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/HarmonizeAbility.java @@ -213,19 +213,30 @@ class HarmonizeCostReductionEffect extends CostModificationEffectImpl { @Override public boolean apply(Game game, Ability source, Ability abilityToModify) { - if (game.inCheckPlayableState()) { - return true; - } SpellAbility spellAbility = (SpellAbility) abilityToModify; - int power = CardUtil - .castStream(spellAbility.getCosts().stream(), HarmonizeCost.class) - .map(HarmonizeCost::getChosenCreature) - .map(game::getPermanent) - .filter(Objects::nonNull) - .map(MageObject::getPower) - .mapToInt(MageInt::getValue) - .map(x -> Math.max(x, 0)) - .sum(); + int power; + if (game.inCheckPlayableState()) { + power = game + .getBattlefield() + .getActivePermanents( + StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURE, + source.getControllerId(), source, game + ).stream() + .map(MageObject::getPower) + .mapToInt(MageInt::getValue) + .max() + .orElse(0); + } else { + power = CardUtil + .castStream(spellAbility.getCosts().stream(), HarmonizeCost.class) + .map(HarmonizeCost::getChosenCreature) + .map(game::getPermanent) + .filter(Objects::nonNull) + .map(MageObject::getPower) + .mapToInt(MageInt::getValue) + .map(x -> Math.max(x, 0)) + .sum(); + } if (power > 0) { CardUtil.adjustCost(spellAbility, power); } @@ -278,12 +289,13 @@ class HarmonizeCost extends VariableCostImpl { Player player = game.getPlayer(source.getControllerId()); if (player == null || !game.getBattlefield().contains( StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURE, source, game, 1 + ) || !player.chooseUse( + Outcome.Benefit, "Tap an untapped creature you control for harmonize?", source, game )) { return 0; } - TargetPermanent target = new TargetPermanent( - 0, 1, StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURE, true - ); + TargetPermanent target = new TargetPermanent(StaticFilters.FILTER_CONTROLLED_UNTAPPED_CREATURE); + target.withNotTarget(true); target.withChooseHint("for harmonize"); player.choose(Outcome.PlayForFree, target, source, game); Permanent permanent = game.getPermanent(target.getFirstTarget());