diff --git a/Mage.Sets/src/mage/cards/a/AlacrianArmory.java b/Mage.Sets/src/mage/cards/a/AlacrianArmory.java index 7f0f5f5286c..efece7d0c13 100644 --- a/Mage.Sets/src/mage/cards/a/AlacrianArmory.java +++ b/Mage.Sets/src/mage/cards/a/AlacrianArmory.java @@ -3,15 +3,12 @@ package mage.cards.a; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.CrewSaddleIncreasedPowerAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.EndTurnEffect; import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.keyword.CrewAbility; import mage.abilities.keyword.SaddleAbility; import mage.abilities.keyword.VigilanceAbility; import mage.abilities.triggers.BeginningOfCombatTriggeredAbility; @@ -25,12 +22,9 @@ import mage.constants.TargetController; import mage.filter.FilterPermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; -import mage.filter.predicate.permanent.SaddledSourceThisTurnPredicate; import mage.game.Game; -import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; -import mage.target.targetpointer.FixedTarget; /** * @@ -100,18 +94,10 @@ class AlacrianArmoryAnimateEffect extends OneShotEffect { return false; } if (target.hasSubtype(SubType.MOUNT, game)) { - target.getAbilities().stream().filter( - ability -> ability instanceof SaddleAbility) - .findFirst() - .ifPresent(ability -> game.fireEvent(GameEvent.getEvent( - GameEvent.EventType.MOUNT_SADDLED, - ability.getSourceId(), - ability, source.getControllerId())) - ); + SaddleAbility.applySaddle(target, game); } if (target.hasSubtype(SubType.VEHICLE, game)) { - game.addEffect(new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.CREATURE, CardType.ARTIFACT) - .setTargetPointer(new FixedTarget(target, game)), source); + game.addEffect(new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.CREATURE, CardType.ARTIFACT), source); } return true; } diff --git a/Mage.Sets/src/mage/cards/g/GuidelightMatrix.java b/Mage.Sets/src/mage/cards/g/GuidelightMatrix.java new file mode 100644 index 00000000000..93b938c91c3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GuidelightMatrix.java @@ -0,0 +1,66 @@ +package mage.cards.g; + +import java.util.UUID; + +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.CompositeCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.SaddleTargetMountEffect; +import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; +import mage.target.TargetPermanent; + +/** + * + * @author Jmlundeen + */ +public final class GuidelightMatrix extends CardImpl { + + private static final FilterControlledPermanent mountFilter = new FilterControlledPermanent("Mount you control"); + private static final FilterControlledPermanent vehicleFilter = new FilterControlledPermanent("Vehicle you control"); + + static { + mountFilter.add(SubType.MOUNT.getPredicate()); + vehicleFilter.add(SubType.VEHICLE.getPredicate()); + } + + public GuidelightMatrix(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{2}"); + + + // When this artifact enters, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1))); + // {2}, {T}: Target Mount you control becomes saddled until end of turn. Activate only as a sorcery. + Ability saddledAbility = new ActivateAsSorceryActivatedAbility(new SaddleTargetMountEffect(), + new CompositeCost(new ManaCostsImpl<>("{2}"), new TapSourceCost(), "{2}, {T}") + ); + saddledAbility.addTarget(new TargetPermanent(mountFilter)); + this.addAbility(saddledAbility); + // {2}, {T}: Target Vehicle you control becomes an artifact creature until end of turn. + Ability animateVehicleAbility = new SimpleActivatedAbility( + new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE) + .setText("Target Vehicle you control becomes an artifact creature until end of turn."), + new CompositeCost(new ManaCostsImpl<>("{2}"), new TapSourceCost(), "{2}, {T}")); + animateVehicleAbility.addTarget(new TargetPermanent(vehicleFilter)); + this.addAbility(animateVehicleAbility); + } + + private GuidelightMatrix(final GuidelightMatrix card) { + super(card); + } + + @Override + public GuidelightMatrix copy() { + return new GuidelightMatrix(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Aetherdrift.java b/Mage.Sets/src/mage/sets/Aetherdrift.java index fa0196632dd..85b43477ebf 100644 --- a/Mage.Sets/src/mage/sets/Aetherdrift.java +++ b/Mage.Sets/src/mage/sets/Aetherdrift.java @@ -134,6 +134,7 @@ public final class Aetherdrift extends ExpansionSet { cards.add(new SetCardInfo("Grim Bauble", 88, Rarity.COMMON, mage.cards.g.GrimBauble.class)); cards.add(new SetCardInfo("Grim Javelineer", 89, Rarity.COMMON, mage.cards.g.GrimJavelineer.class)); cards.add(new SetCardInfo("Guardian Sunmare", 15, Rarity.RARE, mage.cards.g.GuardianSunmare.class)); + cards.add(new SetCardInfo("Guidelight Matrix", 233, Rarity.COMMON, mage.cards.g.GuidelightMatrix.class)); cards.add(new SetCardInfo("Guidelight Pathmaker", 206, Rarity.UNCOMMON, mage.cards.g.GuidelightPathmaker.class)); cards.add(new SetCardInfo("Guidelight Synergist", 16, Rarity.UNCOMMON, mage.cards.g.GuidelightSynergist.class)); cards.add(new SetCardInfo("Haunt the Network", 207, Rarity.UNCOMMON, mage.cards.h.HauntTheNetwork.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/SaddleTargetMountEffect.java b/Mage/src/main/java/mage/abilities/effects/common/SaddleTargetMountEffect.java new file mode 100644 index 00000000000..66de8d61eef --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/SaddleTargetMountEffect.java @@ -0,0 +1,44 @@ +package mage.abilities.effects.common; + +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.SaddleAbility; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * @author Jmlundeen + */ +public class SaddleTargetMountEffect extends OneShotEffect { + + public SaddleTargetMountEffect() { + super(Outcome.Benefit); + staticText = "Target Mount you control becomes saddled until end of turn"; + } + + public SaddleTargetMountEffect(String rule) { + super(Outcome.Benefit); + staticText = rule; + } + + protected SaddleTargetMountEffect(final SaddleTargetMountEffect effect) { + super(effect); + } + + @Override + public SaddleTargetMountEffect copy() { + return new SaddleTargetMountEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent targetMount = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (targetMount == null || !targetMount.hasSubtype(SubType.MOUNT, game)) { + return false; + } + return SaddleAbility.applySaddle(targetMount, game); + } + +} diff --git a/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java b/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java index 6967270ddc3..a9b2d74730f 100644 --- a/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/SaddleAbility.java @@ -48,6 +48,23 @@ public class SaddleAbility extends SimpleActivatedAbility { this.value = ability.value; } + public static boolean applySaddle(Permanent permanent, Game game) { + if (permanent == null) { + return false; + } + SaddleAbility saddleAbility = permanent.getAbilities().stream() + .filter(a -> a instanceof SaddleAbility) + .map(a -> (SaddleAbility) a) + .findFirst() + .orElse(null); + if (saddleAbility != null) { + SaddleEventEffect effect = new SaddleEventEffect(); + effect.apply(game, saddleAbility); + return true; + } + return false; + } + @Override public SaddleAbility copy() { return new SaddleAbility(this);