[DFT] Guidelight Matrix and Kolodin, Triumph Caster

This commit is contained in:
Jmlundeen 2025-03-18 22:23:40 -05:00 committed by GitHub
commit 0d0a6691f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 197 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 ManaCostsImpl<>("{2}"));
saddledAbility.addCost(new TapSourceCost());
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 ManaCostsImpl<>("{2}"));
animateVehicleAbility.addCost(new TapSourceCost());
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

@ -0,0 +1,68 @@
package mage.cards.k;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.SaddleTargetMountEffect;
import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.Predicates;
/**
*
* @author Jmlundeen
*/
public final class KolodinTriumphCaster extends CardImpl {
private static final FilterControlledPermanent filter = new FilterControlledPermanent("Mounts and Vehicles you control");
private static final FilterControlledPermanent mountFilter = new FilterControlledPermanent("Mount");
private static final FilterControlledPermanent vehicleFilter = new FilterControlledPermanent("Vehicle");
static {
filter.add(Predicates.or(
SubType.MOUNT.getPredicate(),
SubType.VEHICLE.getPredicate()
));
mountFilter.add(SubType.MOUNT.getPredicate());
vehicleFilter.add(SubType.VEHICLE.getPredicate());
}
public KolodinTriumphCaster(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.PILOT);
this.power = new MageInt(2);
this.toughness = new MageInt(3);
// Mounts and Vehicles you control have haste.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
new GainAbilityControlledEffect(HasteAbility.getInstance(),
Duration.WhileOnBattlefield, filter)));
// Whenever a Mount you control enters, it becomes saddled until end of turn.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new SaddleTargetMountEffect("it becomes saddled until end of turn"),
mountFilter));
// Whenever a Vehicle you control enters, it becomes an artifact creature until end of turn.
this.addAbility(new EntersBattlefieldControlledTriggeredAbility(new AddCardTypeTargetEffect(
Duration.EndOfTurn, CardType.ARTIFACT, CardType.CREATURE)
.setText("it becomes an artifact creature until end of turn"), vehicleFilter)
);
}
private KolodinTriumphCaster(final KolodinTriumphCaster card) {
super(card);
}
@Override
public KolodinTriumphCaster copy() {
return new KolodinTriumphCaster(this);
}
}

View file

@ -141,6 +141,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 Optimizer", 45, Rarity.COMMON, mage.cards.g.GuidelightOptimizer.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));
@ -164,6 +165,9 @@ public final class Aetherdrift extends ExpansionSet {
cards.add(new SetCardInfo("Ketramose, the New Dawn", 482, Rarity.MYTHIC, mage.cards.k.KetramoseTheNewDawn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ketramose, the New Dawn", 549, Rarity.MYTHIC, mage.cards.k.KetramoseTheNewDawn.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kickoff Celebrations", 135, Rarity.COMMON, mage.cards.k.KickoffCelebrations.class));
cards.add(new SetCardInfo("Kolodin, Triumph Caster", 210, Rarity.RARE, mage.cards.k.KolodinTriumphCaster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kolodin, Triumph Caster", 364, Rarity.RARE, mage.cards.k.KolodinTriumphCaster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Kolodin, Triumph Caster", 483, Rarity.RARE, mage.cards.k.KolodinTriumphCaster.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Lagorin, Soul of Alacria", 211, Rarity.UNCOMMON, mage.cards.l.LagorinSoulOfAlacria.class));
cards.add(new SetCardInfo("Leonin Surveyor", 18, Rarity.COMMON, mage.cards.l.LeoninSurveyor.class));
cards.add(new SetCardInfo("Lifecraft Engine", 234, Rarity.RARE, mage.cards.l.LifecraftEngine.class));

View file

@ -0,0 +1,40 @@
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) {
return SaddleAbility.applySaddle(game.getPermanent(getTargetPointer().getFirst(game, source)), 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);