Implemented Mythos of Illuna

This commit is contained in:
Evan Kranzler 2020-04-11 20:58:00 -04:00
parent 1f2cc93fef
commit d3ac65b68b
3 changed files with 116 additions and 0 deletions

View file

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

View file

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

View file

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