[WAR] added God-Eternal Kefnet

This commit is contained in:
Oleg Agafonov 2019-04-23 01:02:58 +04:00
parent a737df0995
commit 7b7c80c80a
3 changed files with 178 additions and 9 deletions

View file

@ -0,0 +1,157 @@
package mage.cards.g;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.abilities.common.GodEternalDiesTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect;
import mage.abilities.hint.HintUtils;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.watchers.common.CardsAmountDrawnThisTurnWatcher;
import java.awt.*;
import java.util.UUID;
/**
* @author JayDi85
*/
public final class GodEternalKefnet extends CardImpl {
public GodEternalKefnet(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{U}");
this.addSuperType(SuperType.LEGENDARY);
this.subtype.add(SubType.ZOMBIE);
this.subtype.add(SubType.GOD);
this.power = new MageInt(4);
this.toughness = new MageInt(5);
// Flying
this.addAbility(FlyingAbility.getInstance());
// You may reveal the first card you draw each turn as you draw it. Whenever you reveal an instant or sorcery card this way,
// copy that card and you may cast the copy. That copy costs {2} less to cast.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GodEternalKefnetDrawCardReplacementEffect()), new CardsAmountDrawnThisTurnWatcher());
// When God-Eternal Kefnet dies or is put into exile from the battlefield, you may put it into its owners library third from the top.
this.addAbility(new GodEternalDiesTriggeredAbility());
}
public GodEternalKefnet(final GodEternalKefnet card) {
super(card);
}
@Override
public GodEternalKefnet copy() {
return new GodEternalKefnet(this);
}
}
class GodEternalKefnetDrawCardReplacementEffect extends ReplacementEffectImpl {
public GodEternalKefnetDrawCardReplacementEffect() {
super(Duration.WhileOnBattlefield, Outcome.Neutral);
this.staticText = "You may reveal the first card you draw each turn as you draw it. Whenever you reveal an instant "
+ "or sorcery card this way, copy that card and you may cast the copy. That copy costs {2} less to cast";
}
public GodEternalKefnetDrawCardReplacementEffect(final GodEternalKefnetDrawCardReplacementEffect effect) {
super(effect);
}
@Override
public GodEternalKefnetDrawCardReplacementEffect copy() {
return new GodEternalKefnetDrawCardReplacementEffect(this);
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
// reveal top card and drawn (return false to continue default draw)
Permanent god = game.getPermanent(source.getSourceId());
Player you = game.getPlayer(source.getControllerId());
if (god == null && you == null) {
return false;
}
Card topCard = you.getLibrary().getTopCards(game, 1).iterator().next();
if (topCard == null) {
return false;
}
// reveal
you.setTopCardRevealed(true);
// cast copy
if (topCard.isInstantOrSorcery() && you.chooseUse(outcome, "Would you like to copy " + topCard.getName()
+ " and cast it {2} less?", source, game)) {
Card blueprint = topCard.copy();
blueprint.addAbility(new SimpleStaticAbility(Zone.ALL, new SpellCostReductionSourceEffect(2)));
Card copiedCard = game.copyCard(blueprint, source, source.getControllerId());
you.moveCardToHandWithInfo(copiedCard, source.getSourceId(), game, true); // The copy is created in and cast from your hand.
you.cast(copiedCard.getSpellAbility(), game, false, new MageObjectReference(source.getSourceObject(game), game));
}
// draw (return false for default draw)
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == EventType.DRAW_CARD;
}
String getAppliedMark(Game game, Ability source) {
return source.getId() + "-applied-" + source.getControllerId() + "-" + game.getState().getTurnNum();
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (!event.getPlayerId().equals(source.getControllerId())) {
return false;
}
Permanent god = game.getPermanent(source.getSourceId());
Player you = game.getPlayer(source.getControllerId());
if (god == null && you == null) {
return false;
}
Card topCard = you.getLibrary().getTopCards(game, 1).iterator().next();
if (topCard == null) {
return false;
}
// only first draw card
// if card casted on that turn or controlled changed then needs history from watcher
CardsAmountDrawnThisTurnWatcher watcher = game.getState().getWatcher(CardsAmountDrawnThisTurnWatcher.class);
if (watcher != null && watcher.getAmountCardsDrawn(event.getPlayerId()) != 0) {
return false;
}
// one time use (if multiple cards drawn)
String mark = getAppliedMark(game, source);
if (game.getState().getValue(mark) != null) {
return false;
}
game.getState().setValue(mark, true);
// ask player to reveal top cards
String mes = topCard.getName() + ", " + (topCard.isInstantOrSorcery()
? HintUtils.prepareText("you can copy it and cast {2} less", Color.green)
: HintUtils.prepareText("you can't copy it", Color.red));
return you.chooseUse(Outcome.Benefit, "Would you like to reveal first drawn card (" + mes + ")?", source, game);
}
}

View file

@ -125,6 +125,7 @@ public final class WarOfTheSpark extends ExpansionSet {
cards.add(new SetCardInfo("Goblin Assailant", 128, Rarity.COMMON, mage.cards.g.GoblinAssailant.class));
cards.add(new SetCardInfo("Goblin Assault Team", 129, Rarity.COMMON, mage.cards.g.GoblinAssaultTeam.class));
cards.add(new SetCardInfo("God-Eternal Bontu", 92, Rarity.MYTHIC, mage.cards.g.GodEternalBontu.class));
cards.add(new SetCardInfo("God-Eternal Kefnet", 53, Rarity.MYTHIC, mage.cards.g.GodEternalKefnet.class));
cards.add(new SetCardInfo("God-Eternal Oketra", 16, Rarity.MYTHIC, mage.cards.g.GodEternalOketra.class));
cards.add(new SetCardInfo("God-Eternal Rhonas", 163, Rarity.MYTHIC, mage.cards.g.GodEternalRhonas.class));
cards.add(new SetCardInfo("God-Pharaoh's Statue", 238, Rarity.UNCOMMON, mage.cards.g.GodPharaohsStatue.class));

View file

@ -1,4 +1,3 @@
package mage.abilities.effects.common.cost;
import mage.abilities.Ability;
@ -13,14 +12,17 @@ import mage.game.Game;
import mage.util.CardUtil;
/**
*
* @author LevelX2
*/
public class SpellCostReductionSourceEffect extends CostModificationEffectImpl {
private final int amount;
private ManaCosts<ManaCost> manaCostsToReduce = null;
private final Condition condition;
private Condition condition;
public SpellCostReductionSourceEffect(ManaCosts<ManaCost> manaCostsToReduce) {
this(manaCostsToReduce, null);
}
public SpellCostReductionSourceEffect(ManaCosts<ManaCost> manaCostsToReduce, Condition condition) {
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
@ -33,19 +35,28 @@ public class SpellCostReductionSourceEffect extends CostModificationEffectImpl {
for (String manaSymbol : manaCostsToReduce.getSymbols()) {
sb.append(manaSymbol);
}
sb.append(" less to if ").append(this.condition.toString());
sb.append(" less");
if (this.condition != null) {
sb.append(" to if ").append(this.condition.toString());
}
this.staticText = sb.toString();
}
public SpellCostReductionSourceEffect(int amount) {
this(amount, null);
}
public SpellCostReductionSourceEffect(int amount, Condition condition) {
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
this.amount = amount;
this.condition = condition;
StringBuilder sb = new StringBuilder();
sb.append("{this} costs {")
.append(amount).append("} less to cast ")
.append((this.condition.toString().startsWith("if ") ? "" : "if "))
.append(this.condition.toString());
sb.append("{this} costs {").append(amount).append("} less to cast");
if (this.condition != null) {
sb.append(" ").append(this.condition.toString().startsWith("if ") ? "" : "if ");
sb.append(this.condition.toString());
}
this.staticText = sb.toString();
}
@ -69,7 +80,7 @@ public class SpellCostReductionSourceEffect extends CostModificationEffectImpl {
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify.getSourceId().equals(source.getSourceId()) && (abilityToModify instanceof SpellAbility)) {
return condition.apply(game, source);
return condition == null || condition.apply(game, source);
}
return false;
}