diff --git a/Mage.Sets/src/mage/cards/b/BlackMagesRod.java b/Mage.Sets/src/mage/cards/b/BlackMagesRod.java index bbb3a5a7016..3cc617bcaf4 100644 --- a/Mage.Sets/src/mage/cards/b/BlackMagesRod.java +++ b/Mage.Sets/src/mage/cards/b/BlackMagesRod.java @@ -3,11 +3,9 @@ package mage.cards.b; import java.util.UUID; import mage.abilities.Ability; -import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.common.DamagePlayersEffect; -import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.continuous.AddCardSubtypeAttachedEffect; import mage.abilities.effects.common.continuous.BoostEquippedEffect; import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; @@ -22,8 +20,7 @@ import mage.constants.TargetController; import mage.filter.StaticFilters; /** - * - * @author anonymous + * @author balazskristof */ public final class BlackMagesRod extends CardImpl { diff --git a/Mage.Sets/src/mage/cards/k/KujaGenomeSorcerer.java b/Mage.Sets/src/mage/cards/k/KujaGenomeSorcerer.java new file mode 100644 index 00000000000..6784c390e47 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KujaGenomeSorcerer.java @@ -0,0 +1,69 @@ +package mage.cards.k; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.TransformSourceEffect; +import mage.abilities.hint.ConditionHint; +import mage.abilities.hint.Hint; +import mage.abilities.hint.ValueHint; +import mage.abilities.keyword.TransformAbility; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledPermanent; +import mage.game.permanent.token.BlackWizardToken; + +/** + * @author balazskristof + */ +public final class KujaGenomeSorcerer extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent(SubType.WIZARD); + private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, ComparisonType.OR_GREATER, 4); + private static final Hint hint = new ValueHint("Wizards you control", new PermanentsOnBattlefieldCount(filter)); + + public KujaGenomeSorcerer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{R}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.MUTANT); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + this.secondSideCardClazz = mage.cards.t.TranceKujaFateDefied.class; + + // At the beginning of your end step, create a tapped 0/1 black Wizard creature token with "Whenever you cast a noncreature spell, this token deals 1 damage to each opponent.", Then if you control four or more Wizards, transform Kuja. + Ability ability = new BeginningOfEndStepTriggeredAbility( + new CreateTokenEffect(new BlackWizardToken(), 1, true) + ); + ability.addEffect(new ConditionalOneShotEffect( + new TransformSourceEffect(), + condition, + "if you control four or more Wizards, transform {this}" + ).concatBy("Then")); + ability.addHint(hint); + this.addAbility(ability); + this.addAbility(new TransformAbility()); + } + + private KujaGenomeSorcerer(final KujaGenomeSorcerer card) { + super(card); + } + + @Override + public KujaGenomeSorcerer copy() { + return new KujaGenomeSorcerer(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TranceKujaFateDefied.java b/Mage.Sets/src/mage/cards/t/TranceKujaFateDefied.java new file mode 100644 index 00000000000..c16551c9f7d --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TranceKujaFateDefied.java @@ -0,0 +1,84 @@ +package mage.cards.t; + +import java.util.Optional; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.util.CardUtil; + +/** + * @author balazskristof + */ +public final class TranceKujaFateDefied extends CardImpl { + + public TranceKujaFateDefied(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, ""); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.AVATAR); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(4); + this.toughness = new MageInt(6); + + this.color.setBlack(true); + this.color.setRed(true); + + this.nightCard = true; + + // Flame Star -- If a Wizard you control would deal damage to a permanent or player, it deals double that damage instead. + this.addAbility(new SimpleStaticAbility(new TranceKujaFateDefiedEffect()).withFlavorWord("Flame Star")); + } + + private TranceKujaFateDefied(final TranceKujaFateDefied card) { + super(card); + } + + @Override + public TranceKujaFateDefied copy() { + return new TranceKujaFateDefied(this); + } +} + +class TranceKujaFateDefiedEffect extends ReplacementEffectImpl { + + TranceKujaFateDefiedEffect() { + super(Duration.WhileOnBattlefield, Outcome.Damage); + staticText = "If a Wizard you control would deal damage to a permanent or player, it deals double that damage instead."; + } + + private TranceKujaFateDefiedEffect(final TranceKujaFateDefiedEffect effect) { + super(effect); + } + + @Override + public TranceKujaFateDefiedEffect copy() { + return new TranceKujaFateDefiedEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType().equals(GameEvent.EventType.DAMAGE_PLAYER) + || event.getType().equals(GameEvent.EventType.DAMAGE_PERMANENT); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return game.getControllerId(event.getSourceId()).equals(source.getControllerId()) + && Optional.ofNullable(game.getObject(event.getSourceId())) + .map(object -> object.hasSubtype(SubType.WIZARD, game)) + .orElse(false); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + event.setAmount(CardUtil.overflowMultiply(event.getAmount(), 2)); + return false; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/u/UltimeciaOmnipotent.java b/Mage.Sets/src/mage/cards/u/UltimeciaOmnipotent.java index cac738f61b4..db51fd3f13d 100644 --- a/Mage.Sets/src/mage/cards/u/UltimeciaOmnipotent.java +++ b/Mage.Sets/src/mage/cards/u/UltimeciaOmnipotent.java @@ -12,8 +12,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; /** - * - * @author anonymous + * @author balazskristof */ public final class UltimeciaOmnipotent extends CardImpl { diff --git a/Mage.Sets/src/mage/cards/u/UltimeciaTimeSorceress.java b/Mage.Sets/src/mage/cards/u/UltimeciaTimeSorceress.java index 6dc1fc8c1ad..539ac995609 100644 --- a/Mage.Sets/src/mage/cards/u/UltimeciaTimeSorceress.java +++ b/Mage.Sets/src/mage/cards/u/UltimeciaTimeSorceress.java @@ -5,7 +5,6 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility; import mage.abilities.costs.CompositeCost; import mage.abilities.costs.common.ExileFromGraveCost; -import mage.abilities.costs.common.ExileXFromYourGraveCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.TransformSourceEffect; @@ -20,8 +19,7 @@ import mage.constants.CardType; import mage.target.common.TargetCardInYourGraveyard; /** - * - * @author anonymous + * @author balazskristof */ public final class UltimeciaTimeSorceress extends CardImpl { diff --git a/Mage.Sets/src/mage/cards/y/YshtolaRhul.java b/Mage.Sets/src/mage/cards/y/YshtolaRhul.java new file mode 100644 index 00000000000..2083b4ed242 --- /dev/null +++ b/Mage.Sets/src/mage/cards/y/YshtolaRhul.java @@ -0,0 +1,74 @@ +package mage.cards.y; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileThenReturnTargetEffect; +import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TurnPhase; +import mage.game.Game; +import mage.game.turn.TurnMod; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; + +/** + * @author balazskristof + */ +public final class YshtolaRhul extends CardImpl { + + public YshtolaRhul(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{U}{U}"); + + this.supertype.add(SuperType.LEGENDARY); + this.subtype.add(SubType.CAT); + this.subtype.add(SubType.DRUID); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // At the beginning of your end step, exile target creature you control, then return it to the battlefield under its owner's control. Then if it's the first end step of the turn, there is an additional end step after this step. + Ability ability = new BeginningOfEndStepTriggeredAbility(new ExileThenReturnTargetEffect(true, false)); + ability.addTarget(new TargetControlledCreaturePermanent()); + ability.addEffect(new YshtolaRhulEffect().concatBy("Then")); + this.addAbility(ability); + } + + private YshtolaRhul(final YshtolaRhul card) { + super(card); + } + + @Override + public YshtolaRhul copy() { + return new YshtolaRhul(this); + } +} + +class YshtolaRhulEffect extends OneShotEffect { + public YshtolaRhulEffect() { + super(Outcome.Benefit); + staticText = "if it's the first end step of the turn, there is an additional end step after this step"; + } + + protected YshtolaRhulEffect(final YshtolaRhulEffect effect) { + super(effect); + } + + @Override + public YshtolaRhulEffect copy() { + return new YshtolaRhulEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + if (game.getTurn().getPhase(TurnPhase.END).getCount() == 0) { + TurnMod end = new TurnMod(game.getState().getActivePlayerId()).withExtraPhase(TurnPhase.END); + game.getState().getTurnMods().add(end); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/FinalFantasy.java b/Mage.Sets/src/mage/sets/FinalFantasy.java index 7766bd04734..21643946e7f 100644 --- a/Mage.Sets/src/mage/sets/FinalFantasy.java +++ b/Mage.Sets/src/mage/sets/FinalFantasy.java @@ -147,6 +147,10 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Judgment Bolt", 559, Rarity.RARE, mage.cards.j.JudgmentBolt.class)); cards.add(new SetCardInfo("Jumbo Cactuar", 191, Rarity.RARE, mage.cards.j.JumboCactuar.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Jumbo Cactuar", 343, Rarity.RARE, mage.cards.j.JumboCactuar.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kuja, Genome Sorcerer", 232, Rarity.RARE, mage.cards.k.KujaGenomeSorcerer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kuja, Genome Sorcerer", 399, Rarity.RARE, mage.cards.k.KujaGenomeSorcerer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kuja, Genome Sorcerer", 497, Rarity.RARE, mage.cards.k.KujaGenomeSorcerer.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Kuja, Genome Sorcerer", 544, Rarity.RARE, mage.cards.k.KujaGenomeSorcerer.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Laughing Mad", 143, Rarity.COMMON, mage.cards.l.LaughingMad.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Laughing Mad", 585, Rarity.COMMON, mage.cards.l.LaughingMad.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Lightning, Security Sergeant", 462, Rarity.RARE, mage.cards.l.LightningSecuritySergeant.class, NON_FULL_USE_VARIOUS)); @@ -246,6 +250,10 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("Tifa Lockhart", 536, Rarity.RARE, mage.cards.t.TifaLockhart.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Tonberry", 122, Rarity.UNCOMMON, mage.cards.t.Tonberry.class)); cards.add(new SetCardInfo("Town Greeter", 209, Rarity.COMMON, mage.cards.t.TownGreeter.class)); + cards.add(new SetCardInfo("Trance Kuja, Fate Defied", 232, Rarity.RARE, mage.cards.t.TranceKujaFateDefied.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Trance Kuja, Fate Defied", 399, Rarity.RARE, mage.cards.t.TranceKujaFateDefied.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Trance Kuja, Fate Defied", 497, Rarity.RARE, mage.cards.t.TranceKujaFateDefied.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Trance Kuja, Fate Defied", 544, Rarity.RARE, mage.cards.t.TranceKujaFateDefied.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Traveling Chocobo", "551a", Rarity.MYTHIC, mage.cards.t.TravelingChocobo.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Traveling Chocobo", "551b", Rarity.MYTHIC, mage.cards.t.TravelingChocobo.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Traveling Chocobo", "551c", Rarity.MYTHIC, mage.cards.t.TravelingChocobo.class, NON_FULL_USE_VARIOUS)); @@ -276,6 +284,9 @@ public final class FinalFantasy extends ExpansionSet { cards.add(new SetCardInfo("White Mage's Staff", 42, Rarity.COMMON, mage.cards.w.WhiteMagesStaff.class)); cards.add(new SetCardInfo("Xande, Dark Mage", 516, Rarity.RARE, mage.cards.x.XandeDarkMage.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Xande, Dark Mage", 561, Rarity.RARE, mage.cards.x.XandeDarkMage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Y'shtola Rhul", 86, Rarity.MYTHIC, mage.cards.y.YshtolaRhul.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Y'shtola Rhul", 443, Rarity.MYTHIC, mage.cards.y.YshtolaRhul.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Y'shtola Rhul", 577, Rarity.MYTHIC, mage.cards.y.YshtolaRhul.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Zanarkand, Ancient Metropolis", 293, Rarity.RARE, mage.cards.z.ZanarkandAncientMetropolis.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Zanarkand, Ancient Metropolis", 314, Rarity.RARE, mage.cards.z.ZanarkandAncientMetropolis.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Zell Dincht", 170, Rarity.RARE, mage.cards.z.ZellDincht.class, NON_FULL_USE_VARIOUS));