[NEO] Implemented The Kami War / O-Kagachi Made Manifest

This commit is contained in:
Evan Kranzler 2022-02-06 18:48:15 -05:00
parent 1be8ec3b01
commit 7eba5ae816
3 changed files with 200 additions and 0 deletions

View file

@ -0,0 +1,120 @@
package mage.cards.o;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.InfoEffect;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.TrampleAbility;
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.players.Player;
import mage.target.TargetCard;
import mage.target.common.TargetCardInGraveyard;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class OKagachiMadeManifest extends CardImpl {
public OKagachiMadeManifest(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT, CardType.CREATURE}, "");
this.subtype.add(SubType.DRAGON);
this.subtype.add(SubType.SPIRIT);
this.power = new MageInt(6);
this.toughness = new MageInt(6);
this.nightCard = true;
// O-Kagachi Made Manifest is all colors.
this.color.setWhite(true);
this.color.setBlue(true);
this.color.setBlack(true);
this.color.setRed(true);
this.color.setGreen(true);
this.addAbility(new SimpleStaticAbility(new InfoEffect("{this} is all colors")));
// Flying
this.addAbility(FlyingAbility.getInstance());
// Trample
this.addAbility(TrampleAbility.getInstance());
// Whenever O-Kagachi Made Manifest attacks, defending player chooses a nonland card in your graveyard. Return that card to your hand. O-Kagachi Made Manifest gets +X/+0 until end of turn, where X is the mana value of that card.
this.addAbility(new AttacksTriggeredAbility(
new OKagachiMadeManifestEffect(), false, null, SetTargetPointer.PLAYER
));
}
private OKagachiMadeManifest(final OKagachiMadeManifest card) {
super(card);
}
@Override
public OKagachiMadeManifest copy() {
return new OKagachiMadeManifest(this);
}
}
class OKagachiMadeManifestEffect extends OneShotEffect {
OKagachiMadeManifestEffect() {
super(Outcome.Benefit);
staticText = "defending player chooses a nonland card in your graveyard. Return that card to your hand. " +
"{this} gets +X/+0 until end of turn, where X is the mana value of that card";
}
private OKagachiMadeManifestEffect(final OKagachiMadeManifestEffect effect) {
super(effect);
}
@Override
public OKagachiMadeManifestEffect copy() {
return new OKagachiMadeManifestEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
if (controller == null || player == null) {
return false;
}
Card card;
switch (controller.getGraveyard().count(StaticFilters.FILTER_CARD_A_NON_LAND, game)) {
case 0:
return false;
case 1:
card = controller
.getGraveyard()
.getCards(StaticFilters.FILTER_CARD_A_NON_LAND, game)
.stream()
.findFirst()
.orElse(null);
break;
default:
TargetCard target = new TargetCardInGraveyard(StaticFilters.FILTER_CARD_A_NON_LAND);
target.setNotTarget(true);
player.choose(Outcome.ReturnToHand, controller.getGraveyard(), target, game);
card = game.getCard(target.getFirstTarget());
}
if (card == null) {
return false;
}
int manaValue = card.getManaValue();
player.moveCards(card, Zone.HAND, source, game);
if (manaValue > 0) {
game.addEffect(new BoostSourceEffect(manaValue, 0, Duration.EndOfTurn), source);
}
return true;
}
}

View file

@ -0,0 +1,78 @@
package mage.cards.t;
import mage.abilities.common.SagaAbility;
import mage.abilities.effects.Effects;
import mage.abilities.effects.common.ExileSagaAndReturnTransformedEffect;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.effects.common.discard.DiscardEachPlayerEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.SagaChapter;
import mage.constants.SubType;
import mage.constants.TargetController;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterNonlandPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.TargetPermanent;
import java.util.UUID;
/**
* @author TheElk801
*/
public final class TheKamiWar extends CardImpl {
private static final FilterPermanent filter
= new FilterNonlandPermanent("nonland permanent an opponent controls");
private static final FilterPermanent filter2
= new FilterNonlandPermanent("other target nonland permanent");
static {
filter.add(TargetController.OPPONENT.getControllerPredicate());
filter2.add(AnotherPredicate.instance);
}
public TheKamiWar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{U}{B}{R}{G}");
this.subtype.add(SubType.SAGA);
this.secondSideCardClazz = mage.cards.o.OKagachiMadeManifest.class;
// (As this Saga enters and after your draw step, add a lore counter.)
SagaAbility sagaAbility = new SagaAbility(this);
// I Exile target nonland permanent an opponent controls.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_I, SagaChapter.CHAPTER_I,
new ExileTargetEffect(), new TargetPermanent(filter)
);
// II Return up to one other target nonland permanent to its owner's hand. Then each opponent discards a card.
sagaAbility.addChapterEffect(
this, SagaChapter.CHAPTER_II, SagaChapter.CHAPTER_II,
new Effects(
new ReturnToHandTargetEffect(),
new DiscardEachPlayerEffect(TargetController.OPPONENT)
.concatBy("Then")
), new TargetPermanent(0, 1, filter2)
);
// III Exile this Saga, then return it to the battlefield transformed under your control.
this.addAbility(new TransformAbility());
sagaAbility.addChapterEffect(this, SagaChapter.CHAPTER_III, new ExileSagaAndReturnTransformedEffect());
this.addAbility(sagaAbility);
}
private TheKamiWar(final TheKamiWar card) {
super(card);
}
@Override
public TheKamiWar copy() {
return new TheKamiWar(this);
}
}

View file

@ -190,6 +190,7 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Nezumi Road Captain", 117, Rarity.COMMON, mage.cards.n.NezumiRoadCaptain.class));
cards.add(new SetCardInfo("Ninja's Kunai", 252, Rarity.COMMON, mage.cards.n.NinjasKunai.class));
cards.add(new SetCardInfo("Norika Yamazaki, the Poet", 31, Rarity.UNCOMMON, mage.cards.n.NorikaYamazakiThePoet.class));
cards.add(new SetCardInfo("O-Kagachi Made Manifest", 227, Rarity.MYTHIC, mage.cards.o.OKagachiMadeManifest.class));
cards.add(new SetCardInfo("Ogre-Head Helm", 155, Rarity.RARE, mage.cards.o.OgreHeadHelm.class));
cards.add(new SetCardInfo("Okiba Reckoner Raid", 117, Rarity.COMMON, mage.cards.o.OkibaReckonerRaid.class));
cards.add(new SetCardInfo("Oni-Cult Anvil", 230, Rarity.UNCOMMON, mage.cards.o.OniCultAnvil.class));
@ -254,6 +255,7 @@ public final class KamigawaNeonDynasty extends ExpansionSet {
cards.add(new SetCardInfo("Teachings of the Kirin", 212, Rarity.RARE, mage.cards.t.TeachingsOfTheKirin.class));
cards.add(new SetCardInfo("Tempered in Solitude", 165, Rarity.UNCOMMON, mage.cards.t.TemperedInSolitude.class));
cards.add(new SetCardInfo("The Fall of Lord Konda", 12, Rarity.UNCOMMON, mage.cards.t.TheFallOfLordKonda.class));
cards.add(new SetCardInfo("The Kami War", 227, Rarity.MYTHIC, mage.cards.t.TheKamiWar.class));
cards.add(new SetCardInfo("The Long Reach of Night", 109, Rarity.UNCOMMON, mage.cards.t.TheLongReachOfNight.class));
cards.add(new SetCardInfo("The Modern Age", 66, Rarity.COMMON, mage.cards.t.TheModernAge.class));
cards.add(new SetCardInfo("The Reality Chip", 74, Rarity.RARE, mage.cards.t.TheRealityChip.class));