convert transforming "U" cards to single class file

part of #14099
This commit is contained in:
jmlundeen 2025-12-05 11:52:47 -06:00
parent 84933f5802
commit 59cf680abc
27 changed files with 485 additions and 793 deletions

View file

@ -1,123 +0,0 @@
package mage.cards.s;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastOpponentTriggeredAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterSpell;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.watchers.common.PlayersAttackedThisTurnWatcher;
import java.util.UUID;
/**
*
* @author notgreat
*/
public final class SandswirlWanderglyph extends CardImpl {
private static final FilterSpell filter = new FilterSpell("a spell during their turn");
static {
filter.add(TargetController.ACTIVE.getControllerPredicate());
}
public SandswirlWanderglyph(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "");
this.subtype.add(SubType.GOLEM);
this.power = new MageInt(5);
this.toughness = new MageInt(3);
this.nightCard = true;
this.color.setWhite(true);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever an opponent casts a spell during their turn, they can't attack you or planeswalkers you control this turn.
this.addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD,
new CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect(), filter, false, SetTargetPointer.PLAYER));
// Each opponent who attacked you or a planeswalker you control this turn can't cast spells.
this.addAbility(new SimpleStaticAbility(new SandswirlWanderglyphCantCastEffect()), new PlayersAttackedThisTurnWatcher());
}
private SandswirlWanderglyph(final SandswirlWanderglyph card) {
super(card);
}
@Override
public SandswirlWanderglyph copy() {
return new SandswirlWanderglyph(this);
}
}
class SandswirlWanderglyphCantCastEffect extends ContinuousRuleModifyingEffectImpl {
SandswirlWanderglyphCantCastEffect() {
super(Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "Each opponent who attacked you or a planeswalker you control this turn can't cast spells";
}
private SandswirlWanderglyphCantCastEffect(final SandswirlWanderglyphCantCastEffect effect) {
super(effect);
}
@Override
public SandswirlWanderglyphCantCastEffect copy() {
return new SandswirlWanderglyphCantCastEffect(this);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.CAST_SPELL;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (game.isActivePlayer(event.getPlayerId()) && game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) {
PlayersAttackedThisTurnWatcher watcher = game.getState().getWatcher(PlayersAttackedThisTurnWatcher.class);
return watcher != null && watcher.hasPlayerAttackedPlayerOrControlledPlaneswalker(event.getPlayerId(), source.getControllerId());
}
return false;
}
}
class CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect extends RestrictionEffect {
CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect() {
super(Duration.EndOfTurn);
staticText = "they can't attack you or planeswalkers you control this turn";
}
private CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect(final CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect effect) {
super(effect);
}
@Override
public CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect copy() {
return new CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect(this);
}
@Override
public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game, boolean canUseChooseDialogs) {
if (game.getPlayer(defenderId) != null){
return !(source.getControllerId().equals(defenderId));
}
Permanent defender = game.getPermanent(defenderId);
if (defender != null && defender.isPlaneswalker()){
return !(source.getControllerId().equals(defender.getControllerId()));
}
return true;
}
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return permanent.getControllerId().equals(getTargetPointer().getFirst(game, source));
}
}

View file

