mirror of
https://github.com/magefree/mage.git
synced 2025-12-22 11:32:00 -08:00
[DFT] Guidelight Matrix and Kolodin, Triumph Caster
This commit is contained in:
commit
0d0a6691f2
6 changed files with 197 additions and 16 deletions
|
|
@ -3,15 +3,12 @@ package mage.cards.a;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.abilities.common.CrewSaddleIncreasedPowerAbility;
|
|
||||||
import mage.abilities.common.SimpleStaticAbility;
|
import mage.abilities.common.SimpleStaticAbility;
|
||||||
import mage.abilities.effects.Effect;
|
import mage.abilities.effects.Effect;
|
||||||
import mage.abilities.effects.OneShotEffect;
|
import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.EndTurnEffect;
|
|
||||||
import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect;
|
import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect;
|
||||||
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.GainAbilityControlledEffect;
|
||||||
import mage.abilities.keyword.CrewAbility;
|
|
||||||
import mage.abilities.keyword.SaddleAbility;
|
import mage.abilities.keyword.SaddleAbility;
|
||||||
import mage.abilities.keyword.VigilanceAbility;
|
import mage.abilities.keyword.VigilanceAbility;
|
||||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||||
|
|
@ -25,12 +22,9 @@ import mage.constants.TargetController;
|
||||||
import mage.filter.FilterPermanent;
|
import mage.filter.FilterPermanent;
|
||||||
import mage.filter.common.FilterCreaturePermanent;
|
import mage.filter.common.FilterCreaturePermanent;
|
||||||
import mage.filter.predicate.Predicates;
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.filter.predicate.permanent.SaddledSourceThisTurnPredicate;
|
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
import mage.target.targetpointer.FixedTarget;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -100,18 +94,10 @@ class AlacrianArmoryAnimateEffect extends OneShotEffect {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (target.hasSubtype(SubType.MOUNT, game)) {
|
if (target.hasSubtype(SubType.MOUNT, game)) {
|
||||||
target.getAbilities().stream().filter(
|
SaddleAbility.applySaddle(target, game);
|
||||||
ability -> ability instanceof SaddleAbility)
|
|
||||||
.findFirst()
|
|
||||||
.ifPresent(ability -> game.fireEvent(GameEvent.getEvent(
|
|
||||||
GameEvent.EventType.MOUNT_SADDLED,
|
|
||||||
ability.getSourceId(),
|
|
||||||
ability, source.getControllerId()))
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (target.hasSubtype(SubType.VEHICLE, game)) {
|
if (target.hasSubtype(SubType.VEHICLE, game)) {
|
||||||
game.addEffect(new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.CREATURE, CardType.ARTIFACT)
|
game.addEffect(new AddCardTypeTargetEffect(Duration.EndOfTurn, CardType.CREATURE, CardType.ARTIFACT), source);
|
||||||
.setTargetPointer(new FixedTarget(target, game)), source);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
66
Mage.Sets/src/mage/cards/g/GuidelightMatrix.java
Normal file
66
Mage.Sets/src/mage/cards/g/GuidelightMatrix.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
68
Mage.Sets/src/mage/cards/k/KolodinTriumphCaster.java
Normal file
68
Mage.Sets/src/mage/cards/k/KolodinTriumphCaster.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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 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("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("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 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 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("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", 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("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("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("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("Leonin Surveyor", 18, Rarity.COMMON, mage.cards.l.LeoninSurveyor.class));
|
||||||
cards.add(new SetCardInfo("Lifecraft Engine", 234, Rarity.RARE, mage.cards.l.LifecraftEngine.class));
|
cards.add(new SetCardInfo("Lifecraft Engine", 234, Rarity.RARE, mage.cards.l.LifecraftEngine.class));
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -48,6 +48,23 @@ public class SaddleAbility extends SimpleActivatedAbility {
|
||||||
this.value = ability.value;
|
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
|
@Override
|
||||||
public SaddleAbility copy() {
|
public SaddleAbility copy() {
|
||||||
return new SaddleAbility(this);
|
return new SaddleAbility(this);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue