[DFT] Add Guidelight Matrix artifact

add static method from SaddleAbility to saddle a permanent
add common saddle effect
refactor Alacrian Armory with new saddle effect
This commit is contained in:
jmlundeen 2025-03-04 17:44:40 -06:00
parent 37fc173701
commit a472ff9f18
5 changed files with 130 additions and 16 deletions

View file

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

View file

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

View file

@ -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));

View file

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

View file

@ -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);