foul-magics/Mage/src/main/java/mage/abilities/effects/ExileFaceDownYouMayPlayAsLongAsExiledTargetEffect.java
Susucre c77634c843
separate 'you may play'|'you may cast' AsThoughtEffect approuvers
Also, reworked Gonti, Lord of Luxury and checks it now works properly with Zoetic Cavern.
2024-04-13 12:10:53 +02:00

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;
}
}