From d4954bf78465428bec9b78f68eb2d90e5bcf7129 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Wed, 16 Apr 2025 12:13:15 -0400 Subject: [PATCH] rework effects and abilities which care about controlling your own commander (fixes #13542) --- .../src/mage/cards/a/AngelicFieldMarshal.java | 20 +++++------ .../mage/cards/d/DemonOfWailingAgonies.java | 19 +++++------ .../src/mage/cards/l/LoyalApprentice.java | 26 ++++----------- Mage.Sets/src/mage/cards/l/LoyalDrake.java | 22 +++++-------- Mage.Sets/src/mage/cards/l/LoyalGuardian.java | 26 +++++---------- .../src/mage/cards/l/LoyalSubordinate.java | 23 +++++-------- Mage.Sets/src/mage/cards/l/LoyalUnicorn.java | 33 +++++++------------ .../src/mage/cards/s/SiegeGangLieutenant.java | 20 +++++------ .../mage/cards/s/SkyhunterStrikeForce.java | 4 +-- .../src/mage/cards/s/StormsurgeKraken.java | 19 ++++++----- .../src/mage/cards/t/ThunderfootBaloth.java | 28 +++++++--------- .../src/mage/cards/t/TyrantsFamiliar.java | 18 +++++----- .../abilityword/LieutenantAbility.java | 28 ++++++++-------- .../common/CommanderInPlayCondition.java | 26 --------------- .../common/ControlYourCommanderCondition.java | 19 +++++------ 15 files changed, 128 insertions(+), 203 deletions(-) delete mode 100644 Mage/src/main/java/mage/abilities/condition/common/CommanderInPlayCondition.java diff --git a/Mage.Sets/src/mage/cards/a/AngelicFieldMarshal.java b/Mage.Sets/src/mage/cards/a/AngelicFieldMarshal.java index cc7f394cca3..0882651ca32 100644 --- a/Mage.Sets/src/mage/cards/a/AngelicFieldMarshal.java +++ b/Mage.Sets/src/mage/cards/a/AngelicFieldMarshal.java @@ -1,11 +1,9 @@ package mage.cards.a; -import java.util.UUID; import mage.MageInt; import mage.abilities.abilityword.LieutenantAbility; -import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; @@ -13,16 +11,17 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; -import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.StaticFilters; + +import java.util.UUID; /** - * * @author emerald000 */ public final class AngelicFieldMarshal extends CardImpl { public AngelicFieldMarshal(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); this.subtype.add(SubType.ANGEL); this.power = new MageInt(3); @@ -30,11 +29,12 @@ public final class AngelicFieldMarshal extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // Lieutenant - As long as you control your commander, Angelic Field Marshal gets +2/+2 and creatures you control have vigilance. - ContinuousEffect effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, new FilterControlledCreaturePermanent()); - effect.setText("and creatures you control have vigilance"); - this.addAbility(new LieutenantAbility(effect)); + this.addAbility(new LieutenantAbility(new GainAbilityAllEffect( + VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, + StaticFilters.FILTER_CONTROLLED_CREATURES + ), "and creatures you control have vigilance")); } private AngelicFieldMarshal(final AngelicFieldMarshal card) { diff --git a/Mage.Sets/src/mage/cards/d/DemonOfWailingAgonies.java b/Mage.Sets/src/mage/cards/d/DemonOfWailingAgonies.java index e50617df326..21560e654f4 100644 --- a/Mage.Sets/src/mage/cards/d/DemonOfWailingAgonies.java +++ b/Mage.Sets/src/mage/cards/d/DemonOfWailingAgonies.java @@ -1,12 +1,9 @@ package mage.cards.d; -import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.abilityword.LieutenantAbility; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -16,14 +13,15 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author emerald000 */ public final class DemonOfWailingAgonies extends CardImpl { public DemonOfWailingAgonies(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{B}{B}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}"); this.subtype.add(SubType.DEMON); this.power = new MageInt(4); @@ -31,12 +29,13 @@ public final class DemonOfWailingAgonies extends CardImpl { // Flying this.addAbility(FlyingAbility.getInstance()); - + // Lieutenant - As long as you control your commander, Demon of Wailing Agonies gets +2/+2 and has "Whenever Demon of Wailing Agonies deals combat damage to a player, that player sacrifices a creature." - Ability gainedAbility = new DealsCombatDamageToAPlayerTriggeredAbility(new SacrificeEffect(StaticFilters.FILTER_PERMANENT_CREATURE, 1, "that player"), false, true); - ContinuousEffect effect = new GainAbilitySourceEffect(gainedAbility); - effect.setText("and has \"Whenever {this} deals combat damage to a player, that player sacrifices a creature.\""); - this.addAbility(new LieutenantAbility(effect)); + this.addAbility(new LieutenantAbility(new GainAbilitySourceEffect( + new DealsCombatDamageToAPlayerTriggeredAbility(new SacrificeEffect( + StaticFilters.FILTER_PERMANENT_CREATURE, 1, "that player" + ), false, true) + ), "and has \"Whenever {this} deals combat damage to a player, that player sacrifices a creature.\"")); } private DemonOfWailingAgonies(final DemonOfWailingAgonies card) { diff --git a/Mage.Sets/src/mage/cards/l/LoyalApprentice.java b/Mage.Sets/src/mage/cards/l/LoyalApprentice.java index cd2b0f47334..e918b817627 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalApprentice.java +++ b/Mage.Sets/src/mage/cards/l/LoyalApprentice.java @@ -2,12 +2,11 @@ package mage.cards.l; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; -import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -16,9 +15,7 @@ import mage.game.permanent.token.ThopterColorlessToken; import mage.game.permanent.token.Token; import mage.target.targetpointer.FixedTargets; -import java.util.Objects; import java.util.UUID; -import java.util.stream.Collectors; /** * @author TheElk801 @@ -37,14 +34,9 @@ public final class LoyalApprentice extends CardImpl { this.addAbility(HasteAbility.getInstance()); // Lieutenant — At the beginning of combat on your turn, if you control your commander, create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn. - this.addAbility(new ConditionalTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new LoyalApprenticeEffect() - ), CommanderInPlayCondition.instance, "Lieutenant — " + - "At the beginning of combat on your turn, if you control your commander, " + - "create a 1/1 colorless Thopter artifact creature token with flying. " + - "That token gains haste until end of turn." - )); + this.addAbility(new BeginningOfCombatTriggeredAbility(new LoyalApprenticeEffect()) + .withInterveningIf(ControlYourCommanderCondition.instance) + .setAbilityWord(AbilityWord.LIEUTENANT)); } private LoyalApprentice(final LoyalApprentice card) { @@ -78,13 +70,7 @@ class LoyalApprenticeEffect extends OneShotEffect { token.putOntoBattlefield(1, game, source, source.getControllerId()); game.addEffect(new GainAbilityTargetEffect( HasteAbility.getInstance(), Duration.EndOfTurn - ).setTargetPointer(new FixedTargets( - token.getLastAddedTokenIds() - .stream() - .map(game::getPermanent) - .filter(Objects::nonNull) - .collect(Collectors.toList()), game - )), source); + ).setTargetPointer(new FixedTargets(token, game)), source); return true; } } diff --git a/Mage.Sets/src/mage/cards/l/LoyalDrake.java b/Mage.Sets/src/mage/cards/l/LoyalDrake.java index 900dddf2df4..c7be047df24 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalDrake.java +++ b/Mage.Sets/src/mage/cards/l/LoyalDrake.java @@ -1,19 +1,19 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; -import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class LoyalDrake extends CardImpl { @@ -29,13 +29,9 @@ public final class LoyalDrake extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Lieutenant — At the beginning of combat on your turn, if you control your commander, draw a card. - this.addAbility(new ConditionalTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new DrawCardSourceControllerEffect(1) - ), CommanderInPlayCondition.instance, - "Lieutenant — At the beginning of combat " - + "on your turn, if you control your commander, draw a card." - )); + this.addAbility(new BeginningOfCombatTriggeredAbility(new DrawCardSourceControllerEffect(1)) + .withInterveningIf(ControlYourCommanderCondition.instance) + .setAbilityWord(AbilityWord.LIEUTENANT)); } private LoyalDrake(final LoyalDrake card) { diff --git a/Mage.Sets/src/mage/cards/l/LoyalGuardian.java b/Mage.Sets/src/mage/cards/l/LoyalGuardian.java index 02ab5f4c48c..cb8c5852eb2 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalGuardian.java +++ b/Mage.Sets/src/mage/cards/l/LoyalGuardian.java @@ -1,21 +1,21 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; -import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.effects.common.counter.AddCountersAllEffect; -import mage.constants.SubType; import mage.abilities.keyword.TrampleAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; import mage.constants.CardType; +import mage.constants.SubType; import mage.counters.CounterType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class LoyalGuardian extends CardImpl { @@ -31,17 +31,9 @@ public final class LoyalGuardian extends CardImpl { this.addAbility(TrampleAbility.getInstance()); // Lieutenant — At the beginning of combat on your turn, if you control your commander, put a +1/+1 counter on each creature you control. - this.addAbility(new ConditionalTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new AddCountersAllEffect( - CounterType.P1P1.createInstance(), - StaticFilters.FILTER_CONTROLLED_CREATURE - ) - ), CommanderInPlayCondition.instance, - "Lieutenant — At the beginning of combat " - + "on your turn, if you control your commander, " - + "put a +1/+1 counter on each creature you control." - )); + this.addAbility(new BeginningOfCombatTriggeredAbility(new AddCountersAllEffect( + CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE + )).withInterveningIf(ControlYourCommanderCondition.instance).setAbilityWord(AbilityWord.LIEUTENANT)); } private LoyalGuardian(final LoyalGuardian card) { diff --git a/Mage.Sets/src/mage/cards/l/LoyalSubordinate.java b/Mage.Sets/src/mage/cards/l/LoyalSubordinate.java index 1eea09a2c49..b7cc936eaea 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalSubordinate.java +++ b/Mage.Sets/src/mage/cards/l/LoyalSubordinate.java @@ -1,19 +1,19 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; -import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.effects.common.LoseLifeOpponentsEffect; -import mage.constants.SubType; import mage.abilities.keyword.MenaceAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; import mage.constants.CardType; +import mage.constants.SubType; + +import java.util.UUID; /** - * * @author TheElk801 */ public final class LoyalSubordinate extends CardImpl { @@ -29,14 +29,9 @@ public final class LoyalSubordinate extends CardImpl { this.addAbility(new MenaceAbility(false)); // Lieutenant — At the beginning of combat on your turn, if you control your commander, each opponent loses 3 life. - this.addAbility(new ConditionalTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new LoseLifeOpponentsEffect(3) - ), CommanderInPlayCondition.instance, - "Lieutenant — At the beginning of combat " - + "on your turn, if you control your commander, " - + "each opponent loses 3 life." - )); + this.addAbility(new BeginningOfCombatTriggeredAbility(new LoseLifeOpponentsEffect(3)) + .withInterveningIf(ControlYourCommanderCondition.instance) + .setAbilityWord(AbilityWord.LIEUTENANT)); } private LoyalSubordinate(final LoyalSubordinate card) { diff --git a/Mage.Sets/src/mage/cards/l/LoyalUnicorn.java b/Mage.Sets/src/mage/cards/l/LoyalUnicorn.java index f2a52c879d7..d9388697afd 100644 --- a/Mage.Sets/src/mage/cards/l/LoyalUnicorn.java +++ b/Mage.Sets/src/mage/cards/l/LoyalUnicorn.java @@ -1,23 +1,23 @@ package mage.cards.l; -import java.util.UUID; import mage.MageInt; -import mage.abilities.TriggeredAbility; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; -import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.Ability; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.effects.common.PreventAllDamageToAllEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; -import mage.constants.SubType; import mage.abilities.keyword.VigilanceAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author TheElk801 */ public final class LoyalUnicorn extends CardImpl { @@ -33,25 +33,14 @@ public final class LoyalUnicorn extends CardImpl { this.addAbility(VigilanceAbility.getInstance()); // Lieutenant — At the beginning of combat on your turn, if you control your commander, prevent all combat damage that would be dealt to creatures you control this turn. Other creatures you control gain vigilance until end of turn. - TriggeredAbility ability = new BeginningOfCombatTriggeredAbility( - new PreventAllDamageToAllEffect( - Duration.EndOfTurn, - StaticFilters.FILTER_CONTROLLED_CREATURES, - true - ) - ); + Ability ability = new BeginningOfCombatTriggeredAbility(new PreventAllDamageToAllEffect( + Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES, true + )).withInterveningIf(ControlYourCommanderCondition.instance); ability.addEffect(new GainAbilityAllEffect( VigilanceAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES, true )); - this.addAbility(new ConditionalTriggeredAbility( - ability, CommanderInPlayCondition.instance, - "Lieutenant — At the beginning of combat " - + "on your turn, if you control your commander, " - + "prevent all combat damage that would be dealt " - + "to creatures you control this turn. " - + "Other creatures you control gain vigilance until end of turn." - )); + this.addAbility(ability.setAbilityWord(AbilityWord.LIEUTENANT)); } private LoyalUnicorn(final LoyalUnicorn card) { diff --git a/Mage.Sets/src/mage/cards/s/SiegeGangLieutenant.java b/Mage.Sets/src/mage/cards/s/SiegeGangLieutenant.java index 40832f59859..fafe03614a8 100644 --- a/Mage.Sets/src/mage/cards/s/SiegeGangLieutenant.java +++ b/Mage.Sets/src/mage/cards/s/SiegeGangLieutenant.java @@ -2,19 +2,21 @@ package mage.cards.s; import mage.MageInt; import mage.abilities.Ability; -import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.costs.mana.GenericManaCost; -import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.HasteAbility; +import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.*; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.common.FilterControlledPermanent; import mage.game.Game; import mage.game.permanent.token.GoblinToken; @@ -40,13 +42,9 @@ public final class SiegeGangLieutenant extends CardImpl { this.toughness = new MageInt(2); // Lieutenant -- At the beginning of combat on your turn, if you control your commander, create two 1/1 red Goblin creature tokens. Those tokens gain haste until end of turn. - this.addAbility(new ConditionalInterveningIfTriggeredAbility( - new BeginningOfCombatTriggeredAbility( - new SiegeGangLieutenantEffect() - ), CommanderInPlayCondition.instance, "At the beginning of combat on your turn, " + - "if you control your commander, create two 1/1 red Goblin creature tokens. " + - "Those tokens gain haste until end of turn." - ).setAbilityWord(AbilityWord.LIEUTENANT)); + this.addAbility(new BeginningOfCombatTriggeredAbility(new SiegeGangLieutenantEffect()) + .withInterveningIf(ControlYourCommanderCondition.instance) + .setAbilityWord(AbilityWord.LIEUTENANT)); // {2}, Sacrifice a Goblin: Siege-Gang Lieutenant deals 1 damage to any target. Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new GenericManaCost(2)); diff --git a/Mage.Sets/src/mage/cards/s/SkyhunterStrikeForce.java b/Mage.Sets/src/mage/cards/s/SkyhunterStrikeForce.java index acb7442d0eb..23c5c57a5c7 100644 --- a/Mage.Sets/src/mage/cards/s/SkyhunterStrikeForce.java +++ b/Mage.Sets/src/mage/cards/s/SkyhunterStrikeForce.java @@ -2,7 +2,7 @@ package mage.cards.s; import mage.MageInt; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.FlyingAbility; @@ -41,7 +41,7 @@ public final class SkyhunterStrikeForce extends CardImpl { new GainAbilityControlledEffect( new MeleeAbility(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, true - ), CommanderInPlayCondition.instance, "as long as you control your commander, " + + ), ControlYourCommanderCondition.instance, "as long as you control your commander, " + "other creatures you control have melee" )).setAbilityWord(AbilityWord.LIEUTENANT)); } diff --git a/Mage.Sets/src/mage/cards/s/StormsurgeKraken.java b/Mage.Sets/src/mage/cards/s/StormsurgeKraken.java index 8014f28336e..3a221a69fb5 100644 --- a/Mage.Sets/src/mage/cards/s/StormsurgeKraken.java +++ b/Mage.Sets/src/mage/cards/s/StormsurgeKraken.java @@ -1,28 +1,27 @@ package mage.cards.s; -import java.util.UUID; import mage.MageInt; import mage.abilities.abilityword.LieutenantAbility; import mage.abilities.common.BecomesBlockedSourceTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.HexproofAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; + +import java.util.UUID; /** - * * @author LevelX2 */ public final class StormsurgeKraken extends CardImpl { public StormsurgeKraken(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{U}"); this.subtype.add(SubType.KRAKEN); this.power = new MageInt(5); @@ -30,11 +29,13 @@ public final class StormsurgeKraken extends CardImpl { // Hexproof this.addAbility(HexproofAbility.getInstance()); - + // Lieutenant - As long as you control your commander, Stormsurge Kraken gets +2/+2 and has "Whenever Stormsurge Kraken becomes blocked, you may draw two cards." - ContinuousEffect effect = new GainAbilitySourceEffect(new BecomesBlockedSourceTriggeredAbility(new DrawCardSourceControllerEffect(2), true), Duration.WhileOnBattlefield); - effect.setText("and has \"Whenever Stormsurge Kraken becomes blocked, you may draw two cards.\""); - this.addAbility(new LieutenantAbility(effect)); + this.addAbility(new LieutenantAbility(new GainAbilitySourceEffect( + new BecomesBlockedSourceTriggeredAbility( + new DrawCardSourceControllerEffect(2), true + ), Duration.WhileOnBattlefield + ), "and has \"Whenever {this} becomes blocked, you may draw two cards.\"")); } private StormsurgeKraken(final StormsurgeKraken card) { diff --git a/Mage.Sets/src/mage/cards/t/ThunderfootBaloth.java b/Mage.Sets/src/mage/cards/t/ThunderfootBaloth.java index e14ba8b37cd..3f76d6069d9 100644 --- a/Mage.Sets/src/mage/cards/t/ThunderfootBaloth.java +++ b/Mage.Sets/src/mage/cards/t/ThunderfootBaloth.java @@ -1,29 +1,27 @@ package mage.cards.t; -import java.util.UUID; import mage.MageInt; import mage.abilities.abilityword.LieutenantAbility; -import mage.abilities.effects.Effect; -import mage.abilities.effects.Effects; import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.SubType; import mage.constants.Duration; +import mage.constants.SubType; import mage.filter.StaticFilters; +import java.util.UUID; + /** - * * @author emerald000 */ public final class ThunderfootBaloth extends CardImpl { public ThunderfootBaloth(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{G}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); this.subtype.add(SubType.BEAST); this.power = new MageInt(5); @@ -31,16 +29,14 @@ public final class ThunderfootBaloth extends CardImpl { // Trample this.addAbility(TrampleAbility.getInstance()); - + // Lieutenant - As long as you control your commander, Thunderfoot Baloth gets +2/+2 and other creatures you control get +2/+2 and have trample. - Effects effects = new Effects(); - Effect effect = new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, true); - effect.setText("and other creatures you control get +2/+2"); - effects.add(effect); - effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, true); - effect.setText("and have trample"); - effects.add(effect); - this.addAbility(new LieutenantAbility(effects)); + this.addAbility(new LieutenantAbility(new BoostControlledEffect( + 2, 2, Duration.WhileOnBattlefield, true + ), "and other creature you control get +2/+2").addLieutenantEffect(new GainAbilityAllEffect( + TrampleAbility.getInstance(), Duration.WhileOnBattlefield, + StaticFilters.FILTER_CONTROLLED_CREATURES, true + ), "and have trample")); } private ThunderfootBaloth(final ThunderfootBaloth card) { diff --git a/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java b/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java index 1819e7c6aa5..9ed9aa5a7b7 100644 --- a/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java +++ b/Mage.Sets/src/mage/cards/t/TyrantsFamiliar.java @@ -1,13 +1,10 @@ package mage.cards.t; -import java.util.UUID; - import mage.MageInt; import mage.abilities.Ability; import mage.abilities.abilityword.LieutenantAbility; import mage.abilities.common.AttacksTriggeredAbility; -import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.keyword.FlyingAbility; @@ -20,6 +17,8 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPredicate; import mage.target.TargetPermanent; +import java.util.UUID; + /** * @author emerald000 */ @@ -46,11 +45,14 @@ public final class TyrantsFamiliar extends CardImpl { this.addAbility(HasteAbility.getInstance()); // Lieutenant - As long as you control your commander, Tyrant's Familiar gets +2/+2 and has "Whenever Tyrant's Familiar attacks, it deals 7 damage to target creature defending player controls." - Ability gainedAbility = new AttacksTriggeredAbility(new DamageTargetEffect(7, "it"), false); - gainedAbility.addTarget(new TargetPermanent(filter)); - ContinuousEffect effect = new GainAbilitySourceEffect(gainedAbility); - effect.setText("and has \"Whenever {this} attacks, it deals 7 damage to target creature defending player controls.\""); - this.addAbility(new LieutenantAbility(effect)); + Ability ability = new AttacksTriggeredAbility( + new DamageTargetEffect(7, "it"), false + ); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(new LieutenantAbility( + new GainAbilitySourceEffect(ability), "and has \"Whenever {this} attacks, " + + "it deals 7 damage to target creature defending player controls.\"" + )); } private TyrantsFamiliar(final TyrantsFamiliar card) { diff --git a/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java b/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java index cb1c049ef02..37e02dfe2a9 100644 --- a/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java +++ b/Mage/src/main/java/mage/abilities/abilityword/LieutenantAbility.java @@ -1,14 +1,11 @@ - - package mage.abilities.abilityword; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.common.CommanderInPlayCondition; +import mage.abilities.condition.common.ControlYourCommanderCondition; import mage.abilities.decorator.ConditionalContinuousEffect; import mage.abilities.effects.ContinuousEffect; -import mage.abilities.effects.Effect; -import mage.abilities.effects.Effects; import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.constants.AbilityWord; import mage.constants.Duration; import mage.constants.Zone; @@ -18,16 +15,19 @@ import mage.constants.Zone; public class LieutenantAbility extends SimpleStaticAbility { - public LieutenantAbility(ContinuousEffect effect) { - super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "Lieutenant — As long as you control your commander, {this} gets +2/+2")); - this.addEffect(new ConditionalContinuousEffect(effect, CommanderInPlayCondition.instance, effect.getText(null))); + public LieutenantAbility(ContinuousEffect effect, String text) { + super(Zone.BATTLEFIELD, new ConditionalContinuousEffect( + new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), + ControlYourCommanderCondition.instance, + "as long as you control your commander, {this} gets +2/+2" + )); + this.setAbilityWord(AbilityWord.LIEUTENANT); + this.addLieutenantEffect(effect, text); } - public LieutenantAbility(Effects effects) { - super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "Lieutenant — As long as you control your commander, {this} gets +2/+2")); - for (Effect effect : effects) { - this.addEffect(new ConditionalContinuousEffect((ContinuousEffect) effect, CommanderInPlayCondition.instance, effect.getText(null))); - } + public LieutenantAbility addLieutenantEffect(ContinuousEffect effect, String text) { + this.addEffect(new ConditionalContinuousEffect(effect, ControlYourCommanderCondition.instance, text)); + return this; } protected LieutenantAbility(final LieutenantAbility ability) { @@ -38,4 +38,4 @@ public class LieutenantAbility extends SimpleStaticAbility { public LieutenantAbility copy() { return new LieutenantAbility(this); } -} \ No newline at end of file +} diff --git a/Mage/src/main/java/mage/abilities/condition/common/CommanderInPlayCondition.java b/Mage/src/main/java/mage/abilities/condition/common/CommanderInPlayCondition.java deleted file mode 100644 index 42f79a85e79..00000000000 --- a/Mage/src/main/java/mage/abilities/condition/common/CommanderInPlayCondition.java +++ /dev/null @@ -1,26 +0,0 @@ -package mage.abilities.condition.common; - -import mage.abilities.Ability; -import mage.abilities.condition.Condition; -import mage.game.Game; - -/** - * Checks if the player has its commander in play and controls it - * - * @author LevelX2 - */ -public enum CommanderInPlayCondition implements Condition { - - instance; - - @Override - public boolean apply(Game game, Ability source) { - return ControlYourCommanderCondition.instance.apply(game, source); - } - - @Override - public String toString() { - return "As long as you control your commander"; - } - -} diff --git a/Mage/src/main/java/mage/abilities/condition/common/ControlYourCommanderCondition.java b/Mage/src/main/java/mage/abilities/condition/common/ControlYourCommanderCondition.java index f737febba55..f51c1f2fa7d 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/ControlYourCommanderCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/ControlYourCommanderCondition.java @@ -3,10 +3,10 @@ package mage.abilities.condition.common; import mage.abilities.Ability; import mage.abilities.condition.Condition; import mage.constants.CommanderCardType; +import mage.game.Controllable; import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.players.Player; -import java.util.Collection; import java.util.Objects; /** @@ -19,21 +19,18 @@ public enum ControlYourCommanderCondition implements Condition { @Override public boolean apply(Game game, Ability source) { - return game.getPlayerList() + Player player = game.getPlayer(source.getControllerId()); + return player != null && game + .getCommandersIds(player, CommanderCardType.COMMANDER_OR_OATHBREAKER, true) .stream() - .map(game::getPlayer) - .filter(Objects::nonNull) - .map(player -> game.getCommandersIds(player, CommanderCardType.COMMANDER_OR_OATHBREAKER, true)) // must search all card parts (example: mdf commander on battlefield) - .flatMap(Collection::stream) .map(game::getPermanent) .filter(Objects::nonNull) - .filter(Permanent::isPhasedIn) - .map(Permanent::getOwnerId) - .anyMatch(source.getControllerId()::equals); + .map(Controllable::getControllerId) + .anyMatch(source::isControlledBy); } @Override public String toString() { - return "If you control your commander"; + return "you control your commander"; } }