@ -1,186 +0,0 @@
package mage.cards.t;
import mage.abilities.Ability;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
import mage.target.common.TargetOpponent;
import mage.watchers.common.CastFromGraveyardWatcher;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TheGreatWork extends CardImpl {
public TheGreatWork(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "");
this.subtype.add(SubType.SAGA);
this.color.setRed(true);
this.nightCard = true;
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
// I -- The Great Work deals 3 damage to target opponent and each creature they control.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
new TheGreatWorkEffect(), new TargetOpponent()
);
// II -- Create three Treasure tokens.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_II,
new CreateTokenEffect(new TreasureToken(), 3)
);
// III -- Until end of turn, you may cast instant and sorcery spells from any graveyard. If a spell cast this way would be put into a graveyard, exile it instead. Exile The Great Work, then return it to the battlefield.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_III, new TheGreatWorkCastFromGraveyardEffect(),
new TheGreatWorkReplacementEffect(), new ExileSourceAndReturnFaceUpEffect()
);
this.addAbility(sagaAbility, new CastFromGraveyardWatcher());
}
private TheGreatWork(final TheGreatWork card) {
super(card);
}
@Override
public TheGreatWork copy() {
return new TheGreatWork(this);
}
}
class TheGreatWorkEffect extends OneShotEffect {
TheGreatWorkEffect() {
super(Outcome.Benefit);
staticText = "{this} deals 3 damage to target opponent and each creature they control";
}
private TheGreatWorkEffect(final TheGreatWorkEffect effect) {
super(effect);
}
@Override
public TheGreatWorkEffect copy() {
return new TheGreatWorkEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player == null) {
return false;
}
player.damage(3, source, game);
for (Permanent permanent : game.getBattlefield().getActivePermanents(
StaticFilters.FILTER_CONTROLLED_CREATURE, player.getId(), source, game
)) {
permanent.damage(3, source, game);
}
return true;
}
}
class TheGreatWorkCastFromGraveyardEffect extends AsThoughEffectImpl {
TheGreatWorkCastFromGraveyardEffect() {
super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
staticText = "until end of turn, you may cast instant and sorcery spells from any graveyard";
}
private TheGreatWorkCastFromGraveyardEffect(final TheGreatWorkCastFromGraveyardEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public TheGreatWorkCastFromGraveyardEffect copy() {
return new TheGreatWorkCastFromGraveyardEffect(this);
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
Card card = game.getCard(objectId);
if (card != null
&& affectedControllerId.equals(source.getControllerId())
&& StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY.match(card, game)
&& Zone.GRAVEYARD.equals(game.getState().getZone(card.getId()))) {
game.getState().setValue("TheGreatWork", card);
return true;
}
return false;
}
}
class TheGreatWorkReplacementEffect extends ReplacementEffectImpl {
TheGreatWorkReplacementEffect() {
super(Duration.EndOfTurn, Outcome.Exile);
staticText = "if a spell cast this way would be put into a graveyard, exile it instead";
}
private TheGreatWorkReplacementEffect(final TheGreatWorkReplacementEffect effect) {
super(effect);
}
@Override
public TheGreatWorkReplacementEffect copy() {
return new TheGreatWorkReplacementEffect(this);
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
Card card = (Card) game.getState().getValue("TheGreatWork");
if (card != null) {
((ZoneChangeEvent) event).setToZone(Zone.EXILED);
}
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (Zone.GRAVEYARD != ((ZoneChangeEvent) event).getToZone()) {
return false;
}
Card card = game.getCard(event.getSourceId());
if (card == null || (!card.isInstant(game) && !card.isSorcery(game))) {
return false;
}
CastFromGraveyardWatcher watcher = game.getState().getWatcher(CastFromGraveyardWatcher.class);
return watcher != null
&& watcher.spellWasCastFromGraveyard(event.getTargetId(),
game.getState().getZoneChangeCounter(event.getTargetId()));
}
}

View file

@ -1,16 +1,21 @@
package mage.cards.u;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.common.TransformsOrEntersTriggeredAbility;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.effects.common.FightTargetSourceEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -18,28 +23,50 @@ import java.util.UUID;
/**
* @author fireshoes
*/
public final class UlrichOfTheKrallenhorde extends CardImpl {
public final class UlrichOfTheKrallenhorde extends TransformingDoubleFacedCard {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent("non-Werewolf creature you don't control");
static {
filter.add(Predicates.not(SubType.WEREWOLF.getPredicate()));
filter.add(TargetController.NOT_YOU.getControllerPredicate());
}
public UlrichOfTheKrallenhorde(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{G}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{R}{G}",
"Ulrich, Uncontested Alpha",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "RG"
);
this.secondSideCardClazz = mage.cards.u.UlrichUncontestedAlpha.class;
// Ulrich of the Krallenhorde
this.getLeftHalfCard().setPT(4, 4);
// Whenever this creature enters the battlefield or transforms into Ulrich of the Krallenhorde, target creature gets +4/+4 until end of turn.
Ability ability = new TransformsOrEntersTriggeredAbility(
new BoostTargetEffect(4, 4), false
);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// At the beginning of each upkeep, if no spells were cast last turn, transform Ulrich of the Krallenhorde.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Ulrich, Uncontested Alpha
this.getRightHalfCard().setPT(6, 6);
// Whenever this creature transforms into Ulrich, Uncontested Alpha, you may have it fight target non-Werewolf creature you don't control.
Ability ability2 = new TransformIntoSourceTriggeredAbility(
new FightTargetSourceEffect()
.setText("you may have it fight target non-Werewolf creature you don't control"),
true, true
);
ability2.addTarget(new TargetPermanent(filter));
this.getRightHalfCard().addAbility(ability2);
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Ulrich, Uncontested Alpha.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private UlrichOfTheKrallenhorde(final UlrichOfTheKrallenhorde card) {

View file

@ -1,66 +0,0 @@
package mage.cards.u;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.effects.common.FightTargetSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author fireshoes
*/
public final class UlrichUncontestedAlpha extends CardImpl {
private static final FilterCreaturePermanent filter
= new FilterCreaturePermanent("non-Werewolf creature you don't control");
static {
filter.add(Predicates.not(SubType.WEREWOLF.getPredicate()));
filter.add(TargetController.NOT_YOU.getControllerPredicate());
}
public UlrichUncontestedAlpha(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
this.color.setRed(true);
this.color.setGreen(true);
// this card is the second face of double-faced card
this.nightCard = true;
// Whenever this creature transforms into Ulrich, Uncontested Alpha, you may have it fight target non-Werewolf creature you don't control.
Ability ability = new TransformIntoSourceTriggeredAbility(
new FightTargetSourceEffect()
.setText("you may have it fight target non-Werewolf creature you don't control"),
true, true
);
ability.addTarget(new TargetPermanent(filter));
this.addAbility(ability);
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Ulrich, Uncontested Alpha.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private UlrichUncontestedAlpha(final UlrichUncontestedAlpha card) {
super(card);
}
@Override
public UlrichUncontestedAlpha copy() {
return new UlrichUncontestedAlpha(this);
}
}

View file

@ -1,48 +0,0 @@
package mage.cards.u;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
/**
* @author balazskristof
*/
public final class UltimeciaOmnipotent extends CardImpl {
public UltimeciaOmnipotent(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.NIGHTMARE);
this.subtype.add(SubType.WARLOCK);
this.power = new MageInt(7);
this.toughness = new MageInt(7);
this.color.setBlack(true);
this.color.setBlue(true);
this.nightCard = true;
// Menace
this.addAbility(new MenaceAbility());
// Time Compression -- When this creature transforms into Ultimecia, Omnipotent, take an extra turn after this one.
this.addAbility(new TransformIntoSourceTriggeredAbility(new AddExtraTurnControllerEffect()).withFlavorWord("Time Compression"));
}
private UltimeciaOmnipotent(final UltimeciaOmnipotent card) {
super(card);
}
@Override
public UltimeciaOmnipotent copy() {
return new UltimeciaOmnipotent(this);
}
}

View file

@ -1,44 +1,45 @@
package mage.cards.u;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
import mage.abilities.costs.CompositeCost;
import mage.abilities.costs.common.ExileFromGraveCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect;
import mage.abilities.effects.keyword.SurveilEffect;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.target.common.TargetCardInYourGraveyard;
import java.util.UUID;
/**
* @author balazskristof
*/
public final class UltimeciaTimeSorceress extends CardImpl {
public final class UltimeciaTimeSorceress extends TransformingDoubleFacedCard {
public UltimeciaTimeSorceress(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}{B}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.WARLOCK);
this.power = new MageInt(4);
this.toughness = new MageInt(5);
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WARLOCK}, "{3}{U}{B}",
"Ultimecia, Omnipotent",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.NIGHTMARE, SubType.WARLOCK}, "UB"
);
this.secondSideCardClazz = mage.cards.u.UltimeciaOmnipotent.class;
// Ultimecia, Time Sorceress
this.getLeftHalfCard().setPT(4, 5);
// Whenever Ultimecia enters or attacks, surveil 2.
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new SurveilEffect(2)));
this.getLeftHalfCard().addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new SurveilEffect(2)));
// At the beginning of your end step, you may pay {4}{U}{U}{B}{B} and exile eight cards from your graveyard. If you do, transform Ultimecia.
this.addAbility(new BeginningOfEndStepTriggeredAbility(new DoIfCostPaid(
this.getLeftHalfCard().addAbility(new BeginningOfEndStepTriggeredAbility(new DoIfCostPaid(
new TransformSourceEffect(),
new CompositeCost(
new ManaCostsImpl<>("{4}{U}{U}{B}{B}"),
@ -46,7 +47,15 @@ public final class UltimeciaTimeSorceress extends CardImpl {
"{4}{U}{U}{B}{B} and exile eight cards from your graveyard"
)
)));
this.addAbility(new TransformAbility());
// Ultimecia, Omnipotent
this.getRightHalfCard().setPT(7, 7);
// Menace
this.getRightHalfCard().addAbility(new MenaceAbility());
// Time Compression -- When this creature transforms into Ultimecia, Omnipotent, take an extra turn after this one.
this.getRightHalfCard().addAbility(new TransformIntoSourceTriggeredAbility(new AddExtraTurnControllerEffect()).withFlavorWord("Time Compression"));
}
private UltimeciaTimeSorceress(final UltimeciaTimeSorceress card) {

View file

@ -1,87 +0,0 @@
package mage.cards.u;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.LivingMetalAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterAttackingCreature;
import mage.game.Game;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class UltraMagnusArmoredCarrier extends CardImpl {
public UltraMagnusArmoredCarrier(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.VEHICLE);
this.power = new MageInt(4);
this.toughness = new MageInt(7);
this.color.setRed(true);
this.color.setGreen(true);
this.color.setWhite(true);
this.nightCard = true;
// Living metal
this.addAbility(new LivingMetalAbility());
// Haste
this.addAbility(HasteAbility.getInstance());
// Formidable -- Whenever Ultra Magnus attacks, attacking creatures you control gain indestructible until end of turn. If those creatures have total power 8 or greater, convert Ultra Magnus.
Ability ability = new AttacksTriggeredAbility(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_ATTACKING_CREATURES
));
ability.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), UltraMagnusArmoredCarrierCondition.instance,
"If those creatures have total power 8 or greater, convert {this}"
));
this.addAbility(ability.setAbilityWord(AbilityWord.FORMIDABLE));
}
private UltraMagnusArmoredCarrier(final UltraMagnusArmoredCarrier card) {
super(card);
}
@Override
public UltraMagnusArmoredCarrier copy() {
return new UltraMagnusArmoredCarrier(this);
}
}
enum UltraMagnusArmoredCarrierCondition implements Condition {
instance;
private static final FilterPermanent filter = new FilterAttackingCreature();
static {
filter.add(TargetController.YOU.getControllerPredicate());
}
@Override
public boolean apply(Game game, Ability source) {
return game
.getBattlefield()
.getActivePermanents(filter, source.getControllerId(), source, game)
.stream()
.map(MageObject::getPower)
.mapToInt(MageInt::getValue)
.sum() >= 8;
}
}

