forked from External/mage
138 lines
5.2 KiB
Java
138 lines
5.2 KiB
Java
package mage.cards.a;
|
|
|
|
import java.util.*;
|
|
import mage.abilities.Ability;
|
|
import mage.abilities.effects.OneShotEffect;
|
|
import mage.cards.Card;
|
|
import mage.cards.CardImpl;
|
|
import mage.cards.CardSetInfo;
|
|
import mage.constants.CardType;
|
|
import mage.constants.Outcome;
|
|
import mage.constants.WatcherScope;
|
|
import mage.constants.Zone;
|
|
import mage.game.Game;
|
|
import mage.game.events.GameEvent;
|
|
import mage.game.stack.Spell;
|
|
import mage.players.Player;
|
|
import mage.watchers.Watcher;
|
|
|
|
/**
|
|
* @author stravant
|
|
*/
|
|
public class ApproachOfTheSecondSun extends CardImpl {
|
|
|
|
public ApproachOfTheSecondSun(UUID ownerId, CardSetInfo setInfo) {
|
|
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{6}{W}");
|
|
|
|
getSpellAbility().addEffect(new ApproachOfTheSecondSunEffect());
|
|
getSpellAbility().addWatcher(new ApproachOfTheSecondSunWatcher());
|
|
}
|
|
|
|
public ApproachOfTheSecondSun(final ApproachOfTheSecondSun card) {
|
|
super(card);
|
|
}
|
|
|
|
@Override
|
|
public ApproachOfTheSecondSun copy() {
|
|
return new ApproachOfTheSecondSun(this);
|
|
}
|
|
}
|
|
|
|
class ApproachOfTheSecondSunEffect extends OneShotEffect {
|
|
|
|
public ApproachOfTheSecondSunEffect() {
|
|
super(Outcome.Win);
|
|
this.staticText
|
|
= "If {this} was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. "
|
|
+ "Otherwise, put {this} into its owner's library seventh from the top and you gain 7 life.";
|
|
}
|
|
|
|
public ApproachOfTheSecondSunEffect(final ApproachOfTheSecondSunEffect effect) {
|
|
super(effect);
|
|
}
|
|
|
|
@Override
|
|
public ApproachOfTheSecondSunEffect copy() {
|
|
return new ApproachOfTheSecondSunEffect(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean apply(Game game, Ability source) {
|
|
Player controller = game.getPlayer(source.getControllerId());
|
|
Spell spell = game.getStack().getSpell(source.getSourceId());
|
|
if (controller != null && spell != null) {
|
|
ApproachOfTheSecondSunWatcher watcher
|
|
= (ApproachOfTheSecondSunWatcher) game.getState().getWatchers().get(ApproachOfTheSecondSunWatcher.class.getName());
|
|
if (watcher != null && watcher.getApproachesCast(controller.getId()) > 1 && spell.getFromZone() == Zone.HAND) {
|
|
// Win the game
|
|
controller.won(game);
|
|
} else {
|
|
// Gain 7 life and put this back into library.
|
|
controller.gainLife(7, game);
|
|
|
|
// Put this into the library as the 7th from the top
|
|
Card spellCard = game.getStack().getSpell(source.getSourceId()).getCard();
|
|
if (spellCard != null) {
|
|
List<Card> top6 = new ArrayList<>();
|
|
// Cut the top 6 cards off into a temporary array
|
|
for (int i = 0; i < 6 && controller.getLibrary().hasCards(); ++i) {
|
|
top6.add(controller.getLibrary().removeFromTop(game));
|
|
}
|
|
|
|
// Is the library now empty, thus the rise is on the bottom (for the message to the players)?
|
|
boolean isOnBottom = controller.getLibrary().size() < 6;
|
|
// Put this card (if the ability came from an ApproachOfTheSecondSun spell card) on top
|
|
spellCard.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
|
|
|
|
// put the top 6 we took earlier back on top (going in reverse order this time to get them back
|
|
// on top in the proper order)
|
|
for (int i = top6.size() - 1; i >= 0; --i) {
|
|
controller.getLibrary().putOnTop(top6.get(i), game);
|
|
}
|
|
|
|
// Inform the players
|
|
if (isOnBottom) {
|
|
game.informPlayers(controller.getLogName() + " puts " + spell.getLogName() + " on the bottom of his or her library.");
|
|
} else {
|
|
game.informPlayers(controller.getLogName() + " puts " + spell.getLogName() + " into his or her library 7th from the top.");
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
class ApproachOfTheSecondSunWatcher extends Watcher {
|
|
|
|
private Map<UUID, Integer> approachesCast = new HashMap<>();
|
|
|
|
public ApproachOfTheSecondSunWatcher() {
|
|
super(ApproachOfTheSecondSunWatcher.class.getSimpleName(), WatcherScope.GAME);
|
|
}
|
|
|
|
public ApproachOfTheSecondSunWatcher(final ApproachOfTheSecondSunWatcher watcher) {
|
|
super(watcher);
|
|
approachesCast = new HashMap<>(watcher.approachesCast);
|
|
}
|
|
|
|
@Override
|
|
public void watch(GameEvent event, Game game) {
|
|
if (event.getType() == GameEvent.EventType.SPELL_CAST) {
|
|
Spell spell = game.getStack().getSpell(event.getSourceId());
|
|
if (spell != null && spell.getName().equals("Approach of the Second Sun")) {
|
|
approachesCast.put(event.getPlayerId(), getApproachesCast(event.getPlayerId()) + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
public int getApproachesCast(UUID player) {
|
|
return approachesCast.getOrDefault(player, 0);
|
|
}
|
|
|
|
@Override
|
|
public ApproachOfTheSecondSunWatcher copy() {
|
|
return new ApproachOfTheSecondSunWatcher(this);
|
|
}
|
|
}
|