rework effects and abilities which care about controlling your own commander (fixes #13542)

This commit is contained in:
theelk801 2025-04-16 12:13:15 -04:00
parent c0c27c81fa
commit d4954bf784
15 changed files with 128 additions and 203 deletions

View file

@ -1,11 +1,9 @@
package mage.cards.a; package mage.cards.a;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.abilityword.LieutenantAbility; import mage.abilities.abilityword.LieutenantAbility;
import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
@ -13,10 +11,11 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class AngelicFieldMarshal extends CardImpl { public final class AngelicFieldMarshal extends CardImpl {
@ -32,9 +31,10 @@ public final class AngelicFieldMarshal extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// Lieutenant - As long as you control your commander, Angelic Field Marshal gets +2/+2 and creatures you control have vigilance. // 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()); this.addAbility(new LieutenantAbility(new GainAbilityAllEffect(
effect.setText("and creatures you control have vigilance"); VigilanceAbility.getInstance(), Duration.WhileOnBattlefield,
this.addAbility(new LieutenantAbility(effect)); StaticFilters.FILTER_CONTROLLED_CREATURES
), "and creatures you control have vigilance"));
} }
private AngelicFieldMarshal(final AngelicFieldMarshal card) { private AngelicFieldMarshal(final AngelicFieldMarshal card) {

View file

@ -1,12 +1,9 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.abilityword.LieutenantAbility; import mage.abilities.abilityword.LieutenantAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
@ -16,8 +13,9 @@ import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class DemonOfWailingAgonies extends CardImpl { public final class DemonOfWailingAgonies extends CardImpl {
@ -33,10 +31,11 @@ public final class DemonOfWailingAgonies extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); 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." // 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); this.addAbility(new LieutenantAbility(new GainAbilitySourceEffect(
ContinuousEffect effect = new GainAbilitySourceEffect(gainedAbility); new DealsCombatDamageToAPlayerTriggeredAbility(new SacrificeEffect(
effect.setText("and has \"Whenever {this} deals combat damage to a player, that player sacrifices a creature.\""); StaticFilters.FILTER_PERMANENT_CREATURE, 1, "that player"
this.addAbility(new LieutenantAbility(effect)); ), false, true)
), "and has \"Whenever {this} deals combat damage to a player, that player sacrifices a creature.\""));
} }
private DemonOfWailingAgonies(final DemonOfWailingAgonies card) { private DemonOfWailingAgonies(final DemonOfWailingAgonies card) {

View file

@ -2,12 +2,11 @@ package mage.cards.l;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.ControlYourCommanderCondition;
import mage.abilities.condition.common.CommanderInPlayCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.*;
@ -16,9 +15,7 @@ import mage.game.permanent.token.ThopterColorlessToken;
import mage.game.permanent.token.Token; import mage.game.permanent.token.Token;
import mage.target.targetpointer.FixedTargets; import mage.target.targetpointer.FixedTargets;
import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
/** /**
* @author TheElk801 * @author TheElk801
@ -37,14 +34,9 @@ public final class LoyalApprentice extends CardImpl {
this.addAbility(HasteAbility.getInstance()); 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. // 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( this.addAbility(new BeginningOfCombatTriggeredAbility(new LoyalApprenticeEffect())
new BeginningOfCombatTriggeredAbility( .withInterveningIf(ControlYourCommanderCondition.instance)
new LoyalApprenticeEffect() .setAbilityWord(AbilityWord.LIEUTENANT));
), CommanderInPlayCondition.instance, "<i>Lieutenant</i> &mdash; " +
"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."
));
} }
private LoyalApprentice(final LoyalApprentice card) { private LoyalApprentice(final LoyalApprentice card) {
@ -78,13 +70,7 @@ class LoyalApprenticeEffect extends OneShotEffect {
token.putOntoBattlefield(1, game, source, source.getControllerId()); token.putOntoBattlefield(1, game, source, source.getControllerId());
game.addEffect(new GainAbilityTargetEffect( game.addEffect(new GainAbilityTargetEffect(
HasteAbility.getInstance(), Duration.EndOfTurn HasteAbility.getInstance(), Duration.EndOfTurn
).setTargetPointer(new FixedTargets( ).setTargetPointer(new FixedTargets(token, game)), source);
token.getLastAddedTokenIds()
.stream()
.map(game::getPermanent)
.filter(Objects::nonNull)
.collect(Collectors.toList()), game
)), source);
return true; return true;
} }
} }

View file

@ -1,19 +1,19 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.ControlYourCommanderCondition;
import mage.abilities.condition.common.CommanderInPlayCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.constants.SubType;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class LoyalDrake extends CardImpl { public final class LoyalDrake extends CardImpl {
@ -29,13 +29,9 @@ public final class LoyalDrake extends CardImpl {
this.addAbility(FlyingAbility.getInstance()); this.addAbility(FlyingAbility.getInstance());
// Lieutenant At the beginning of combat on your turn, if you control your commander, draw a card. // Lieutenant At the beginning of combat on your turn, if you control your commander, draw a card.
this.addAbility(new ConditionalTriggeredAbility( this.addAbility(new BeginningOfCombatTriggeredAbility(new DrawCardSourceControllerEffect(1))
new BeginningOfCombatTriggeredAbility( .withInterveningIf(ControlYourCommanderCondition.instance)
new DrawCardSourceControllerEffect(1) .setAbilityWord(AbilityWord.LIEUTENANT));
), CommanderInPlayCondition.instance,
"<i>Lieutenant</i> &mdash; At the beginning of combat "
+ "on your turn, if you control your commander, draw a card."
));
} }
private LoyalDrake(final LoyalDrake card) { private LoyalDrake(final LoyalDrake card) {

View file

@ -1,21 +1,21 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.ControlYourCommanderCondition;
import mage.abilities.condition.common.CommanderInPlayCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersAllEffect; import mage.abilities.effects.common.counter.AddCountersAllEffect;
import mage.constants.SubType;
import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TrampleAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class LoyalGuardian extends CardImpl { public final class LoyalGuardian extends CardImpl {
@ -31,17 +31,9 @@ public final class LoyalGuardian extends CardImpl {
this.addAbility(TrampleAbility.getInstance()); 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. // 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( this.addAbility(new BeginningOfCombatTriggeredAbility(new AddCountersAllEffect(
new BeginningOfCombatTriggeredAbility( CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE
new AddCountersAllEffect( )).withInterveningIf(ControlYourCommanderCondition.instance).setAbilityWord(AbilityWord.LIEUTENANT));
CounterType.P1P1.createInstance(),
StaticFilters.FILTER_CONTROLLED_CREATURE
)
), CommanderInPlayCondition.instance,
"<i>Lieutenant</i> &mdash; At the beginning of combat "
+ "on your turn, if you control your commander, "
+ "put a +1/+1 counter on each creature you control."
));
} }
private LoyalGuardian(final LoyalGuardian card) { private LoyalGuardian(final LoyalGuardian card) {

View file

@ -1,19 +1,19 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.ControlYourCommanderCondition;
import mage.abilities.condition.common.CommanderInPlayCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.LoseLifeOpponentsEffect; import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.constants.SubType;
import mage.abilities.keyword.MenaceAbility; import mage.abilities.keyword.MenaceAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class LoyalSubordinate extends CardImpl { public final class LoyalSubordinate extends CardImpl {
@ -29,14 +29,9 @@ public final class LoyalSubordinate extends CardImpl {
this.addAbility(new MenaceAbility(false)); this.addAbility(new MenaceAbility(false));
// Lieutenant At the beginning of combat on your turn, if you control your commander, each opponent loses 3 life. // Lieutenant At the beginning of combat on your turn, if you control your commander, each opponent loses 3 life.
this.addAbility(new ConditionalTriggeredAbility( this.addAbility(new BeginningOfCombatTriggeredAbility(new LoseLifeOpponentsEffect(3))
new BeginningOfCombatTriggeredAbility( .withInterveningIf(ControlYourCommanderCondition.instance)
new LoseLifeOpponentsEffect(3) .setAbilityWord(AbilityWord.LIEUTENANT));
), CommanderInPlayCondition.instance,
"<i>Lieutenant</i> &mdash; At the beginning of combat "
+ "on your turn, if you control your commander, "
+ "each opponent loses 3 life."
));
} }
private LoyalSubordinate(final LoyalSubordinate card) { private LoyalSubordinate(final LoyalSubordinate card) {

View file

@ -1,23 +1,23 @@
package mage.cards.l; package mage.cards.l;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.TriggeredAbility; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; import mage.abilities.condition.common.ControlYourCommanderCondition;
import mage.abilities.condition.common.CommanderInPlayCondition;
import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.PreventAllDamageToAllEffect; import mage.abilities.effects.common.PreventAllDamageToAllEffect;
import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.constants.SubType;
import mage.abilities.keyword.VigilanceAbility; import mage.abilities.keyword.VigilanceAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.AbilityWord;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author TheElk801 * @author TheElk801
*/ */
public final class LoyalUnicorn extends CardImpl { public final class LoyalUnicorn extends CardImpl {
@ -33,25 +33,14 @@ public final class LoyalUnicorn extends CardImpl {
this.addAbility(VigilanceAbility.getInstance()); 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. // 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( Ability ability = new BeginningOfCombatTriggeredAbility(new PreventAllDamageToAllEffect(
new PreventAllDamageToAllEffect( Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES, true
Duration.EndOfTurn, )).withInterveningIf(ControlYourCommanderCondition.instance);
StaticFilters.FILTER_CONTROLLED_CREATURES,
true
)
);
ability.addEffect(new GainAbilityAllEffect( ability.addEffect(new GainAbilityAllEffect(
VigilanceAbility.getInstance(), Duration.EndOfTurn, VigilanceAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_CONTROLLED_CREATURES, true StaticFilters.FILTER_CONTROLLED_CREATURES, true
)); ));
this.addAbility(new ConditionalTriggeredAbility( this.addAbility(ability.setAbilityWord(AbilityWord.LIEUTENANT));
ability, CommanderInPlayCondition.instance,
"<i>Lieutenant</i> &mdash; 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."
));
} }
private LoyalUnicorn(final LoyalUnicorn card) { private LoyalUnicorn(final LoyalUnicorn card) {

View file

@ -2,19 +2,21 @@ package mage.cards.s;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility; 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.common.SacrificeTargetCost;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; 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.filter.common.FilterControlledPermanent;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.token.GoblinToken; import mage.game.permanent.token.GoblinToken;
@ -40,13 +42,9 @@ public final class SiegeGangLieutenant extends CardImpl {
this.toughness = new MageInt(2); 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. // 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( this.addAbility(new BeginningOfCombatTriggeredAbility(new SiegeGangLieutenantEffect())
new BeginningOfCombatTriggeredAbility( .withInterveningIf(ControlYourCommanderCondition.instance)
new SiegeGangLieutenantEffect() .setAbilityWord(AbilityWord.LIEUTENANT));
), 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));
// {2}, Sacrifice a Goblin: Siege-Gang Lieutenant deals 1 damage to any target. // {2}, Sacrifice a Goblin: Siege-Gang Lieutenant deals 1 damage to any target.
Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new GenericManaCost(2)); Ability ability = new SimpleActivatedAbility(new DamageTargetEffect(1), new GenericManaCost(2));

View file

@ -2,7 +2,7 @@ package mage.cards.s;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility; 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.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
@ -41,7 +41,7 @@ public final class SkyhunterStrikeForce extends CardImpl {
new GainAbilityControlledEffect( new GainAbilityControlledEffect(
new MeleeAbility(), Duration.WhileOnBattlefield, new MeleeAbility(), Duration.WhileOnBattlefield,
StaticFilters.FILTER_CONTROLLED_CREATURES, true 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" "other creatures you control have melee"
)).setAbilityWord(AbilityWord.LIEUTENANT)); )).setAbilityWord(AbilityWord.LIEUTENANT));
} }

View file

@ -1,22 +1,21 @@
package mage.cards.s; package mage.cards.s;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.abilityword.LieutenantAbility; import mage.abilities.abilityword.LieutenantAbility;
import mage.abilities.common.BecomesBlockedSourceTriggeredAbility; import mage.abilities.common.BecomesBlockedSourceTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.HexproofAbility; import mage.abilities.keyword.HexproofAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import java.util.UUID;
/** /**
*
* @author LevelX2 * @author LevelX2
*/ */
public final class StormsurgeKraken extends CardImpl { public final class StormsurgeKraken extends CardImpl {
@ -32,9 +31,11 @@ public final class StormsurgeKraken extends CardImpl {
this.addAbility(HexproofAbility.getInstance()); 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." // 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); this.addAbility(new LieutenantAbility(new GainAbilitySourceEffect(
effect.setText("and has \"Whenever Stormsurge Kraken becomes blocked, you may draw two cards.\""); new BecomesBlockedSourceTriggeredAbility(
this.addAbility(new LieutenantAbility(effect)); new DrawCardSourceControllerEffect(2), true
), Duration.WhileOnBattlefield
), "and has \"Whenever {this} becomes blocked, you may draw two cards.\""));
} }
private StormsurgeKraken(final StormsurgeKraken card) { private StormsurgeKraken(final StormsurgeKraken card) {

View file

@ -1,23 +1,21 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.abilityword.LieutenantAbility; 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.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters; import mage.filter.StaticFilters;
import java.util.UUID;
/** /**
*
* @author emerald000 * @author emerald000
*/ */
public final class ThunderfootBaloth extends CardImpl { public final class ThunderfootBaloth extends CardImpl {
@ -33,14 +31,12 @@ public final class ThunderfootBaloth extends CardImpl {
this.addAbility(TrampleAbility.getInstance()); 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. // 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(); this.addAbility(new LieutenantAbility(new BoostControlledEffect(
Effect effect = new BoostControlledEffect(2, 2, Duration.WhileOnBattlefield, true); 2, 2, Duration.WhileOnBattlefield, true
effect.setText("and other creatures you control get +2/+2"); ), "and other creature you control get +2/+2").addLieutenantEffect(new GainAbilityAllEffect(
effects.add(effect); TrampleAbility.getInstance(), Duration.WhileOnBattlefield,
effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, StaticFilters.FILTER_CONTROLLED_CREATURES, true); StaticFilters.FILTER_CONTROLLED_CREATURES, true
effect.setText("and have trample"); ), "and have trample"));
effects.add(effect);
this.addAbility(new LieutenantAbility(effects));
} }
private ThunderfootBaloth(final ThunderfootBaloth card) { private ThunderfootBaloth(final ThunderfootBaloth card) {

View file

@ -1,13 +1,10 @@
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.abilityword.LieutenantAbility; import mage.abilities.abilityword.LieutenantAbility;
import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.FlyingAbility;
@ -20,6 +17,8 @@ import mage.filter.FilterPermanent;
import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPredicate; import mage.filter.predicate.permanent.DefendingPlayerControlsSourceAttackingPredicate;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import java.util.UUID;
/** /**
* @author emerald000 * @author emerald000
*/ */
@ -46,11 +45,14 @@ public final class TyrantsFamiliar extends CardImpl {
this.addAbility(HasteAbility.getInstance()); 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." // 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); Ability ability = new AttacksTriggeredAbility(
gainedAbility.addTarget(new TargetPermanent(filter)); new DamageTargetEffect(7, "it"), false
ContinuousEffect effect = new GainAbilitySourceEffect(gainedAbility); );
effect.setText("and has \"Whenever {this} attacks, it deals 7 damage to target creature defending player controls.\""); ability.addTarget(new TargetPermanent(filter));
this.addAbility(new LieutenantAbility(effect)); 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) { private TyrantsFamiliar(final TyrantsFamiliar card) {

View file

@ -1,14 +1,11 @@
package mage.abilities.abilityword; package mage.abilities.abilityword;
import mage.abilities.common.SimpleStaticAbility; 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.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.Effects;
import mage.abilities.effects.common.continuous.BoostSourceEffect; import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.constants.AbilityWord;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Zone; import mage.constants.Zone;
@ -18,16 +15,19 @@ import mage.constants.Zone;
public class LieutenantAbility extends SimpleStaticAbility { public class LieutenantAbility extends SimpleStaticAbility {
public LieutenantAbility(ContinuousEffect effect) { public LieutenantAbility(ContinuousEffect effect, String text) {
super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "<i>Lieutenant</i> &mdash; As long as you control your commander, {this} gets +2/+2")); super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
this.addEffect(new ConditionalContinuousEffect(effect, CommanderInPlayCondition.instance, effect.getText(null))); 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) { public LieutenantAbility addLieutenantEffect(ContinuousEffect effect, String text) {
super(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostSourceEffect(2, 2, Duration.WhileOnBattlefield), CommanderInPlayCondition.instance, "<i>Lieutenant</i> &mdash; As long as you control your commander, {this} gets +2/+2")); this.addEffect(new ConditionalContinuousEffect(effect, ControlYourCommanderCondition.instance, text));
for (Effect effect : effects) { return this;
this.addEffect(new ConditionalContinuousEffect((ContinuousEffect) effect, CommanderInPlayCondition.instance, effect.getText(null)));
}
} }
protected LieutenantAbility(final LieutenantAbility ability) { protected LieutenantAbility(final LieutenantAbility ability) {

View file

@ -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";
}
}

View file

@ -3,10 +3,10 @@ package mage.abilities.condition.common;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.condition.Condition; import mage.abilities.condition.Condition;
import mage.constants.CommanderCardType; import mage.constants.CommanderCardType;
import mage.game.Controllable;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.players.Player;
import java.util.Collection;
import java.util.Objects; import java.util.Objects;
/** /**
@ -19,21 +19,18 @@ public enum ControlYourCommanderCondition implements Condition {
@Override @Override
public boolean apply(Game game, Ability source) { 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() .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) .map(game::getPermanent)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(Permanent::isPhasedIn) .map(Controllable::getControllerId)
.map(Permanent::getOwnerId) .anyMatch(source::isControlledBy);
.anyMatch(source.getControllerId()::equals);
} }
@Override @Override
public String toString() { public String toString() {
return "If you control your commander"; return "you control your commander";
} }
} }