View file

@ -1,20 +1,26 @@
package mage.cards.u;
import mage.MageInt;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.MoreThanMeetsTheEyeAbility;
import mage.abilities.keyword.WardAbility;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.*;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterArtifactCard;
import mage.filter.common.FilterAttackingCreature;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@ -27,26 +33,46 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class UltraMagnusTactician extends CardImpl {
public final class UltraMagnusTactician extends TransformingDoubleFacedCard {
public UltraMagnusTactician(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}{R}{G}{W}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.ROBOT}, "{4}{R}{G}{W}",
"Ultra Magnus, Armored Carrier",
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.ARTIFACT}, new SubType[]{SubType.VEHICLE}, "RGW"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.ROBOT);
this.power = new MageInt(7);
this.toughness = new MageInt(7);
this.secondSideCardClazz = mage.cards.u.UltraMagnusArmoredCarrier.class;
// Ultra Magnus, Tactician
this.getLeftHalfCard().setPT(7, 7);
// More Than Meets the Eye {2}{R}{G}{W}
this.addAbility(new MoreThanMeetsTheEyeAbility(this, "{2}{R}{G}{W}"));
this.getLeftHalfCard().addAbility(new MoreThanMeetsTheEyeAbility(this, "{2}{R}{G}{W}"));
// Ward {2}
this.addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false));
this.getLeftHalfCard().addAbility(new WardAbility(new ManaCostsImpl<>("{2}"), false));
// Whenever Ultra Magnus attacks, you may put an artifact creature card from your hand onto the battlefield tapped and attacking. If you do, convert Ultra Magnus at end of combat.
this.addAbility(new AttacksTriggeredAbility(new UltraMagnusTacticianEffect()));
this.getLeftHalfCard().addAbility(new AttacksTriggeredAbility(new UltraMagnusTacticianEffect()));
// Ultra Magnus, Armored Carrier
this.getRightHalfCard().setPT(4, 7);
// Living metal
this.getRightHalfCard().addAbility(new LivingMetalAbility());
// Haste
this.getRightHalfCard().addAbility(HasteAbility.getInstance());
// Formidable -- Whenever Ultra Magnus attacks, attacking creatures you control gain indestructible until end of turn. If those creatures have total power 8 or greater, convert Ultra Magnus.
Ability ability = new AttacksTriggeredAbility(new GainAbilityControlledEffect(
IndestructibleAbility.getInstance(), Duration.EndOfTurn,
StaticFilters.FILTER_ATTACKING_CREATURES
));
ability.addEffect(new ConditionalOneShotEffect(
new TransformSourceEffect(), UltraMagnusArmoredCarrierCondition.instance,
"If those creatures have total power 8 or greater, convert {this}"
));
this.getRightHalfCard().addAbility(ability.setAbilityWord(AbilityWord.FORMIDABLE));
}
private UltraMagnusTactician(final UltraMagnusTactician card) {
@ -109,3 +135,23 @@ class UltraMagnusTacticianEffect extends OneShotEffect {
return true;
}
}
enum UltraMagnusArmoredCarrierCondition implements Condition {
instance;
private static final FilterPermanent filter = new FilterAttackingCreature();
static {
filter.add(TargetController.YOU.getControllerPredicate());
}
@Override
public boolean apply(Game game, Ability source) {
return game
.getBattlefield()
.getActivePermanents(filter, source.getControllerId(), source, game)
.stream()
.map(MageObject::getPower)
.mapToInt(MageInt::getValue)
.sum() >= 8;
}
}

