foul-magics/Mage/src/main/java/mage/abilities/effects/common/LookLibraryControllerEffect.java
Susucre f75b1c9f0a
Code cleanup: protect all copy constructors (#10750)
* apply regex to change public copy constructors to protected
* cleanup code using now protected constructors
* fix manaBuilder weird casting of Mana into ConditionalMana
2023-08-04 19:34:58 -04:00

121 lines
4 KiB
Java

package mage.abilities.effects.common;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.Outcome;
import mage.constants.PutCards;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.util.CardUtil;
/**
* @author LevelX, awjackson
*/
public class LookLibraryControllerEffect extends OneShotEffect {
protected DynamicValue numberOfCards;
protected PutCards putLookedCards;
protected boolean revealCards;
public LookLibraryControllerEffect() {
this(1);
}
public LookLibraryControllerEffect(int numberOfCards) {
this(StaticValue.get(numberOfCards));
}
public LookLibraryControllerEffect(DynamicValue numberOfCards) {
this(Outcome.Benefit, numberOfCards, PutCards.TOP_ANY);
}
public LookLibraryControllerEffect(Outcome outcome, DynamicValue numberOfCards, PutCards putLookedCards) {
super(outcome);
this.numberOfCards = numberOfCards;
this.putLookedCards = putLookedCards;
this.revealCards = false;
}
protected LookLibraryControllerEffect(final LookLibraryControllerEffect effect) {
super(effect);
this.numberOfCards = effect.numberOfCards.copy();
this.putLookedCards = effect.putLookedCards;
this.revealCards = effect.revealCards;
}
@Override
public LookLibraryControllerEffect copy() {
return new LookLibraryControllerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller == null) {
return false;
}
// take cards from library and look at them
boolean topCardRevealed = controller.isTopCardRevealed();
controller.setTopCardRevealed(false);
Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, numberOfCards.calculate(game, source, this)));
if (revealCards) {
controller.revealCards(source, cards, game);
} else {
controller.lookAtCards(source, null, cards, game);
}
boolean result = actionWithLookedCards(game, source, controller, cards);
controller.setTopCardRevealed(topCardRevealed);
return result;
}
protected boolean actionWithLookedCards(Game game, Ability source, Player player, Cards cards) {
return putLookedCards.moveCards(player, cards, source, game);
}
@Override
public String getText(Mode mode) {
return setText(mode, "");
}
public String setText(Mode mode, String middleText) {
if (staticText != null && !staticText.isEmpty()) {
return staticText;
}
String numberString = numberOfCards.toString();
boolean dynamic = !numberOfCards.getMessage().isEmpty();
boolean oneCard = !dynamic && numberString.equals("1");
StringBuilder sb = new StringBuilder(revealCards ? "reveal " : "look at ");
if (oneCard) {
sb.append("the top card");
} else if (dynamic) {
sb.append("the top X cards");
} else if (numberString.equals("that many")) {
sb.append("that many cards from the top");
} else {
sb.append("the top ").append(CardUtil.numberToText(numberString)).append(" cards");
}
sb.append(" of your library");
if (dynamic) {
sb.append(", where X is ").append(numberOfCards.getMessage());
}
if (!middleText.isEmpty()) {
sb.append(middleText);
} else if (!oneCard) {
sb.append(", then put them ");
sb.append(putLookedCards == PutCards.TOP_ANY ? "back in any order" : putLookedCards.getMessage(false, true));
}
return sb.toString();
}
}