forked from External/mage
Also, reworked Gonti, Lord of Luxury and checks it now works properly with Zoetic Cavern.
102 lines
No EOL
4.2 KiB
Java
102 lines
No EOL
4.2 KiB
Java
package mage.abilities.effects;
|
|
|
|
import mage.MageObject;
|
|
import mage.abilities.Ability;
|
|
import mage.abilities.effects.common.asthought.MayLookAtTargetCardEffect;
|
|
import mage.cards.Card;
|
|
import mage.cards.Cards;
|
|
import mage.cards.CardsImpl;
|
|
import mage.constants.CastManaAdjustment;
|
|
import mage.constants.Duration;
|
|
import mage.constants.Outcome;
|
|
import mage.game.Game;
|
|
import mage.players.Player;
|
|
import mage.target.targetpointer.FixedTarget;
|
|
import mage.util.CardUtil;
|
|
|
|
import java.util.Objects;
|
|
import java.util.UUID;
|
|
import java.util.stream.Collectors;
|
|
|
|
/**
|
|
* This exiles the target card or cards.
|
|
* Each can be looked at by the source's controller.
|
|
* For each card exiled this way, that player may play|cast that card as long as it stays exiled. (+ mana adjustement)
|
|
* e.g. [[Gonti, Lord of Luxury]]
|
|
*
|
|
* @author Susucr
|
|
*/
|
|
public class ExileFaceDownYouMayPlayAsLongAsExiledTargetEffect extends OneShotEffect {
|
|
|
|
private final boolean useCastSpellOnly;
|
|
private final CastManaAdjustment manaAdjustment;
|
|
|
|
public ExileFaceDownYouMayPlayAsLongAsExiledTargetEffect(boolean useCastSpellOnly, CastManaAdjustment manaAdjustment) {
|
|
super(Outcome.Exile);
|
|
switch (manaAdjustment) {
|
|
case NONE:
|
|
case AS_THOUGH_ANY_MANA_TYPE:
|
|
case AS_THOUGH_ANY_MANA_COLOR:
|
|
this.manaAdjustment = manaAdjustment;
|
|
break;
|
|
case WITHOUT_PAYING_MANA_COST: // TODO when needed
|
|
default:
|
|
throw new IllegalArgumentException("Wrong code usage, manaAdjustment is not yet supported: " + manaAdjustment);
|
|
}
|
|
this.useCastSpellOnly = useCastSpellOnly;
|
|
}
|
|
|
|
private ExileFaceDownYouMayPlayAsLongAsExiledTargetEffect(final ExileFaceDownYouMayPlayAsLongAsExiledTargetEffect effect) {
|
|
super(effect);
|
|
this.manaAdjustment = effect.manaAdjustment;
|
|
this.useCastSpellOnly = effect.useCastSpellOnly;
|
|
}
|
|
|
|
@Override
|
|
public ExileFaceDownYouMayPlayAsLongAsExiledTargetEffect copy() {
|
|
return new ExileFaceDownYouMayPlayAsLongAsExiledTargetEffect(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean apply(Game game, Ability source) {
|
|
Player controller = game.getPlayer(source.getControllerId());
|
|
Cards cards = new CardsImpl(getTargetPointer()
|
|
.getTargets(game, source)
|
|
.stream()
|
|
.map(game::getCard)
|
|
.filter(Objects::nonNull)
|
|
.collect(Collectors.toList())
|
|
);
|
|
if (controller == null || cards.isEmpty()) {
|
|
return false;
|
|
}
|
|
// move card to exile
|
|
UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter());
|
|
MageObject sourceObject = source.getSourceObject(game);
|
|
String exileName = sourceObject == null ? "" : sourceObject.getIdName();
|
|
for (Card card : cards.getCards(game)) {
|
|
card.setFaceDown(true, game);
|
|
if (controller.moveCardsToExile(card, source, game, false, exileZoneId, exileName)) {
|
|
card.setFaceDown(true, game);
|
|
switch (manaAdjustment) {
|
|
case NONE:
|
|
CardUtil.makeCardPlayable(game, source, card, useCastSpellOnly, Duration.Custom, false, controller.getId(), null);
|
|
break;
|
|
case AS_THOUGH_ANY_MANA_TYPE:
|
|
case AS_THOUGH_ANY_MANA_COLOR:
|
|
// TODO: untangle why there is a confusion between the two.
|
|
CardUtil.makeCardPlayable(game, source, card, useCastSpellOnly, Duration.Custom, true, controller.getId(), null);
|
|
break;
|
|
case WITHOUT_PAYING_MANA_COST: // TODO.
|
|
default:
|
|
throw new IllegalArgumentException("Wrong code usage, manaAdjustment is not yet supported: " + manaAdjustment);
|
|
}
|
|
// For as long as that card remains exiled, you may look at it
|
|
ContinuousEffect effect = new MayLookAtTargetCardEffect(controller.getId());
|
|
effect.setTargetPointer(new FixedTarget(card.getId(), game));
|
|
game.addEffect(effect, source);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
} |