diff --git a/Mage.Sets/src/mage/cards/m/MythosOfIlluna.java b/Mage.Sets/src/mage/cards/m/MythosOfIlluna.java new file mode 100644 index 0000000000..887c45b628 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MythosOfIlluna.java @@ -0,0 +1,108 @@ +package mage.cards.m; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.CompoundCondition; +import mage.abilities.condition.Condition; +import mage.abilities.condition.common.ManaWasSpentCondition; +import mage.abilities.decorator.ConditionalInterveningIfTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenCopyTargetEffect; +import mage.abilities.effects.common.FightTargetSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ColoredManaSymbol; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; +import mage.watchers.common.ManaSpentToCastWatcher; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class MythosOfIlluna extends CardImpl { + + public MythosOfIlluna(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{U}{U}"); + + // Create a token that's a copy of target permanent. If {R}{G} was spent to cast this spell, instead create a token that's a copy of that permanent, except the token has "When this permanent enters the battlefield, if it's a creature, it fights up to one target creature you don't control." + this.getSpellAbility().addEffect(new MythosOfIllunaEffect()); + this.getSpellAbility().addTarget(new TargetPermanent()); + this.getSpellAbility().addWatcher(new ManaSpentToCastWatcher()); + } + + private MythosOfIlluna(final MythosOfIlluna card) { + super(card); + } + + @Override + public MythosOfIlluna copy() { + return new MythosOfIlluna(this); + } +} + +class MythosOfIllunaEffect extends OneShotEffect { + + private static final Condition condition = new CompoundCondition( + new ManaWasSpentCondition(ColoredManaSymbol.R), + new ManaWasSpentCondition(ColoredManaSymbol.G) + ); + private static final FilterCreaturePermanent filter + = new FilterCreaturePermanent("creature you don't control"); + + static { + filter.add(TargetController.NOT_YOU.getControllerPredicate()); + } + + MythosOfIllunaEffect() { + super(Outcome.Benefit); + staticText = "Create a token that's a copy of target permanent. " + + "If {R}{G} was spent to cast this spell, instead create a token that's a copy of that permanent, " + + "except the token has \"When this permanent enters the battlefield, if it's a creature, " + + "it fights up to one target creature you don't control.\""; + } + + private MythosOfIllunaEffect(final MythosOfIllunaEffect effect) { + super(effect); + } + + @Override + public MythosOfIllunaEffect copy() { + return new MythosOfIllunaEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent == null) { + return false; + } + CreateTokenCopyTargetEffect effect = new CreateTokenCopyTargetEffect(source.getControllerId()); + if (condition.apply(game, source)) { + Ability ability = new ConditionalInterveningIfTriggeredAbility( + new EntersBattlefieldTriggeredAbility(new FightTargetSourceEffect()), + MythosOfIllunaCondition.instance, "When this permanent enters the battlefield, " + + "if it's a creature, it fights up to one target creature you don't control." + ); + ability.addTarget(new TargetPermanent(0, 1, filter, false)); + effect.addAdditionalAbilities(ability); + } + return effect.apply(game, source); + } +} + +enum MythosOfIllunaCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + return permanent != null && permanent.isCreature(); + } +} diff --git a/Mage.Sets/src/mage/sets/IkoriaLairOfBehemoths.java b/Mage.Sets/src/mage/sets/IkoriaLairOfBehemoths.java index 558b012dfb..8f34c38299 100644 --- a/Mage.Sets/src/mage/sets/IkoriaLairOfBehemoths.java +++ b/Mage.Sets/src/mage/sets/IkoriaLairOfBehemoths.java @@ -204,6 +204,7 @@ public final class IkoriaLairOfBehemoths extends ExpansionSet { cards.add(new SetCardInfo("Mysterious Egg", 3, Rarity.COMMON, mage.cards.m.MysteriousEgg.class)); cards.add(new SetCardInfo("Mystic Subdual", 57, Rarity.UNCOMMON, mage.cards.m.MysticSubdual.class)); cards.add(new SetCardInfo("Mythos of Brokkos", 168, Rarity.RARE, mage.cards.m.MythosOfBrokkos.class)); + cards.add(new SetCardInfo("Mythos of Illuna", 58, Rarity.RARE, mage.cards.m.MythosOfIlluna.class)); cards.add(new SetCardInfo("Mythos of Nethroi", 97, Rarity.RARE, mage.cards.m.MythosOfNethroi.class)); cards.add(new SetCardInfo("Necropanther", 196, Rarity.UNCOMMON, mage.cards.n.Necropanther.class)); cards.add(new SetCardInfo("Nethroi, Apex of Death", 197, Rarity.MYTHIC, mage.cards.n.NethroiApexOfDeath.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java index acc93941dc..88820aa027 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenCopyTargetEffect.java @@ -21,6 +21,7 @@ import mage.util.functions.ApplyToPermanent; import mage.util.functions.EmptyApplyToPermanent; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -46,6 +47,7 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { private ObjectColor color; private boolean useLKI = false; private boolean isntLegendary = false; + private final List additionalAbilities = new ArrayList(); public CreateTokenCopyTargetEffect(boolean useLKI) { this(); @@ -202,6 +204,7 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { if (color != null) { token.getColor(game).setColor(color); } + additionalAbilities.stream().forEach(token::addAbility); token.putOntoBattlefield(number, game, source.getSourceId(), playerId == null ? source.getControllerId() : playerId, tapped, attacking, attackedPlayer); for (UUID tokenId : token.getLastAddedTokenIds()) { // by cards like Doubling Season multiple tokens can be added to the battlefield @@ -302,4 +305,8 @@ public class CreateTokenCopyTargetEffect extends OneShotEffect { game.addDelayedTriggeredAbility(new AtTheEndOfCombatDelayedTriggeredAbility(exileEffect), source); } } + + public void addAdditionalAbilities(Ability... abilities) { + Arrays.stream(abilities).forEach(this.additionalAbilities::add); + } }