mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 10:40:06 -08:00
[EOE] Implement Sothera, the Supervoid
This commit is contained in:
parent
70c5906188
commit
9fd31a8ec4
2 changed files with 173 additions and 0 deletions
170
Mage.Sets/src/mage/cards/s/SotheraTheSupervoid.java
Normal file
170
Mage.Sets/src/mage/cards/s/SotheraTheSupervoid.java
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
package mage.cards.s;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.SacrificeSourceEffect;
|
||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.Zone;
|
||||
import mage.counters.CounterType;
|
||||
import mage.counters.Counters;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.ExileZone;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetCard;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCardInExile;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
import mage.util.CardUtil;
|
||||
import mage.util.RandomUtil;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SotheraTheSupervoid extends CardImpl {
|
||||
|
||||
public SotheraTheSupervoid(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
|
||||
// Whenever a creature you control dies, each opponent chooses a creature they control and exiles it.
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(
|
||||
new SotheraTheSupervoidExileEffect(), false,
|
||||
StaticFilters.FILTER_CONTROLLED_A_CREATURE
|
||||
));
|
||||
|
||||
// At the beginning of your end step, if a player controls no creatures, sacrifice Sothera, then put a creature card exiled with it onto the battlefield under your control with two additional +1/+1 counters on it.
|
||||
Ability ability = new BeginningOfEndStepTriggeredAbility(new SacrificeSourceEffect())
|
||||
.withInterveningIf(SotheraTheSupervoidCondition.instance);
|
||||
ability.addEffect(new SotheraTheSupervoidReturnEffect());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private SotheraTheSupervoid(final SotheraTheSupervoid card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotheraTheSupervoid copy() {
|
||||
return new SotheraTheSupervoid(this);
|
||||
}
|
||||
}
|
||||
|
||||
enum SotheraTheSupervoidCondition implements Condition {
|
||||
instance;
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
return game
|
||||
.getState()
|
||||
.getPlayersInRange(source.getControllerId(), game)
|
||||
.stream()
|
||||
.anyMatch(playerId -> !game.getBattlefield().contains(
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE, playerId, source, game, 1
|
||||
));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "a player controls no creatures";
|
||||
}
|
||||
}
|
||||
|
||||
class SotheraTheSupervoidExileEffect extends OneShotEffect {
|
||||
|
||||
SotheraTheSupervoidExileEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "each opponent chooses a creature they control and exiles it";
|
||||
}
|
||||
|
||||
private SotheraTheSupervoidExileEffect(final SotheraTheSupervoidExileEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotheraTheSupervoidExileEffect copy() {
|
||||
return new SotheraTheSupervoidExileEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
for (UUID playerId : game.getOpponents(source.getControllerId())) {
|
||||
Player player = game.getPlayer(playerId);
|
||||
if (player == null || !game.getBattlefield().contains(
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE, playerId, source, game, 1
|
||||
)) {
|
||||
return false;
|
||||
}
|
||||
TargetPermanent target = new TargetControlledCreaturePermanent();
|
||||
target.withChooseHint("to exile");
|
||||
target.withNotTarget(true);
|
||||
player.choose(Outcome.Exile, target, source, game);
|
||||
Permanent permanent = game.getPermanent(target.getFirstTarget());
|
||||
if (permanent == null) {
|
||||
continue;
|
||||
}
|
||||
player.moveCardsToExile(
|
||||
permanent, source, game, true,
|
||||
CardUtil.getExileZoneId(game, source),
|
||||
CardUtil.getSourceName(game, source)
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class SotheraTheSupervoidReturnEffect extends OneShotEffect {
|
||||
|
||||
SotheraTheSupervoidReturnEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = ", then put a creature card exiled with it onto the battlefield " +
|
||||
"under your control with two additional +1/+1 counters on it";
|
||||
}
|
||||
|
||||
private SotheraTheSupervoidReturnEffect(final SotheraTheSupervoidReturnEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SotheraTheSupervoidReturnEffect copy() {
|
||||
return new SotheraTheSupervoidReturnEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player player = game.getPlayer(source.getControllerId());
|
||||
ExileZone exileZone = game.getExile().getExileZone(CardUtil.getExileZoneId(game, source));
|
||||
if (player == null || exileZone == null) {
|
||||
return false;
|
||||
}
|
||||
Card card;
|
||||
switch (exileZone.count(StaticFilters.FILTER_CARD_CREATURE, game)) {
|
||||
case 0:
|
||||
return false;
|
||||
case 1:
|
||||
card = RandomUtil.randomFromCollection(exileZone.getCards(StaticFilters.FILTER_CARD_CREATURE, game));
|
||||
break;
|
||||
default:
|
||||
TargetCard target = new TargetCardInExile(StaticFilters.FILTER_CARD_CREATURE, exileZone.getId());
|
||||
player.choose(outcome, target, source, game);
|
||||
card = game.getCard(target.getFirstTarget());
|
||||
}
|
||||
if (card == null) {
|
||||
return false;
|
||||
}
|
||||
game.setEnterWithCounters(card.getId(), new Counters(CounterType.P1P1.createInstance(2)));
|
||||
return player.moveCards(card, Zone.BATTLEFIELD, source, game);
|
||||
}
|
||||
}
|
||||
|
|
@ -25,6 +25,9 @@ public final class EdgeOfEternities extends ExpansionSet {
|
|||
cards.add(new SetCardInfo("Godless Shrine", 254, Rarity.RARE, mage.cards.g.GodlessShrine.class));
|
||||
cards.add(new SetCardInfo("Sacred Foundry", 256, Rarity.RARE, mage.cards.s.SacredFoundry.class));
|
||||
cards.add(new SetCardInfo("Sami, Ship's Engineer", 225, Rarity.UNCOMMON, mage.cards.s.SamiShipsEngineer.class));
|
||||
cards.add(new SetCardInfo("Sothera, the Supervoid", 115, Rarity.MYTHIC, mage.cards.s.SotheraTheSupervoid.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Sothera, the Supervoid", 360, Rarity.MYTHIC, mage.cards.s.SotheraTheSupervoid.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Sothera, the Supervoid", 382, Rarity.MYTHIC, mage.cards.s.SotheraTheSupervoid.class, NON_FULL_USE_VARIOUS));
|
||||
cards.add(new SetCardInfo("Stomping Ground", 258, Rarity.RARE, mage.cards.s.StompingGround.class));
|
||||
cards.add(new SetCardInfo("Tezzeret, Cruel Captain", 2, Rarity.MYTHIC, mage.cards.t.TezzeretCruelCaptain.class));
|
||||
cards.add(new SetCardInfo("Watery Grave", 261, Rarity.RARE, mage.cards.w.WateryGrave.class));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue