mirror of
https://github.com/correl/mage.git
synced 2024-12-28 03:00:10 +00:00
[NEO] Implemented The Kami War / O-Kagachi Made Manifest
This commit is contained in:
parent
1be8ec3b01
commit
7eba5ae816
3 changed files with 200 additions and 0 deletions
120
Mage.Sets/src/mage/cards/o/OKagachiMadeManifest.java
Normal file
120
Mage.Sets/src/mage/cards/o/OKagachiMadeManifest.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
78
Mage.Sets/src/mage/cards/t/TheKamiWar.java
Normal file
78
Mage.Sets/src/mage/cards/t/TheKamiWar.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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("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("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("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("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("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));
|
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("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("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 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 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 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));
|
cards.add(new SetCardInfo("The Reality Chip", 74, Rarity.RARE, mage.cards.t.TheRealityChip.class));
|
||||||
|
|
Loading…
Reference in a new issue