diff --git a/Mage.Sets/src/mage/cards/a/AncientLumberknot.java b/Mage.Sets/src/mage/cards/a/AncientLumberknot.java index cd944672aac..31507014fc7 100644 --- a/Mage.Sets/src/mage/cards/a/AncientLumberknot.java +++ b/Mage.Sets/src/mage/cards/a/AncientLumberknot.java @@ -2,11 +2,12 @@ package mage.cards.a; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; +import mage.constants.TargetController; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicate; import mage.game.Game; @@ -20,10 +21,11 @@ import java.util.UUID; public final class AncientLumberknot extends CardImpl { private static final FilterCreaturePermanent filter - = new FilterCreaturePermanent("creature you control with toughness greater than its power"); + = new FilterCreaturePermanent("each creature you control with toughness greater than its power"); static { filter.add(AncientLumberknotPredicate.instance); + filter.add(TargetController.YOU.getControllerPredicate()); } public AncientLumberknot(UUID ownerId, CardSetInfo setInfo) { @@ -34,7 +36,7 @@ public final class AncientLumberknot extends CardImpl { this.toughness = new MageInt(4); // Each creature you control with toughness greater than its power assigns combat damage equal to its toughness rather than its power. - this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessEffect(filter, true))); + this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(filter))); } private AncientLumberknot(final AncientLumberknot card) { diff --git a/Mage.Sets/src/mage/cards/a/ArcadesTheStrategist.java b/Mage.Sets/src/mage/cards/a/ArcadesTheStrategist.java index d556929c763..1f5e3ee9625 100644 --- a/Mage.Sets/src/mage/cards/a/ArcadesTheStrategist.java +++ b/Mage.Sets/src/mage/cards/a/ArcadesTheStrategist.java @@ -6,7 +6,7 @@ import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderAllEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.VigilanceAbility; @@ -24,13 +24,14 @@ import java.util.UUID; */ public final class ArcadesTheStrategist extends CardImpl { - private static final FilterControlledCreaturePermanent filter - = new FilterControlledCreaturePermanent("a creature with defender"); - private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent(); + private static final FilterControlledCreaturePermanent defenderSingle = new FilterControlledCreaturePermanent("a creature with defender"); + private static final FilterCreaturePermanent defenderPlural = new FilterCreaturePermanent("Each creature you control with defender"); static { - filter.add(new AbilityPredicate(DefenderAbility.class)); - filter2.add(new AbilityPredicate(DefenderAbility.class)); + defenderSingle.add(new AbilityPredicate(DefenderAbility.class)); + + defenderPlural.add(TargetController.YOU.getControllerPredicate()); + defenderPlural.add(new AbilityPredicate(DefenderAbility.class)); } public ArcadesTheStrategist(UUID ownerId, CardSetInfo setInfo) { @@ -50,13 +51,13 @@ public final class ArcadesTheStrategist extends CardImpl { // Whenever a creature with defender enters the battlefield under your control, draw a card. this.addAbility(new EntersBattlefieldControlledTriggeredAbility( - new DrawCardSourceControllerEffect(1), filter + new DrawCardSourceControllerEffect(1), defenderSingle )); // Each creature you control with defender assigns combat damage equal to its toughness rather than its power and can attack as though it didn't have defender. - Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new CombatDamageByToughnessEffect(filter2, true).setText("Each creature you control with defender assigns combat damage equal to its toughness rather than its power")); + Ability ability = new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(defenderPlural)); ability.addEffect(new CanAttackAsThoughItDidntHaveDefenderAllEffect( - Duration.WhileOnBattlefield, filter + Duration.WhileOnBattlefield, defenderSingle ).setText("and can attack as though it didn't have defender")); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/a/AssaultFormation.java b/Mage.Sets/src/mage/cards/a/AssaultFormation.java index 5cc6683eb95..1ece2730289 100644 --- a/Mage.Sets/src/mage/cards/a/AssaultFormation.java +++ b/Mage.Sets/src/mage/cards/a/AssaultFormation.java @@ -7,7 +7,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderTargetEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.abilities.keyword.DefenderAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; @@ -36,7 +36,7 @@ public final class AssaultFormation extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); // Each creature you control assigns combat damage equal to its toughness rather than its power. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CombatDamageByToughnessEffect(StaticFilters.FILTER_PERMANENT_CREATURE, true))); + this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURE_EACH))); // {G}: Target creature with defender can attack this turn as though it didn't have defender. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CanAttackAsThoughItDidntHaveDefenderTargetEffect(Duration.EndOfTurn), new ManaCostsImpl<>("{G}")); diff --git a/Mage.Sets/src/mage/cards/b/BaldinCenturyHerdmaster.java b/Mage.Sets/src/mage/cards/b/BaldinCenturyHerdmaster.java index 3a21f5108f0..57061918a18 100644 --- a/Mage.Sets/src/mage/cards/b/BaldinCenturyHerdmaster.java +++ b/Mage.Sets/src/mage/cards/b/BaldinCenturyHerdmaster.java @@ -9,7 +9,7 @@ import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.dynamicvalue.common.CardsInControllerHandCount; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -35,19 +35,19 @@ public final class BaldinCenturyHerdmaster extends CardImpl { this.power = new MageInt(0); this.toughness = new MageInt(7); - // Sumo Spirit—As long as it's your turn, each creature assigns combat damage equal to its toughness rather than its power. + // As long as it's your turn, each creature assigns combat damage equal to its toughness rather than its power. this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect( - new CombatDamageByToughnessEffect(StaticFilters.FILTER_PERMANENT_CREATURE, false), + new CombatDamageByToughnessAllEffect(StaticFilters.FILTER_PERMANENT_CREATURE), MyTurnCondition.instance, "as long as it's your turn, each creature " + "assigns combat damage equal to its toughness rather than its power" - )).withFlavorWord("Sumo Spirit")); + ))); - // Hundred Hand Slap—Whenever E. Honda, Sumo Champion attacks, up to one hundred target creatures each get +0/+X until end of turn, where X is the number of cards in your hand. + // Whenever Baldin, Century Herdmaster attacks, up to one hundred target creatures each get +0/+X until end of turn, where X is the number of cards in your hand. Ability ability = new AttacksTriggeredAbility(new BoostTargetEffect( StaticValue.get(0), CardsInControllerHandCount.instance, Duration.EndOfTurn ).setText("up to one hundred target creatures each get +0/+X until end of turn, where X is the number of cards in your hand")); ability.addTarget(new TargetCreaturePermanent(0, 100)); - this.addAbility(ability.withFlavorWord("Hundred Hand Slap")); + this.addAbility(ability); } private BaldinCenturyHerdmaster(final BaldinCenturyHerdmaster card) { diff --git a/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java b/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java index e6243b73c8c..f5342dff7f4 100644 --- a/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java +++ b/Mage.Sets/src/mage/cards/b/BelligerentBrontodon.java @@ -3,14 +3,13 @@ package mage.cards.b; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; import mage.filter.StaticFilters; - import java.util.UUID; /** @@ -26,7 +25,7 @@ public final class BelligerentBrontodon extends CardImpl { this.toughness = new MageInt(6); // Each creature you control assigns combat damage equal to its toughness rather than its power. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CombatDamageByToughnessEffect(StaticFilters.FILTER_PERMANENT_CREATURE, true))); + this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURE_EACH))); } private BelligerentBrontodon(final BelligerentBrontodon card) { diff --git a/Mage.Sets/src/mage/cards/b/BillThePony.java b/Mage.Sets/src/mage/cards/b/BillThePony.java index ddea33ae923..60d69e3a2d1 100644 --- a/Mage.Sets/src/mage/cards/b/BillThePony.java +++ b/Mage.Sets/src/mage/cards/b/BillThePony.java @@ -6,20 +6,12 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessTargetEffect; import mage.constants.*; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.filter.FilterPermanent; import mage.filter.StaticFilters; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.MageObjectReferencePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.game.permanent.token.FoodToken; import mage.target.TargetPermanent; import mage.target.common.TargetControlledPermanent; @@ -43,7 +35,7 @@ public final class BillThePony extends CardImpl { // Sacrifice a Food: Until end of turn, target creature you control assigns combat damage equal to its toughness rather than its power. Ability ability = new SimpleActivatedAbility( - new BillThePonyEffect(), + new CombatDamageByToughnessTargetEffect(Duration.EndOfTurn), new SacrificeTargetCost(new TargetControlledPermanent(StaticFilters.FILTER_CONTROLLED_FOOD)) ); ability.addTarget(new TargetPermanent(StaticFilters.FILTER_CONTROLLED_CREATURE)); @@ -59,35 +51,4 @@ public final class BillThePony extends CardImpl { public BillThePony copy() { return new BillThePony(this); } -} - -class BillThePonyEffect extends OneShotEffect { - - BillThePonyEffect() { - super(Outcome.Benefit); - staticText = "Until end of turn, target creature you control assigns " + - "combat damage equal to its toughness rather than its power."; - } - - private BillThePonyEffect(final BillThePonyEffect effect) { - super(effect); - } - - @Override - public BillThePonyEffect copy() { - return new BillThePonyEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (permanent == null) { - return false; - } - - FilterCreaturePermanent filter = new FilterCreaturePermanent(); - filter.add(new MageObjectReferencePredicate(permanent, game)); - game.addEffect(new CombatDamageByToughnessEffect(filter, false, Duration.EndOfTurn), source); - return true; - } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java b/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java index 7d4d5dd39c3..3997d83a03b 100644 --- a/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java +++ b/Mage.Sets/src/mage/cards/d/DoranTheSiegeTower.java @@ -2,13 +2,14 @@ package mage.cards.d; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.SuperType; import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; import java.util.UUID; @@ -25,6 +26,8 @@ import java.util.UUID; */ public final class DoranTheSiegeTower extends CardImpl { + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("each creature"); + public DoranTheSiegeTower(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}{B}{G}"); this.supertype.add(SuperType.LEGENDARY); @@ -35,9 +38,7 @@ public final class DoranTheSiegeTower extends CardImpl { this.toughness = new MageInt(5); // Each creature assigns combat damage equal to its toughness rather than its power. - this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessEffect( - StaticFilters.FILTER_PERMANENT_CREATURE, false - ))); + this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(filter))); } private DoranTheSiegeTower(final DoranTheSiegeTower card) { diff --git a/Mage.Sets/src/mage/cards/h/HighAlert.java b/Mage.Sets/src/mage/cards/h/HighAlert.java index 4a397e082e7..cecefcc4408 100644 --- a/Mage.Sets/src/mage/cards/h/HighAlert.java +++ b/Mage.Sets/src/mage/cards/h/HighAlert.java @@ -6,7 +6,7 @@ import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.UntapTargetEffect; import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderAllEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -27,12 +27,7 @@ public final class HighAlert extends CardImpl { // Each creature you control assigns combat damage equal to its toughness rather than its power. - this.addAbility(new SimpleStaticAbility( - Zone.BATTLEFIELD, - new CombatDamageByToughnessEffect( - StaticFilters.FILTER_PERMANENT_CREATURE, true - ) - )); + this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURE_EACH))); // Creatures you control can attack as though they didn't have defender. this.addAbility(new SimpleStaticAbility( diff --git a/Mage.Sets/src/mage/cards/h/HuatliTheSunsHeart.java b/Mage.Sets/src/mage/cards/h/HuatliTheSunsHeart.java index 83ec5fabfb6..5d4ce5f4caa 100644 --- a/Mage.Sets/src/mage/cards/h/HuatliTheSunsHeart.java +++ b/Mage.Sets/src/mage/cards/h/HuatliTheSunsHeart.java @@ -4,7 +4,7 @@ import mage.abilities.LoyaltyAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.GreatestToughnessAmongControlledCreaturesValue; import mage.abilities.effects.common.GainLifeEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -27,9 +27,7 @@ public final class HuatliTheSunsHeart extends CardImpl { this.setStartingLoyalty(7); // Each creature you control assigns combat damage equal to its toughness rather than its power. - this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessEffect( - StaticFilters.FILTER_PERMANENT_CREATURE, true - ))); + this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURE_EACH))); // -3: You gain life equal to the greatest toughness among creatures you control. this.addAbility(new LoyaltyAbility(new GainLifeEffect( diff --git a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java index 25c41f626c2..45ef52ba1d6 100644 --- a/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java +++ b/Mage.Sets/src/mage/cards/r/RasaadYnBashir.java @@ -9,7 +9,7 @@ import mage.abilities.condition.common.HaveInitiativeCondition; import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -38,9 +38,7 @@ public final class RasaadYnBashir extends CardImpl { this.toughness = new MageInt(3); // Each creature you control assigns combat damage equal to its toughness rather than its power. - this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessEffect( - StaticFilters.FILTER_PERMANENT_CREATURE, true - ))); + this.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessAllEffect(StaticFilters.FILTER_CONTROLLED_CREATURE_EACH))); // Whenever Rasaad yn Bashir attacks, if you have the initiative, double the toughness of each creature you control until end of turn. this.addAbility(new ConditionalInterveningIfTriggeredAbility( diff --git a/Mage.Sets/src/mage/cards/s/StreetwiseNegotiator.java b/Mage.Sets/src/mage/cards/s/StreetwiseNegotiator.java index 653b278359b..b5efb00f82a 100644 --- a/Mage.Sets/src/mage/cards/s/StreetwiseNegotiator.java +++ b/Mage.Sets/src/mage/cards/s/StreetwiseNegotiator.java @@ -1,20 +1,14 @@ package mage.cards.s; import mage.MageInt; -import mage.MageObject; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessSourceEffect; import mage.abilities.keyword.BackupAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.SubType; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.ObjectSourcePlayer; -import mage.filter.predicate.ObjectSourcePlayerPredicate; -import mage.filter.predicate.mageobject.AnotherPredicate; -import mage.game.Game; - import java.util.UUID; /** @@ -22,12 +16,6 @@ import java.util.UUID; */ public final class StreetwiseNegotiator extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); - - static { - filter.add(StreetwiseNegotiatorPredicate.instance); - } - public StreetwiseNegotiator(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); @@ -38,11 +26,11 @@ public final class StreetwiseNegotiator extends CardImpl { // Backup 1 BackupAbility backupAbility = new BackupAbility(this, 1); - this.addAbility(backupAbility); - // This creature assigns combat damage equal to its toughness rather than its power. - backupAbility.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessEffect(filter, false) - .setText("this creature assigns combat damage equal to its toughness rather than its power"))); + + backupAbility.addAbility(new SimpleStaticAbility(new CombatDamageByToughnessSourceEffect(Duration.EndOfTurn))); + + this.addAbility(backupAbility); } private StreetwiseNegotiator(final StreetwiseNegotiator card) { @@ -53,13 +41,4 @@ public final class StreetwiseNegotiator extends CardImpl { public StreetwiseNegotiator copy() { return new StreetwiseNegotiator(this); } -} - -enum StreetwiseNegotiatorPredicate implements ObjectSourcePlayerPredicate { - instance; - - @Override - public boolean apply(ObjectSourcePlayer input, Game game) { - return !AnotherPredicate.instance.apply(input, game); - } } \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/w/WalkingBulwark.java b/Mage.Sets/src/mage/cards/w/WalkingBulwark.java index 1b8c612d4fc..b386e0d6105 100644 --- a/Mage.Sets/src/mage/cards/w/WalkingBulwark.java +++ b/Mage.Sets/src/mage/cards/w/WalkingBulwark.java @@ -4,24 +4,19 @@ import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.ActivateAsSorceryActivatedAbility; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.combat.CanAttackAsThoughItDidntHaveDefenderTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; -import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessEffect; +import mage.abilities.effects.common.ruleModifying.CombatDamageByToughnessTargetEffect; import mage.abilities.keyword.DefenderAbility; import mage.abilities.keyword.HasteAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Outcome; import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AbilityPredicate; -import mage.filter.predicate.mageobject.MageObjectReferencePredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import java.util.UUID; @@ -48,7 +43,9 @@ public final class WalkingBulwark extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // {2}: Until end of turn, target creature with defender gains haste, can attack as though it didn't have defender, and assigns combat damage equal to its toughness rather than its power. Activate only as a sorcery. - Ability ability = new ActivateAsSorceryActivatedAbility(new WalkingBulwarkEffect(), new GenericManaCost(2)); + Ability ability = new ActivateAsSorceryActivatedAbility(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn), new GenericManaCost(2).setText("until end of turn, target creature with defender gains haste,")); + ability.addEffect(new CanAttackAsThoughItDidntHaveDefenderTargetEffect(Duration.EndOfTurn).setText("can attack as though it didn't have defender,")); + ability.addEffect(new CombatDamageByToughnessTargetEffect(Duration.EndOfTurn).setText("and assigns combat damage equal to its toughness rather than its power.")); ability.addTarget(new TargetPermanent(filter)); this.addAbility(ability); } @@ -61,38 +58,4 @@ public final class WalkingBulwark extends CardImpl { public WalkingBulwark copy() { return new WalkingBulwark(this); } -} - -class WalkingBulwarkEffect extends OneShotEffect { - - WalkingBulwarkEffect() { - super(Outcome.Benefit); - staticText = "until end of turn, " + - "target creature with defender gains haste, " + - "can attack as though it didn't have defender, " + - "and assigns combat damage equal to its toughness rather than its power"; - } - - private WalkingBulwarkEffect(final WalkingBulwarkEffect effect) { - super(effect); - } - - @Override - public WalkingBulwarkEffect copy() { - return new WalkingBulwarkEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source)); - if (permanent == null) { - return false; - } - game.addEffect(new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn), source); - game.addEffect(new CanAttackAsThoughItDidntHaveDefenderTargetEffect(Duration.EndOfTurn), source); - FilterCreaturePermanent filter = new FilterCreaturePermanent(); - filter.add(new MageObjectReferencePredicate(permanent, game)); - game.addEffect(new CombatDamageByToughnessEffect(filter, false, Duration.EndOfTurn), source); - return true; - } -} +} \ No newline at end of file diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BackupTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BackupTest.java index ecaff8ce3e8..9b4f52de738 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BackupTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/BackupTest.java @@ -137,4 +137,22 @@ public class BackupTest extends CardTestPlayerBase { execute(); assertPowerToughness(playerA, "Mirror-Shield Hoplite", 4, 4); } + + @Test + public void StreetwiseNegotiatorTest() { + addCard(Zone.BATTLEFIELD, playerA, "Aegis Turtle"); + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + addCard(Zone.HAND, playerA, "Streetwise Negotiator", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Streetwise Negotiator"); + addTarget(playerA, "Aegis Turtle"); + // Should deal 6 damage + attack(1, playerA, "Aegis Turtle"); + + setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); + setStrictChooseMode(true); + execute(); + + assertLife(playerB, 14); + } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessAllEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessAllEffect.java new file mode 100644 index 00000000000..c262431ea82 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessAllEffect.java @@ -0,0 +1,48 @@ + +package mage.abilities.effects.common.ruleModifying; + +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; + +/** + * @author TheElk801 + */ +public class CombatDamageByToughnessAllEffect extends ContinuousEffectImpl { + + private final FilterCreaturePermanent filter; + + + public CombatDamageByToughnessAllEffect(FilterCreaturePermanent filter) { + this(filter, Duration.WhileOnBattlefield); + } + + public CombatDamageByToughnessAllEffect(FilterCreaturePermanent filter, Duration duration) { + super(duration, Layer.RulesEffects, SubLayer.NA, Outcome.Neutral); + this.filter = filter; + this.staticText = filter.getMessage() + " assigns combat damage equal to its toughness rather than its power"; + } + + + private CombatDamageByToughnessAllEffect(final CombatDamageByToughnessAllEffect effect) { + super(effect); + this.filter = effect.filter; + } + + @Override + public CombatDamageByToughnessAllEffect copy() { + return new CombatDamageByToughnessAllEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + game.getCombat().setUseToughnessForDamage(true); + game.getCombat().addUseToughnessForDamageFilter(filter); + return true; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessEffect.java deleted file mode 100644 index 711ebf51f09..00000000000 --- a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessEffect.java +++ /dev/null @@ -1,73 +0,0 @@ - -package mage.abilities.effects.common.ruleModifying; - -import mage.abilities.Ability; -import mage.abilities.Mode; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.constants.Duration; -import mage.constants.Layer; -import mage.constants.Outcome; -import mage.constants.SubLayer; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.permanent.ControllerIdPredicate; -import mage.game.Game; - -/** - * @author TheElk801 - */ -public class CombatDamageByToughnessEffect extends ContinuousEffectImpl { - - private final FilterCreaturePermanent filter; - private final boolean onlyControlled; - - - public CombatDamageByToughnessEffect(FilterCreaturePermanent filter, boolean onlyControlled) { - this(filter, onlyControlled, Duration.WhileOnBattlefield); - } - - public CombatDamageByToughnessEffect(FilterCreaturePermanent filter, boolean onlyControlled, Duration duration) { - super(duration, Layer.RulesEffects, SubLayer.NA, Outcome.Detriment); - this.filter = filter; - this.onlyControlled = onlyControlled; - } - - - private CombatDamageByToughnessEffect(final CombatDamageByToughnessEffect effect) { - super(effect); - this.filter = effect.filter; - this.onlyControlled = effect.onlyControlled; - } - - @Override - public CombatDamageByToughnessEffect copy() { - return new CombatDamageByToughnessEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - FilterCreaturePermanent filterPermanent; - if (onlyControlled) { - filterPermanent = filter.copy(); - filterPermanent.add(new ControllerIdPredicate(source.getControllerId())); - } else { - filterPermanent = filter; - } - game.getCombat().setUseToughnessForDamage(true); - game.getCombat().addUseToughnessForDamageFilter(filterPermanent); - return true; - } - - @Override - public String getText(Mode mode) { - if (staticText != null && !staticText.isEmpty()) { - return staticText; - } - StringBuilder sb = new StringBuilder("Each "); - sb.append(filter.getMessage()); - if (onlyControlled && !filter.getMessage().contains("you control")) { - sb.append(" you control"); - } - sb.append(" assigns combat damage equal to its toughness rather than its power"); - return sb.toString(); - } -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessSourceEffect.java new file mode 100644 index 00000000000..3403370a19f --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessSourceEffect.java @@ -0,0 +1,46 @@ +package mage.abilities.effects.common.ruleModifying; + +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.MageObjectReferencePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +public class CombatDamageByToughnessSourceEffect extends ContinuousEffectImpl { + + public CombatDamageByToughnessSourceEffect(Duration duration) { + super(duration, Layer.RulesEffects, SubLayer.NA, Outcome.Neutral); + this.staticText = "{this} assigns combat damage equal to its toughness rather than its power"; + } + + private CombatDamageByToughnessSourceEffect(final CombatDamageByToughnessSourceEffect effect) { + super(effect); + } + + @Override + public CombatDamageByToughnessSourceEffect copy() { + return new CombatDamageByToughnessSourceEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = source.getSourcePermanentIfItStillExists(game); + if (permanent == null) { + discard(); + return false; + } + + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new MageObjectReferencePredicate(permanent.getId(), game)); + game.getCombat().setUseToughnessForDamage(true); + game.getCombat().addUseToughnessForDamageFilter(filter); + + return true; + } + +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessTargetEffect.java new file mode 100644 index 00000000000..6930daf61b5 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/ruleModifying/CombatDamageByToughnessTargetEffect.java @@ -0,0 +1,55 @@ +package mage.abilities.effects.common.ruleModifying; + +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +public class CombatDamageByToughnessTargetEffect extends ContinuousEffectImpl { + + public CombatDamageByToughnessTargetEffect(Duration duration) { + super(duration, Layer.RulesEffects, SubLayer.NA, Outcome.Neutral); + } + + private CombatDamageByToughnessTargetEffect(final CombatDamageByToughnessTargetEffect effect) { + super(effect); + } + + @Override + public CombatDamageByToughnessTargetEffect copy() { + return new CombatDamageByToughnessTargetEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Set set = targetPointer.getTargets(game, source).stream() + .map(game::getPermanent) + .filter(Objects::isNull) + .collect(Collectors.toSet()); + + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new PermanentReferenceInCollectionPredicate(set, game)); + game.getCombat().setUseToughnessForDamage(true); + game.getCombat().addUseToughnessForDamageFilter(filter); + + return true; + } + + @Override + public String getText(Mode mode) { + return getTargetPointer().describeTargets(mode.getTargets(), "that creature") + + " assigns combat damage equal to its toughness rather than its power"; + } + +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/filter/StaticFilters.java b/Mage/src/main/java/mage/filter/StaticFilters.java index 01e3e8d550e..7c9e88388aa 100644 --- a/Mage/src/main/java/mage/filter/StaticFilters.java +++ b/Mage/src/main/java/mage/filter/StaticFilters.java @@ -1228,4 +1228,11 @@ public final class StaticFilters { static { FILTER_CONTROLLED_FOOD.setLockedFilter(true); } + + public static final FilterCreaturePermanent FILTER_CONTROLLED_CREATURE_EACH = new FilterCreaturePermanent("each creature you control"); + + static { + FILTER_CONTROLLED_CREATURE_EACH.add(TargetController.YOU.getPlayerPredicate()); + FILTER_CONTROLLED_CREATURE_EACH.setLockedFilter(true); + } }