mirror of
https://github.com/correl/mage.git
synced 2024-12-27 03:00:13 +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("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));
|
||||
|
|
Loading…
Reference in a new issue