View file

@ -1,43 +0,0 @@
package mage.cards.u;
import java.util.UUID;
import mage.MageInt;
import mage.Mana;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
/**
*
* @author fireshoes
*/
public final class UlvenwaldAbomination extends CardImpl {
public UlvenwaldAbomination(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"");
this.subtype.add(SubType.ELDRAZI);
this.subtype.add(SubType.WEREWOLF);
this.power = new MageInt(4);
this.toughness = new MageInt(6);
// this card is the second face of double-faced card
this.nightCard = true;
// {T}: Add {C}{C}.
this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(2), new TapSourceCost()));
}
private UlvenwaldAbomination(final UlvenwaldAbomination card) {
super(card);
}
@Override
public UlvenwaldAbomination copy() {
return new UlvenwaldAbomination(this);
}
}

View file

@ -1,63 +0,0 @@
package mage.cards.u;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class UlvenwaldBehemoth extends CardImpl {
public UlvenwaldBehemoth(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.BEAST);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(8);
this.toughness = new MageInt(8);
this.color.setGreen(true);
this.nightCard = true;
// Trample
this.addAbility(TrampleAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
// Other creatures you control get +1/+1 and have trample and haste.
Ability ability = new SimpleStaticAbility(new BoostControlledEffect(
1, 1, Duration.WhileOnBattlefield, true
));
ability.addEffect(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.WhileOnBattlefield,
StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
).setText("and have trample"));
ability.addEffect(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield,
StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
).setText("and haste"));
this.addAbility(ability);
}
private UlvenwaldBehemoth(final UlvenwaldBehemoth card) {
super(card);
}
@Override
public UlvenwaldBehemoth copy() {
return new UlvenwaldBehemoth(this);
}
}

View file

@ -1,15 +1,15 @@
package mage.cards.u;
import mage.MageInt;
import mage.Mana;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.keyword.DefenderAbility;
import mage.abilities.keyword.TransformAbility;
import mage.abilities.mana.GreenManaAbility;
import mage.cards.CardImpl;
import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
import mage.constants.Zone;
@ -19,26 +19,32 @@ import java.util.UUID;
/**
* @author fireshoes
*/
public final class UlvenwaldCaptive extends CardImpl {
public final class UlvenwaldCaptive extends TransformingDoubleFacedCard {
public UlvenwaldCaptive(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.subtype.add(SubType.WEREWOLF);
this.subtype.add(SubType.HORROR);
this.power = new MageInt(1);
this.toughness = new MageInt(2);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF, SubType.HORROR}, "{1}{G}",
"Ulvenwald Abomination",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.ELDRAZI, SubType.WEREWOLF}, ""
);
this.secondSideCardClazz = mage.cards.u.UlvenwaldAbomination.class;
// Ulvenwald Captive
this.getLeftHalfCard().setPT(1, 2);
// Defender
this.addAbility(DefenderAbility.getInstance());
this.getLeftHalfCard().addAbility(DefenderAbility.getInstance());
// {T}: Add {G}.
this.addAbility(new GreenManaAbility());
this.getLeftHalfCard().addAbility(new GreenManaAbility());
// {5}{G}{G}: Transform Ulvenwald Captive.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{G}{G}")));
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{5}{G}{G}")));
// Ulvenwald Abomination
this.getRightHalfCard().setPT(4, 6);
// {T}: Add {C}{C}.
this.getRightHalfCard().addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(2), new TapSourceCost()));
}
private UlvenwaldCaptive(final UlvenwaldCaptive card) {

View file

@ -1,10 +1,12 @@
package mage.cards.u;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.common.WerewolfFrontTriggeredAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.RegenerateSourceEffect;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.SubType;
@ -13,22 +15,29 @@ import java.util.UUID;
/**
* @author nantuko
*/
public final class UlvenwaldMystics extends CardImpl {
public final class UlvenwaldMystics extends TransformingDoubleFacedCard {
public UlvenwaldMystics(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SHAMAN);
this.subtype.add(SubType.WEREWOLF);
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SHAMAN, SubType.WEREWOLF}, "{2}{G}{G}",
"Ulvenwald Primordials",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "G"
);
this.secondSideCardClazz = mage.cards.u.UlvenwaldPrimordials.class;
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Ulvenwald Mystics
this.getLeftHalfCard().setPT(3, 3);
// At the beginning of each upkeep, if no spells were cast last turn, transform Ulvenwald Mystics.
this.addAbility(new TransformAbility());
this.addAbility(new WerewolfFrontTriggeredAbility());
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
// Ulvenwald Primordials
this.getRightHalfCard().setPT(5, 5);
// {G}: Regenerate Ulvenwald Primordials.
this.getRightHalfCard().addAbility(new SimpleActivatedAbility(new RegenerateSourceEffect(), new ManaCostsImpl<>("{G}")));
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Ulvenwald Primordials.
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
}
private UlvenwaldMystics(final UlvenwaldMystics card) {

View file

@ -1,43 +1,71 @@
package mage.cards.u;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.TransformSourceEffect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.StaticFilters;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class UlvenwaldOddity extends CardImpl {
public final class UlvenwaldOddity extends TransformingDoubleFacedCard {
public UlvenwaldOddity(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
super(ownerId, setInfo,
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BEAST}, "{2}{G}{G}",
"Ulvenwald Behemoth",
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BEAST, SubType.HORROR}, "G"
);
this.subtype.add(SubType.BEAST);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.u.UlvenwaldBehemoth.class;
// Ulvenwald Oddity
this.getLeftHalfCard().setPT(4, 4);
// Trample
this.addAbility(TrampleAbility.getInstance());
this.getLeftHalfCard().addAbility(TrampleAbility.getInstance());
// Haste
this.addAbility(HasteAbility.getInstance());
this.getLeftHalfCard().addAbility(HasteAbility.getInstance());
// {5}{G}{G}: Transform Ulvenwald Oddity.
this.addAbility(new TransformAbility());
this.addAbility(new SimpleActivatedAbility(
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(
new TransformSourceEffect(), new ManaCostsImpl<>("{5}{G}{G}")
));
// Ulvenwald Behemoth
this.getRightHalfCard().setPT(8, 8);
// Trample
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
// Haste
this.getRightHalfCard().addAbility(HasteAbility.getInstance());
// Other creatures you control get +1/+1 and have trample and haste.
Ability ability = new SimpleStaticAbility(new BoostControlledEffect(
1, 1, Duration.WhileOnBattlefield, true
));
ability.addEffect(new GainAbilityControlledEffect(
TrampleAbility.getInstance(), Duration.WhileOnBattlefield,
StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
).setText("and have trample"));
ability.addEffect(new GainAbilityControlledEffect(
HasteAbility.getInstance(), Duration.WhileOnBattlefield,
StaticFilters.FILTER_CONTROLLED_ANOTHER_CREATURE
).setText("and haste"));
this.getRightHalfCard().addAbility(ability);
}
private UlvenwaldOddity(final UlvenwaldOddity card) {

View file

@ -1,46 +0,0 @@
package mage.cards.u;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.WerewolfBackTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.RegenerateSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SubType;
import java.util.UUID;
/**
* @author nantuko
*/
public final class UlvenwaldPrimordials extends CardImpl {
public UlvenwaldPrimordials(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
this.subtype.add(SubType.WEREWOLF);
this.color.setGreen(true);
// this card is the second face of double-faced card
this.nightCard = true;
this.power = new MageInt(5);
this.toughness = new MageInt(5);
// {G}: Regenerate Ulvenwald Primordials.
this.addAbility(new SimpleActivatedAbility(new RegenerateSourceEffect(), new ManaCostsImpl<>("{G}")));
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Ulvenwald Primordials.
this.addAbility(new WerewolfBackTriggeredAbility());
}
private UlvenwaldPrimordials(final UlvenwaldPrimordials card) {
super(card);
}
@Override
public UlvenwaldPrimordials copy() {
return new UlvenwaldPrimordials(this);
}
}

View file

@ -2,42 +2,73 @@ package mage.cards.u;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.common.SpellCastOpponentTriggeredAbility;
import mage.abilities.condition.common.CastFromEverywhereSourceCondition;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.RestrictionEffect;
import mage.abilities.keyword.CraftAbility;
import mage.cards.CardImpl;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardSetInfo;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.ComparisonType;
import mage.constants.Outcome;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.FilterSpell;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.filter.predicate.permanent.ControllerIdPredicate;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.watchers.common.PlayersAttackedThisTurnWatcher;
import java.util.UUID;
/**
* @author notgreat
*/
public final class UnstableGlyphbridge extends CardImpl {
public final class UnstableGlyphbridge extends TransformingDoubleFacedCard {
private static final FilterSpell filter = new FilterSpell("a spell during their turn");
static {
filter.add(TargetController.ACTIVE.getControllerPredicate());
}
public UnstableGlyphbridge(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}{W}{W}");
this.secondSideCardClazz = mage.cards.s.SandswirlWanderglyph.class;
super(ownerId, setInfo,
new CardType[]{CardType.ARTIFACT}, new SubType[]{}, "{3}{W}{W}",
"Sandswirl Wanderglyph",
new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, new SubType[]{SubType.GOLEM}, "W"
);
// Unstable Glyphbridge
// When Unstable Glyphbridge enters the battlefield, if you cast it, for each player, choose a creature with power 2 or less that player controls. Then destroy all creatures except creatures chosen this way.
this.addAbility(new EntersBattlefieldTriggeredAbility(new UnstableGlyphbridgeEffect())
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new UnstableGlyphbridgeEffect())
.withInterveningIf(CastFromEverywhereSourceCondition.instance));
// Craft with artifact {3}{W}{W}
this.addAbility(new CraftAbility("{3}{W}{W}"));
this.getLeftHalfCard().addAbility(new CraftAbility("{3}{W}{W}"));
// Sandswirl Wanderglyph
this.getRightHalfCard().setPT(5, 3);
// Flying
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
// Whenever an opponent casts a spell during their turn, they can't attack you or planeswalkers you control this turn.
this.getRightHalfCard().addAbility(new SpellCastOpponentTriggeredAbility(Zone.BATTLEFIELD,
new CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect(), filter, false, SetTargetPointer.PLAYER));
// Each opponent who attacked you or a planeswalker you control this turn can't cast spells.
Ability ability = new SimpleStaticAbility(new SandswirlWanderglyphCantCastEffect());
ability.addWatcher(new PlayersAttackedThisTurnWatcher());
this.getRightHalfCard().addAbility(ability);
}
private UnstableGlyphbridge(final UnstableGlyphbridge card) {
@ -97,3 +128,68 @@ class UnstableGlyphbridgeEffect extends OneShotEffect {
return true;
}
}
class SandswirlWanderglyphCantCastEffect extends ContinuousRuleModifyingEffectImpl {
SandswirlWanderglyphCantCastEffect() {
super(Duration.WhileOnBattlefield, Outcome.Benefit);
staticText = "Each opponent who attacked you or a planeswalker you control this turn can't cast spells";
}
private SandswirlWanderglyphCantCastEffect(final SandswirlWanderglyphCantCastEffect effect) {
super(effect);
}
@Override
public SandswirlWanderglyphCantCastEffect copy() {
return new SandswirlWanderglyphCantCastEffect(this);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.CAST_SPELL;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (game.isActivePlayer(event.getPlayerId()) && game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) {
PlayersAttackedThisTurnWatcher watcher = game.getState().getWatcher(PlayersAttackedThisTurnWatcher.class);
return watcher != null && watcher.hasPlayerAttackedPlayerOrControlledPlaneswalker(event.getPlayerId(), source.getControllerId());
}
return false;
}
}
class CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect extends RestrictionEffect {
CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect() {
super(Duration.EndOfTurn);
staticText = "they can't attack you or planeswalkers you control this turn";
}
private CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect(final CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect effect) {
super(effect);
}
@Override
public CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect copy() {
return new CantAttackSourcePlayerOrPlaneswalkerThisTurnEffect(this);
}
@Override
public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game, boolean canUseChooseDialogs) {
if (game.getPlayer(defenderId) != null) {
return !(source.getControllerId().equals(defenderId));
}
Permanent defender = game.getPermanent(defenderId);
if (defender != null && defender.isPlaneswalker()) {
return !(source.getControllerId().equals(defender.getControllerId()));
}
return true;
}
@Override
public boolean applies(Permanent permanent, Ability source, Game game) {
return permanent.getControllerId().equals(getTargetPointer().getFirst(game, source));
}
}

View file

@ -1,23 +1,34 @@
package mage.cards.u;
import mage.MageInt;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.common.SagaAbility;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.condition.Condition;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.effects.AsThoughEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
import mage.abilities.effects.common.ExileSourceAndReturnFaceUpEffect;
import mage.abilities.effects.mana.BasicManaEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.Card;
import mage.cards.CardSetInfo;
import mage.cards.TransformingDoubleFacedCard;
import mage.constants.*;
import mage.filter.StaticFilters;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.TreasureToken;
import mage.players.Player;
import mage.target.common.TargetOpponent;
import mage.watchers.common.CastFromGraveyardWatcher;
import mage.watchers.common.SpellsCastWatcher;
import java.util.Objects;
@ -26,20 +37,20 @@ import java.util.UUID;
/**
* @author TheElk801
*/
public final class Urabrask extends CardImpl {
public final class Urabrask extends TransformingDoubleFacedCard {
public Urabrask(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}{R}");
super(ownerId, setInfo,
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.PRAETOR}, "{2}{R}{R}",
"The Great Work",
new SuperType[]{}, new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.SAGA}, "R"
);
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.PHYREXIAN);
this.subtype.add(SubType.PRAETOR);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
this.secondSideCardClazz = mage.cards.t.TheGreatWork.class;
// Urabrask
this.getLeftHalfCard().setPT(4, 4);
// First strike
this.addAbility(FirstStrikeAbility.getInstance());
this.getLeftHalfCard().addAbility(FirstStrikeAbility.getInstance());
// Whenever you cast an instant or sorcery spell, Urabrask deals 1 damage to target opponent. Add {R}.
Ability ability = new SpellCastControllerTriggeredAbility(
@ -47,14 +58,37 @@ public final class Urabrask extends CardImpl {
);
ability.addEffect(new BasicManaEffect(Mana.RedMana(1)));
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
this.getLeftHalfCard().addAbility(ability);
// {R}: Exile Urabrask, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery and only if you've cast three or more instant and/or sorcery spells this turn.
this.addAbility(new TransformAbility());
this.addAbility(new ActivateIfConditionActivatedAbility(
this.getLeftHalfCard().addAbility(new ActivateIfConditionActivatedAbility(
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED),
new ManaCostsImpl<>("{R}"), UrabraskCondition.instance
).setTiming(TimingRule.SORCERY));
// The Great Work
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this.getRightHalfCard());
// I -- The Great Work deals 3 damage to target opponent and each creature they control.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
new TheGreatWorkEffect(), new TargetOpponent()
);
// II -- Create three Treasure tokens.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_II,
new CreateTokenEffect(new TreasureToken(), 3)
);
// III -- Until end of turn, you may cast instant and sorcery spells from any graveyard. If a spell cast this way would be put into a graveyard, exile it instead. Exile The Great Work, then return it to the battlefield.
sagaAbility.addChapterEffect(
this.getRightHalfCard(), SagaChapter.CHAPTER_III, new TheGreatWorkCastFromGraveyardEffect(),
new TheGreatWorkReplacementEffect(), new ExileSourceAndReturnFaceUpEffect()
);
sagaAbility.addWatcher(new CastFromGraveyardWatcher());
this.getRightHalfCard().addAbility(sagaAbility);
}
private Urabrask(final Urabrask card) {
@ -87,3 +121,120 @@ enum UrabraskCondition implements Condition {
return "if you've cast three or more instant and/or sorcery spells this turn";
}
}
class TheGreatWorkEffect extends OneShotEffect {
TheGreatWorkEffect() {
super(Outcome.Benefit);
staticText = "{this} deals 3 damage to target opponent and each creature they control";
}
private TheGreatWorkEffect(final TheGreatWorkEffect effect) {
super(effect);
}
@Override
public TheGreatWorkEffect copy() {
return new TheGreatWorkEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (player == null) {
return false;
}
player.damage(3, source, game);
for (Permanent permanent : game.getBattlefield().getActivePermanents(
StaticFilters.FILTER_CONTROLLED_CREATURE, player.getId(), source, game
)) {
permanent.damage(3, source, game);
}
return true;
}
}
class TheGreatWorkCastFromGraveyardEffect extends AsThoughEffectImpl {
TheGreatWorkCastFromGraveyardEffect() {
super(AsThoughEffectType.CAST_FROM_NOT_OWN_HAND_ZONE, Duration.EndOfTurn, Outcome.Benefit);
staticText = "until end of turn, you may cast instant and sorcery spells from any graveyard";
}
private TheGreatWorkCastFromGraveyardEffect(final TheGreatWorkCastFromGraveyardEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public TheGreatWorkCastFromGraveyardEffect copy() {
return new TheGreatWorkCastFromGraveyardEffect(this);
}
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
Card card = game.getCard(objectId);
if (card != null
&& affectedControllerId.equals(source.getControllerId())
&& StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY.match(card, game)
&& Zone.GRAVEYARD.equals(game.getState().getZone(card.getId()))) {
game.getState().setValue("TheGreatWork", card);
return true;
}
return false;
}
}
class TheGreatWorkReplacementEffect extends ReplacementEffectImpl {
TheGreatWorkReplacementEffect() {
super(Duration.EndOfTurn, Outcome.Exile);
staticText = "if a spell cast this way would be put into a graveyard, exile it instead";
}
private TheGreatWorkReplacementEffect(final TheGreatWorkReplacementEffect effect) {
super(effect);
}
@Override
public TheGreatWorkReplacementEffect copy() {
return new TheGreatWorkReplacementEffect(this);
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
Card card = (Card) game.getState().getValue("TheGreatWork");
if (card != null) {
((ZoneChangeEvent) event).setToZone(Zone.EXILED);
}
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (Zone.GRAVEYARD != ((ZoneChangeEvent) event).getToZone()) {
return false;
}
Card card = game.getCard(event.getSourceId());
if (card == null || (!card.isInstant(game) && !card.isSorcery(game))) {
return false;
}
CastFromGraveyardWatcher watcher = game.getState().getWatcher(CastFromGraveyardWatcher.class);
return watcher != null
&& watcher.spellWasCastFromGraveyard(event.getTargetId(),
game.getState().getZoneChangeCounter(event.getTargetId()));
}
}

