[MOM] Implement Elesh Norn

This commit is contained in:
theelk801 2023-04-14 18:23:20 -04:00
parent a8ff9b48ec
commit dd91a58c85
19 changed files with 382 additions and 246 deletions

View file

@ -6,9 +6,8 @@ import mage.abilities.Pronoun;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.constants.Outcome;
import mage.constants.PutCards;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
@ -17,18 +16,23 @@ import mage.players.Player;
/**
* @author LevelX2
*/
public class ExileAndReturnTransformedSourceEffect extends OneShotEffect {
public class ExileAndReturnSourceEffect extends OneShotEffect {
protected final Pronoun pronoun;
protected final Effect additionalEffect;
protected final boolean returnUnderYourControl;
private final Pronoun pronoun;
private final Effect additionalEffect;
private final boolean returnUnderYourControl;
private final PutCards putCards;
public ExileAndReturnTransformedSourceEffect(Pronoun pronoun) {
this(pronoun, null);
public ExileAndReturnSourceEffect(PutCards putCards) {
this(putCards, Pronoun.IT);
}
public ExileAndReturnTransformedSourceEffect(Pronoun pronoun, Effect additionalEffect) {
this(pronoun, additionalEffect, false);
public ExileAndReturnSourceEffect(PutCards putCards, Pronoun pronoun) {
this(putCards, pronoun, false);
}
public ExileAndReturnSourceEffect(PutCards putCards, Pronoun pronoun, boolean returnUnderYourControl) {
this(putCards, pronoun, returnUnderYourControl, null);
}
/**
@ -36,43 +40,41 @@ public class ExileAndReturnTransformedSourceEffect extends OneShotEffect {
* @param additionalEffect that effect is applies as source is exiled
* @param returnUnderYourControl return under your or owner control
*/
public ExileAndReturnTransformedSourceEffect(Pronoun pronoun, Effect additionalEffect, boolean returnUnderYourControl) {
public ExileAndReturnSourceEffect(PutCards putCards, Pronoun pronoun, boolean returnUnderYourControl, Effect additionalEffect) {
super(Outcome.Benefit);
this.pronoun = pronoun;
this.putCards = putCards;
this.additionalEffect = additionalEffect;
this.returnUnderYourControl = returnUnderYourControl;
}
protected ExileAndReturnTransformedSourceEffect(final ExileAndReturnTransformedSourceEffect effect) {
protected ExileAndReturnSourceEffect(final ExileAndReturnSourceEffect effect) {
super(effect);
this.putCards = effect.putCards;
this.pronoun = effect.pronoun;
this.additionalEffect = effect.additionalEffect;
this.returnUnderYourControl = effect.returnUnderYourControl;
}
@Override
public ExileAndReturnTransformedSourceEffect copy() {
return new ExileAndReturnTransformedSourceEffect(this);
public ExileAndReturnSourceEffect copy() {
return new ExileAndReturnSourceEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
// Creature has to be on the battlefield to get exiled and be able to return transformed
Permanent sourceObject = source.getSourcePermanentIfItStillExists(game);
Player controller = game.getPlayer(source.getControllerId());
if (sourceObject == null || controller == null) {
Permanent permanent = source.getSourcePermanentIfItStillExists(game);
if (permanent == null || controller == null) {
return true;
}
if (!controller.moveCards(sourceObject, Zone.EXILED, source, game)) {
return true;
}
game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + source.getSourceId(), Boolean.TRUE);
Card cardFromExile = game.getCard(source.getSourceId());
if (cardFromExile == null) {
return true;
}
controller.moveCards(cardFromExile, Zone.BATTLEFIELD, source, game, false, false, !this.returnUnderYourControl, null);
if (additionalEffect == null) {
controller.moveCards(permanent, Zone.EXILED, source, game);
putCards.moveCard(
returnUnderYourControl ? controller : game.getPlayer(permanent.getOwnerId()),
permanent.getMainCard(), source, game, "card"
);
if (additionalEffect == null || game.getPermanent(permanent.getId()) == null) {
return true;
}
if (additionalEffect instanceof ContinuousEffect) {
@ -88,8 +90,8 @@ public class ExileAndReturnTransformedSourceEffect extends OneShotEffect {
if (staticText != null && !staticText.isEmpty()) {
return staticText;
}
return "exile {this}, then return " + pronoun.getObjective()
+ " to the battlefield transformed under " + pronoun.getPossessive()
+ ' ' + (this.returnUnderYourControl ? "your" : "owner's") + " control";
return "exile {this}, then return " + pronoun.getObjective() + ' ' +
putCards.getMessage(false, false).replace("onto", "to") + " under " +
(this.returnUnderYourControl ? "your" : pronoun.getPossessive() + ' ' + "owner's") + " control";
}
}

View file

@ -1,14 +1,15 @@
package mage.abilities.effects.common;
import mage.abilities.Pronoun;
import mage.constants.PutCards;
/**
* @author TheElk801
*/
public class ExileSagaAndReturnTransformedEffect extends ExileAndReturnTransformedSourceEffect {
public class ExileSagaAndReturnTransformedEffect extends ExileAndReturnSourceEffect {
public ExileSagaAndReturnTransformedEffect() {
super(Pronoun.IT, null, true);
super(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.IT, true, null);
staticText = "exile this Saga, then return it to the battlefield transformed under your control";
}

View file

@ -0,0 +1,24 @@
package mage.abilities.effects.common;
import mage.abilities.Pronoun;
import mage.constants.PutCards;
/**
* @author TheElk801
*/
public class ExileSourceAndReturnFaceUpEffect extends ExileAndReturnSourceEffect {
public ExileSourceAndReturnFaceUpEffect() {
super(PutCards.BATTLEFIELD, Pronoun.IT, true, null);
staticText = "exile {this}, then return it to the battlefield. <i>(front face up)</i>";
}
private ExileSourceAndReturnFaceUpEffect(final ExileSourceAndReturnFaceUpEffect effect) {
super(effect);
}
@Override
public ExileSourceAndReturnFaceUpEffect copy() {
return new ExileSourceAndReturnFaceUpEffect(this);
}
}

View file

@ -1,6 +1,7 @@
package mage.constants;
import mage.abilities.Ability;
import mage.abilities.keyword.TransformAbility;
import mage.cards.Card;
import mage.cards.Cards;
import mage.cards.CardsImpl;
@ -8,7 +9,6 @@ import mage.game.Game;
import mage.players.Player;
/**
*
* @author awjackson
*/
@ -17,6 +17,7 @@ public enum PutCards {
GRAVEYARD(Outcome.Discard, Zone.GRAVEYARD, "into your graveyard"),
BATTLEFIELD(Outcome.PutCardInPlay, Zone.BATTLEFIELD, "onto the battlefield"),
BATTLEFIELD_TAPPED(Outcome.PutCardInPlay, Zone.BATTLEFIELD, "onto the battlefield tapped"),
BATTLEFIELD_TRANSFORMED(Outcome.PutCardInPlay, Zone.BATTLEFIELD, "onto the battlefield transformed"),
EXILED(Outcome.Exile, Zone.EXILED, "into exile"), // may need special case code to generate correct text
TOP_OR_BOTTOM(Outcome.Benefit, Zone.LIBRARY, "on the top or bottom of your library"),
TOP_ANY(Outcome.Benefit, Zone.LIBRARY, "on top of your library", " in any order"),
@ -73,6 +74,8 @@ public enum PutCards {
return player.putCardsOnBottomOfLibrary(new CardsImpl(card), game, source, false);
case BATTLEFIELD_TAPPED:
return player.moveCards(card, Zone.BATTLEFIELD, source, game, true, false, false, null);
case BATTLEFIELD_TRANSFORMED:
game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + card.getId(), Boolean.TRUE);
case BATTLEFIELD:
case EXILED:
case HAND:
@ -95,6 +98,8 @@ public enum PutCards {
return player.putCardsOnBottomOfLibrary(cards, game, source, false);
case BATTLEFIELD_TAPPED:
return player.moveCards(cards.getCards(game), Zone.BATTLEFIELD, source, game, true, false, false, null);
case BATTLEFIELD_TRANSFORMED:
cards.stream().forEach(uuid -> game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + uuid, Boolean.TRUE));
case BATTLEFIELD:
case EXILED:
case HAND: