[FIN] Implement Kuja, Genome Sorcerer / Trance Kuja, Fate Defied and Y'shtola Rhul (#13623)

* [FIN] Implement Kuja, Genome Sorcerer / Trance Kuja, Fate Defied

* [FIN] Implement Y'shtola Rhul

* removed new effect class and condition, added hint
This commit is contained in:
Balázs Kristóf 2025-05-15 04:05:42 +02:00 committed by GitHub
parent 82bdbf2445
commit 75f785f313
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 241 additions and 9 deletions

View file

@ -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 {

View file

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

View file

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

View file

@ -12,8 +12,7 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType;
/**
*
* @author anonymous
* @author balazskristof
*/
public final class UltimeciaOmnipotent extends CardImpl {

View file

@ -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 {

View file

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

View file

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