View file

@ -235,8 +235,6 @@ public final class EldritchMoon extends ExpansionSet {
cards.add(new SetCardInfo("Tree of Perdition", 109, Rarity.MYTHIC, mage.cards.t.TreeOfPerdition.class));
cards.add(new SetCardInfo("Turn Aside", 78, Rarity.COMMON, mage.cards.t.TurnAside.class));
cards.add(new SetCardInfo("Ulrich of the Krallenhorde", 191, Rarity.MYTHIC, mage.cards.u.UlrichOfTheKrallenhorde.class));
cards.add(new SetCardInfo("Ulrich, Uncontested Alpha", 191, Rarity.MYTHIC, mage.cards.u.UlrichUncontestedAlpha.class));
cards.add(new SetCardInfo("Ulvenwald Abomination", 175, Rarity.COMMON, mage.cards.u.UlvenwaldAbomination.class));
cards.add(new SetCardInfo("Ulvenwald Captive", 175, Rarity.COMMON, mage.cards.u.UlvenwaldCaptive.class));
cards.add(new SetCardInfo("Ulvenwald Observer", 176, Rarity.RARE, mage.cards.u.UlvenwaldObserver.class));
cards.add(new SetCardInfo("Unsubstantiate", 79, Rarity.UNCOMMON, mage.cards.u.Unsubstantiate.class));

View file

@ -88,7 +88,6 @@ public class EldritchMoonPromos extends ExpansionSet {
cards.add(new SetCardInfo("Thalia, Heretic Cathar", 46, Rarity.RARE, mage.cards.t.ThaliaHereticCathar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thalia, Heretic Cathar", "46s", Rarity.RARE, mage.cards.t.ThaliaHereticCathar.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Tree of Perdition", "109s", Rarity.MYTHIC, mage.cards.t.TreeOfPerdition.class));
cards.add(new SetCardInfo("Ulrich, Uncontested Alpha", "191s", Rarity.MYTHIC, mage.cards.u.UlrichUncontestedAlpha.class));
cards.add(new SetCardInfo("Ulrich of the Krallenhorde", "191s", Rarity.MYTHIC, mage.cards.u.UlrichOfTheKrallenhorde.class));
cards.add(new SetCardInfo("Ulvenwald Observer", 176, Rarity.RARE, mage.cards.u.UlvenwaldObserver.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulvenwald Observer", "176s", Rarity.RARE, mage.cards.u.UlvenwaldObserver.class, NON_FULL_USE_VARIOUS));

View file

@ -560,8 +560,6 @@ public final class FinalFantasy extends ExpansionSet {
cards.add(new SetCardInfo("Ultima, Origin of Oblivion", 2, Rarity.RARE, mage.cards.u.UltimaOriginOfOblivion.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ultima, Origin of Oblivion", 324, Rarity.RARE, mage.cards.u.UltimaOriginOfOblivion.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ultima, Origin of Oblivion", 421, Rarity.RARE, mage.cards.u.UltimaOriginOfOblivion.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ultimecia, Omnipotent", 247, Rarity.UNCOMMON, mage.cards.u.UltimeciaOmnipotent.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ultimecia, Omnipotent", 513, Rarity.UNCOMMON, mage.cards.u.UltimeciaOmnipotent.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ultimecia, Temporal Threat", 441, Rarity.RARE, mage.cards.u.UltimeciaTemporalThreat.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ultimecia, Temporal Threat", 556, Rarity.RARE, mage.cards.u.UltimeciaTemporalThreat.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ultimecia, Time Sorceress", 247, Rarity.UNCOMMON, mage.cards.u.UltimeciaTimeSorceress.class, NON_FULL_USE_VARIOUS));

View file

@ -281,7 +281,6 @@ public final class Innistrad extends ExpansionSet {
cards.add(new SetCardInfo("Tribute to Hunger", 119, Rarity.UNCOMMON, mage.cards.t.TributeToHunger.class));
cards.add(new SetCardInfo("Typhoid Rats", 120, Rarity.COMMON, mage.cards.t.TyphoidRats.class));
cards.add(new SetCardInfo("Ulvenwald Mystics", 208, Rarity.UNCOMMON, mage.cards.u.UlvenwaldMystics.class));
cards.add(new SetCardInfo("Ulvenwald Primordials", 208, Rarity.UNCOMMON, mage.cards.u.UlvenwaldPrimordials.class));
cards.add(new SetCardInfo("Unbreathing Horde", 121, Rarity.RARE, mage.cards.u.UnbreathingHorde.class));
cards.add(new SetCardInfo("Unburial Rites", 122, Rarity.UNCOMMON, mage.cards.u.UnburialRites.class));
cards.add(new SetCardInfo("Undead Alchemist", 84, Rarity.RARE, mage.cards.u.UndeadAlchemist.class));

View file

@ -411,8 +411,6 @@ public final class InnistradCrimsonVow extends ExpansionSet {
cards.add(new SetCardInfo("Toxrill, the Corrosive", 321, Rarity.MYTHIC, mage.cards.t.ToxrillTheCorrosive.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Traveling Minister", 39, Rarity.COMMON, mage.cards.t.TravelingMinister.class));
cards.add(new SetCardInfo("Twinblade Geist", 40, Rarity.UNCOMMON, mage.cards.t.TwinbladeGeist.class));
cards.add(new SetCardInfo("Ulvenwald Behemoth", 225, Rarity.RARE, mage.cards.u.UlvenwaldBehemoth.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulvenwald Behemoth", 394, Rarity.RARE, mage.cards.u.UlvenwaldBehemoth.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulvenwald Oddity", 225, Rarity.RARE, mage.cards.u.UlvenwaldOddity.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Ulvenwald Oddity", 394, Rarity.RARE, mage.cards.u.UlvenwaldOddity.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Undead Butler", 133, Rarity.UNCOMMON, mage.cards.u.UndeadButler.class));

View file

@ -517,7 +517,6 @@ public final class InnistradDoubleFeature extends ExpansionSet {
cards.add(new SetCardInfo("Triskaidekaphile", 81, Rarity.RARE, mage.cards.t.Triskaidekaphile.class));
cards.add(new SetCardInfo("Turn the Earth", 205, Rarity.UNCOMMON, mage.cards.t.TurnTheEarth.class));
cards.add(new SetCardInfo("Twinblade Geist", 307, Rarity.UNCOMMON, mage.cards.t.TwinbladeGeist.class));
cards.add(new SetCardInfo("Ulvenwald Behemoth", 492, Rarity.RARE, mage.cards.u.UlvenwaldBehemoth.class));
cards.add(new SetCardInfo("Ulvenwald Oddity", 492, Rarity.RARE, mage.cards.u.UlvenwaldOddity.class));
cards.add(new SetCardInfo("Unblinking Observer", 82, Rarity.COMMON, mage.cards.u.UnblinkingObserver.class));
cards.add(new SetCardInfo("Undead Butler", 400, Rarity.UNCOMMON, mage.cards.u.UndeadButler.class));

View file

@ -2890,7 +2890,6 @@ public class MagicOnlinePromos extends ExpansionSet {
cards.add(new SetCardInfo("Uktabi Orangutan", 36016, Rarity.UNCOMMON, mage.cards.u.UktabiOrangutan.class, RETRO_ART));
cards.add(new SetCardInfo("Ulamog, the Infinite Gyre", 102345, Rarity.MYTHIC, mage.cards.u.UlamogTheInfiniteGyre.class));
cards.add(new SetCardInfo("Ultimate Price", 58269, Rarity.UNCOMMON, mage.cards.u.UltimatePrice.class));
cards.add(new SetCardInfo("Ulvenwald Behemoth", 95421, Rarity.RARE, mage.cards.u.UlvenwaldBehemoth.class));
cards.add(new SetCardInfo("Ulvenwald Observer", 61553, Rarity.RARE, mage.cards.u.UlvenwaldObserver.class));
cards.add(new SetCardInfo("Ulvenwald Oddity", 95421, Rarity.RARE, mage.cards.u.UlvenwaldOddity.class));
cards.add(new SetCardInfo("Umezawa's Jitte", 36210, Rarity.RARE, mage.cards.u.UmezawasJitte.class));

View file

@ -382,9 +382,6 @@ public final class MarchOfTheMachine extends ExpansionSet {
cards.add(new SetCardInfo("The Grand Evolution", 213, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Grand Evolution", 301, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Grand Evolution", 342, Rarity.MYTHIC, mage.cards.t.TheGrandEvolution.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 169, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 299, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("The Great Work", 341, Rarity.MYTHIC, mage.cards.t.TheGreatWork.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Thornwood Falls", 274, Rarity.COMMON, mage.cards.t.ThornwoodFalls.class));
cards.add(new SetCardInfo("Thrashing Frontliner", 167, Rarity.COMMON, mage.cards.t.ThrashingFrontliner.class));
cards.add(new SetCardInfo("Thunderhead Squadron", 81, Rarity.COMMON, mage.cards.t.ThunderheadSquadron.class));

View file

@ -307,8 +307,6 @@ public class ShadowsOverInnistradRemastered extends ExpansionSet {
cards.add(new SetCardInfo("True-Faith Censer", 262, Rarity.COMMON, mage.cards.t.TrueFaithCenser.class));
cards.add(new SetCardInfo("Ulrich of the Krallenhorde", 246, Rarity.RARE, mage.cards.u.UlrichOfTheKrallenhorde.class));
cards.add(new SetCardInfo("Ulrich's Kindred", 182, Rarity.UNCOMMON, mage.cards.u.UlrichsKindred.class));
cards.add(new SetCardInfo("Ulrich, Uncontested Alpha", 246, Rarity.RARE, mage.cards.u.UlrichUncontestedAlpha.class));
cards.add(new SetCardInfo("Ulvenwald Abomination", 221, Rarity.COMMON, mage.cards.u.UlvenwaldAbomination.class));
cards.add(new SetCardInfo("Ulvenwald Captive", 221, Rarity.COMMON, mage.cards.u.UlvenwaldCaptive.class));
cards.add(new SetCardInfo("Ulvenwald Hydra", 222, Rarity.RARE, mage.cards.u.UlvenwaldHydra.class));
cards.add(new SetCardInfo("Ulvenwald Mysteries", 223, Rarity.UNCOMMON, mage.cards.u.UlvenwaldMysteries.class));

View file

@ -341,8 +341,6 @@ public final class TheLostCavernsOfIxalan extends ExpansionSet {
cards.add(new SetCardInfo("Saheeli's Lattice", 164, Rarity.UNCOMMON, mage.cards.s.SaheelisLattice.class));
cards.add(new SetCardInfo("Saheeli, the Sun's Brilliance", 239, Rarity.MYTHIC, mage.cards.s.SaheeliTheSunsBrilliance.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Saheeli, the Sun's Brilliance", 308, Rarity.MYTHIC, mage.cards.s.SaheeliTheSunsBrilliance.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sandswirl Wanderglyph", 358, Rarity.RARE, mage.cards.s.SandswirlWanderglyph.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sandswirl Wanderglyph", 41, Rarity.RARE, mage.cards.s.SandswirlWanderglyph.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sanguine Evangelist", 34, Rarity.RARE, mage.cards.s.SanguineEvangelist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Sanguine Evangelist", 356, Rarity.RARE, mage.cards.s.SanguineEvangelist.class, NON_FULL_USE_VARIOUS));
cards.add(new SetCardInfo("Scampering Surveyor", 260, Rarity.UNCOMMON, mage.cards.s.ScamperingSurveyor.class));

View file

@ -31,7 +31,6 @@ public final class Transformers extends ExpansionSet {
cards.add(new SetCardInfo("Ratchet, Field Medic", 2, Rarity.MYTHIC, mage.cards.r.RatchetFieldMedic.class));
cards.add(new SetCardInfo("Slicer, Hired Muscle", 6, Rarity.MYTHIC, mage.cards.s.SlicerHiredMuscle.class));
cards.add(new SetCardInfo("Starscream, Power Hungry", 5, Rarity.MYTHIC, mage.cards.s.StarscreamPowerHungry.class));
cards.add(new SetCardInfo("Ultra Magnus, Armored Carrier", 15, Rarity.MYTHIC, mage.cards.u.UltraMagnusArmoredCarrier.class));
cards.add(new SetCardInfo("Ultra Magnus, Tactician", 15, Rarity.MYTHIC, mage.cards.u.UltraMagnusTactician.class));
}
}