diff --git a/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java b/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java index 9bb7df08c61..79ee6ad1e61 100644 --- a/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java +++ b/Mage.Sets/src/mage/cards/n/NahirisSacrifice.java @@ -1,5 +1,6 @@ package mage.cards.n; +import mage.abilities.Ability; import mage.abilities.costs.Cost; import mage.abilities.costs.SacrificeCost; import mage.abilities.costs.VariableCostImpl; @@ -15,6 +16,9 @@ import mage.constants.ComparisonType; import mage.filter.common.FilterControlledPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ManaValuePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetCreaturePermanentAmount; import java.util.UUID; @@ -90,4 +94,33 @@ class SacrificeXManaValueCost extends VariableCostImpl implements SacrificeCost return new SacrificeTargetCost(manavaluefilter); } + @Override + public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { + Player controller = game.getPlayer(controllerId); + if (controller == null) { + return false; + } + int validTargets = 0; + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, controllerId, game)) { + if (controller.canPaySacrificeCost(permanent, source, controllerId, game)) { + validTargets++; + } + } + return validTargets > 0; + } + + @Override + public int getMaxValue(Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return super.getMaxValue(source, game); + } + int maxValue = 0; + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, controller.getId(), game)) { + if (controller.canPaySacrificeCost(permanent, source, controller.getId(), game)) { + maxValue = Math.max(maxValue, permanent.getManaValue()); + } + } + return maxValue; + } } diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java b/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java index e08c351495b..dbeecf28f34 100644 --- a/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java +++ b/Mage.Sets/src/mage/cards/p/PhyrexianDreadnought.java @@ -17,6 +17,7 @@ import mage.filter.StaticFilters; import mage.filter.common.FilterControlledCreaturePermanent; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.TargetPermanent; import java.util.UUID; @@ -83,9 +84,15 @@ class PhyrexianDreadnoughtSacrificeCost extends CostImpl { @Override public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { + Player controller = game.getPlayer(controllerId); + if (controller == null) { + return false; + } int sumPower = 0; for (Permanent permanent : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, controllerId, game)) { - sumPower += permanent.getPower().getValue(); + if (controller.canPaySacrificeCost(permanent, source, controllerId, game)) { + sumPower += permanent.getPower().getValue(); + } } return sumPower >= 12; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/one/NahirisSacrificeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/one/NahirisSacrificeTest.java index e69179635a4..24087ff3541 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/one/NahirisSacrificeTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/one/NahirisSacrificeTest.java @@ -2,7 +2,6 @@ package org.mage.test.cards.single.one; import mage.constants.PhaseStep; import mage.constants.Zone; -import org.junit.Ignore; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -41,7 +40,6 @@ public class NahirisSacrificeTest extends CardTestPlayerBase { } @Test - @Ignore // Enable after merging #13916 public void testNahirisSacrificePrevented() { setStrictChooseMode(true); diff --git a/Mage/src/main/java/mage/abilities/costs/common/SacrificeAttachmentCost.java b/Mage/src/main/java/mage/abilities/costs/common/SacrificeAttachmentCost.java index 1764caf2bba..81ff57ddd63 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/SacrificeAttachmentCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/SacrificeAttachmentCost.java @@ -6,6 +6,7 @@ import mage.abilities.costs.SacrificeCost; import mage.abilities.costs.UseAttachedCost; import mage.game.Game; import mage.game.permanent.Permanent; +import mage.players.Player; import java.util.UUID; @@ -52,7 +53,12 @@ public class SacrificeAttachmentCost extends UseAttachedCost implements Sacrific if (!super.canPay(ability, source, controllerId, game)) { return false; } - return game.getPermanent(source.getSourceId()).canBeSacrificed(); + Player controller = game.getPlayer(controllerId); + Permanent permanent = mageObjectReference.getPermanent(game); + if (controller == null || permanent == null) { + return false; + } + return controller.canPaySacrificeCost(permanent, source, controllerId, game); } @Override diff --git a/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java b/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java index 4a3ae6f865f..804db8e45ac 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/SacrificeXTargetCost.java @@ -7,8 +7,12 @@ import mage.abilities.costs.VariableCostImpl; import mage.abilities.costs.VariableCostType; import mage.filter.FilterPermanent; import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetSacrifice; +import java.util.UUID; + /** * @author LevelX2 */ @@ -39,6 +43,26 @@ public class SacrificeXTargetCost extends VariableCostImpl implements SacrificeC this.minValue = cost.minValue; } + @Override + public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) { + int canSacAmount = getValidSacAmount(source, controllerId, game); + return canSacAmount >= minValue; + } + + private int getValidSacAmount(Ability source, UUID controllerId, Game game) { + Player controller = game.getPlayer(controllerId); + if (controller == null) { + return -1; + } + int canSacAmount = 0; + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, controllerId, game)) { + if (controller.canPaySacrificeCost(permanent, source, controllerId, game)) { + canSacAmount++; + } + } + return canSacAmount; + } + @Override public SacrificeXTargetCost copy() { return new SacrificeXTargetCost(this); @@ -51,7 +75,7 @@ public class SacrificeXTargetCost extends VariableCostImpl implements SacrificeC @Override public int getMaxValue(Ability source, Game game) { - return game.getBattlefield().count(filter, source.getControllerId(), source, game); + return getValidSacAmount(source, source.getControllerId(), game); } @Override