Compare commits

...

21 Commits

Author SHA1 Message Date
Hans Mackowiak
0faae58c1d Merge branch 'master' into chooseColorEnum 2025-10-20 10:00:51 +02:00
Hans Mackowiak
6900bcb8dd Update StaticAbilityContinuous.java 2025-10-10 10:39:05 +02:00
Hans Mackowiak
7497e3e8cd Update CardFactory.java 2025-10-10 10:37:27 +02:00
Hans Mackowiak
93d9c78b8e Update SpellAbilityEffect.java 2025-10-10 10:35:43 +02:00
Hans Mackowiak
0cd9126b5c Update AbilityManaPart.java 2025-10-10 10:35:01 +02:00
Hans Mackowiak
ba47164862 Update CardState.java 2025-10-10 10:34:20 +02:00
Hans Mackowiak
0170f5fe56 Update Player.java 2025-10-10 10:33:37 +02:00
Hans Mackowiak
b07428c02a Update GameActionUtil.java 2025-10-10 10:32:48 +02:00
Hans Mackowiak
24242aa908 Merge branch 'master' into chooseColorEnum 2025-10-10 10:29:24 +02:00
Hans Mackowiak
07814d9e82 Update InputSelectCardsForConvokeOrImprovise.java 2025-09-16 16:43:54 +02:00
Hans Mackowiak
9bf45c2e62 Update PlayerControllerAi.java 2025-09-16 16:42:44 +02:00
Hans Mackowiak
31147739f1 Update ChangeTextEffect.java 2025-09-16 16:41:49 +02:00
Hans Mackowiak
74b1467837 Update ManaEffect.java 2025-09-16 16:37:42 +02:00
Hans Mackowiak
a85dc13cd8 Merge branch 'master' into chooseColorEnum 2025-09-16 16:33:35 +02:00
Hans Mackowiak
2ed01fb285 Player: use chooseColor instead for initCommanderColor 2025-09-15 14:13:12 +02:00
Hans Mackowiak
3621c02165 Player: unify 'choose a color before the game begins' 2025-09-15 14:13:12 +02:00
Hans Mackowiak
9e3f23315e CardState replace byte color with ColorSet 2025-09-15 14:13:12 +02:00
Hans Mackowiak
1033a0b595 remove some cases of ColorSet.iterator 2025-09-15 14:13:12 +02:00
Hans Mackowiak
b49efb28f9 PlayerController: chooseColor returns MagicColor.Color 2025-09-15 14:13:12 +02:00
Hans Mackowiak
07ee5ccddf PlayerControllerHuman: translate chooseColor 2025-09-15 14:13:12 +02:00
Hans Mackowiak
21e458237d MagicColor: use Enum for Human chooseColors 2025-09-15 14:13:12 +02:00
12 changed files with 88 additions and 116 deletions

View File

@@ -241,7 +241,8 @@ public class PlayerControllerAi extends PlayerController {
public Map<Byte, Integer> specifyManaCombo(SpellAbility sa, ColorSet colorSet, int manaAmount, boolean different) {
Map<Byte, Integer> result = new HashMap<>();
for (int i = 0; i < manaAmount; ++i) {
Byte chosen = chooseColor("", sa, colorSet);
MagicColor.Color chosenColor = chooseColor("", sa, colorSet);
Byte chosen = chosenColor == null ? (byte)0 : chosenColor.getColorMask();
if (result.containsKey(chosen)) {
result.put(chosen, result.get(chosen) + 1);
} else {
@@ -1022,19 +1023,22 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public byte chooseColorAllowColorless(String message, Card card, ColorSet colors) {
public MagicColor.Color chooseColorAllowColorless(String message, Card card, ColorSet colors) {
final String c = ComputerUtilCard.getMostProminentColor(player.getCardsIn(ZoneType.Hand));
byte chosenColorMask = MagicColor.fromName(c);
if ((colors.getColor() & chosenColorMask) != 0) {
return chosenColorMask;
return MagicColor.Color.fromByte(chosenColorMask);
}
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS).getColorMask();
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS);
}
@Override
public byte chooseColor(String message, SpellAbility sa, ColorSet colors) {
public MagicColor.Color chooseColor(String message, SpellAbility sa, ColorSet colors) {
if (colors.countColors() == 0) {
return null;
}
if (colors.countColors() < 2) {
return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
return Iterables.getFirst(colors, MagicColor.Color.WHITE);
}
// You may switch on sa.getApi() here and use sa.getParam("AILogic")
CardCollectionView hand = player.getCardsIn(ZoneType.Hand);
@@ -1045,9 +1049,9 @@ public class PlayerControllerAi extends PlayerController {
byte chosenColorMask = MagicColor.fromName(c);
if ((colors.getColor() & chosenColorMask) != 0) {
return chosenColorMask;
return MagicColor.Color.fromByte(chosenColorMask);
}
return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
return Iterables.getFirst(colors, MagicColor.Color.WHITE);
}
@Override

View File

@@ -1027,22 +1027,6 @@ public class DeckRecognizer {
};
}
/**
* Get the magic color by the localised/translated name.
* @param localisedName String of localised color name.
* @return The string of the magic color.
*/
public static String getColorNameByLocalisedName(String localisedName) {
Localizer localizer = Localizer.getInstance();
if(localisedName.equals(localizer.getMessage("lblWhite"))) return MagicColor.Constant.WHITE;
if(localisedName.equals(localizer.getMessage("lblBlue"))) return MagicColor.Constant.BLUE;
if(localisedName.equals(localizer.getMessage("lblBlack"))) return MagicColor.Constant.BLACK;
if(localisedName.equals(localizer.getMessage("lblRed"))) return MagicColor.Constant.RED;
if(localisedName.equals(localizer.getMessage("lblGreen"))) return MagicColor.Constant.GREEN;
return "";
}
public static boolean isDeckName(final String lineAsIs) {
if (lineAsIs == null)
return false;

View File

@@ -30,27 +30,28 @@ public class ChangeTextEffect extends SpellAbilityEffect {
final String changedColorWordOriginal, changedColorWordNew;
if (sa.hasParam("ChangeColorWord")) {
byte originalColor = 0;
// all instances are Choose Choose
MagicColor.Color originalColor = null;
final String[] changedColorWordsArray = sa.getParam("ChangeColorWord").split(" ");
if (changedColorWordsArray[0].equals("Choose")) {
originalColor = sa.getActivatingPlayer().getController().chooseColor(
Localizer.getInstance().getMessage("lblChooseColorReplace"), sa, ColorSet.WUBRG);
changedColorWordOriginal = TextUtil.capitalize(MagicColor.toLongString(originalColor));
changedColorWordOriginal = TextUtil.capitalize(originalColor.getName());
} else {
changedColorWordOriginal = changedColorWordsArray[0];
originalColor = MagicColor.fromName(changedColorWordOriginal);
originalColor = MagicColor.Color.fromByte(MagicColor.fromName(changedColorWordOriginal));
}
if (changedColorWordsArray[1].equals("Choose")) {
final ColorSet possibleNewColors;
if (originalColor == 0) { // no original color (ie. any or absent)
if (originalColor == null) { // no original color (ie. any or absent)
possibleNewColors = ColorSet.WUBRG;
} else { // may choose any except original color
possibleNewColors = ColorSet.fromMask(originalColor).inverse();
possibleNewColors = ColorSet.fromEnums(originalColor).inverse();
}
final byte newColor = sa.getActivatingPlayer().getController().chooseColor(
MagicColor.Color newColor = sa.getActivatingPlayer().getController().chooseColor(
Localizer.getInstance().getMessage("lblChooseNewColor"), sa, possibleNewColors);
changedColorWordNew = TextUtil.capitalize(MagicColor.toLongString(newColor));
changedColorWordNew = TextUtil.capitalize(newColor.getName());
} else {
changedColorWordNew = changedColorWordsArray[1];
}

View File

@@ -114,15 +114,15 @@ public class ManaEffect extends SpellAbilityEffect {
// just use the first possible color.
choice = colorsProduced[differentChoice ? nMana : 0];
} else {
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
MagicColor.Color chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
differentChoice && (colorsNeeded == null || colorsNeeded.length <= nMana) ? fullOptions : colorOptions);
if (chosenColor == 0)
if (chosenColor == null)
throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + p + " color mana choice is empty for " + card.getName());
if (differentChoice) {
fullOptions = ColorSet.fromMask(fullOptions.getColor() - chosenColor);
fullOptions = ColorSet.fromMask(fullOptions.getColor() - chosenColor.getColorMask());
}
choice = MagicColor.toShortString(chosenColor);
choice = chosenColor.getShortName();
}
if (nMana > 0) {
@@ -157,13 +157,13 @@ public class ManaEffect extends SpellAbilityEffect {
mask |= MagicColor.fromName(colorsNeeded.charAt(nChar));
}
colorMenu = mask == 0 ? ColorSet.WUBRG : ColorSet.fromMask(mask);
byte val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (0 == val) {
MagicColor.Color val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (val == null) {
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName());
}
game.getAction().notifyOfValue(sa, card, MagicColor.toSymbol(val), p);
abMana.setExpressChoice(MagicColor.toShortString(val));
game.getAction().notifyOfValue(sa, card, val.getSymbol(), p);
abMana.setExpressChoice(val.getShortName());
}
else if (abMana.isSpecialMana()) {
String type = abMana.getOrigProduced().split("Special ")[1];
@@ -178,22 +178,22 @@ public class ManaEffect extends SpellAbilityEffect {
for (ManaCostShard s : enchanted.getManaCost()) {
ColorSet cs = ColorSet.fromMask(s.getColorMask());
byte chosenColor;
MagicColor.Color chosenColor;
if (cs.isColorless())
continue;
if (s.isOr2Generic()) { // CR 106.8
chosenColor = chooser.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), card, cs);
if (chosenColor == MagicColor.COLORLESS) {
if (chosenColor == MagicColor.Color.COLORLESS) {
generic += 2;
continue;
}
}
else if (cs.isMonoColor())
chosenColor = s.getColorMask();
chosenColor = MagicColor.Color.fromByte(s.getColorMask());
else /* (cs.isMulticolor()) */ {
chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
}
sb.append(MagicColor.toShortString(chosenColor));
sb.append(chosenColor.getShortName());
sb.append(' ');
}
if (generic > 0) {
@@ -239,8 +239,8 @@ public class ManaEffect extends SpellAbilityEffect {
if (cs.isMonoColor())
sb.append(MagicColor.toShortString(s.getColorMask()));
else /* (cs.isMulticolor()) */ {
byte chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
sb.append(MagicColor.toShortString(chosenColor));
MagicColor.Color chosenColor = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
sb.append(chosenColor.getShortName());
}
}
}

View File

@@ -95,7 +95,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
}
if (mask == 0 && !expressChoiceColors.isEmpty() && colors.contains("colorless")) {
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromMask(mask)));
baseMana = player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromMask(mask)).getShortName();
} else {
// Nothing set previously so ask player if needed
if (mask == 0) {
@@ -105,18 +105,18 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
baseMana = MagicColor.toShortString(colors.iterator().next());
} else {
if (colors.contains("colorless")) {
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromNames(colors)));
baseMana = player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromNames(colors)).getShortName();
} else {
baseMana = MagicColor.toShortString(player.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, ColorSet.fromNames(colors)));
baseMana = player.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, ColorSet.fromNames(colors)).getShortName();
}
}
} else {
colorMenu = ColorSet.fromMask(mask);
byte color = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (color == 0) {
MagicColor.Color color = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (color == null) {
System.err.println("Unexpected behavior in ManaReflectedEffect: " + sa.getActivatingPlayer() + " - color mana choice is empty for " + sa.getHostCard().getName());
}
baseMana = MagicColor.toShortString(color);
baseMana = color.getShortName();
}
}

View File

@@ -34,15 +34,15 @@ public class ReplaceManaEffect extends SpellAbilityEffect {
// replace type and amount
replaced = sa.getParam("ReplaceMana");
if ("Any".equals(replaced)) {
byte rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
replaced = MagicColor.toShortString(rs);
MagicColor.Color rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
replaced = rs.getShortName();
}
} else if (sa.hasParam("ReplaceType")) {
// replace color and colorless
String color = sa.getParam("ReplaceType");
if ("Any".equals(color)) {
byte rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
color = MagicColor.toShortString(rs);
MagicColor.Color rs = player.getController().chooseColor("Choose a color", sa, ColorSet.WUBRG);
color = rs.getShortName();
} else {
// convert in case Color Word used
color = MagicColor.toShortString(color);

View File

@@ -1,16 +1,13 @@
package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.Lists;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameOutcome;
import forge.game.ability.AbilityKey;
import forge.game.ability.ApiType;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardCollectionView;
@@ -24,7 +21,6 @@ import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.collect.FCollectionView;
@@ -75,15 +71,7 @@ public class SubgameEffect extends SpellAbilityEffect {
for (final Card card : commandCards) {
if (card.isCommander()) {
Card cmd = Card.fromPaperCard(card.getPaperCard(), player);
if (cmd.hasKeyword("If CARDNAME is your commander, choose a color before the game begins.")) {
List<String> colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS);
String prompt = Localizer.getInstance().getMessage("lblChooseAColorFor", cmd.getName());
List<String> chosenColors;
SpellAbility cmdColorsa = new SpellAbility.EmptySa(ApiType.ChooseColor, cmd, player);
chosenColors = player.getController().chooseColors(prompt,cmdColorsa, 1, 1, colorChoices);
cmd.setChosenColors(chosenColors);
subgame.getAction().notifyOfValue(cmdColorsa, cmd, Localizer.getInstance().getMessage("lblPlayerPickedChosen", player.getName(), Lang.joinHomogenous(chosenColors)), player);
}
player.initCommanderColor(cmd);
com.add(cmd);
player.addCommander(cmd);
}

View File

@@ -3006,26 +3006,7 @@ public class Player extends GameEntity implements Comparable<Player> {
if (!registeredPlayer.getCommanders().isEmpty()) {
for (PaperCard pc : registeredPlayer.getCommanders()) {
Card cmd = Card.fromPaperCard(pc, this);
boolean color = false;
for (StaticAbility stAb : cmd.getStaticAbilities()) {
if (stAb.hasParam("Description") && stAb.getParam("Description")
.contains("If CARDNAME is your commander, choose a color before the game begins.")) {
color = true;
break;
}
}
if (color) {
Player p = cmd.getController();
List<String> colorChoices = new ArrayList<>(MagicColor.Constant.ONLY_COLORS);
String prompt = Localizer.getInstance().getMessage("lblChooseAColorFor", cmd.getName());
List<String> chosenColors;
SpellAbility cmdColorsa = new SpellAbility.EmptySa(ApiType.ChooseColor, cmd, p);
chosenColors = p.getController().chooseColors(prompt,cmdColorsa, 1, 1, colorChoices);
cmd.setChosenColors(chosenColors);
p.getGame().getAction().notifyOfValue(cmdColorsa, cmd,
Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(),
Lang.joinHomogenous(chosenColors)), p);
}
initCommanderColor(cmd);
cmd.setCollectible(true);
com.add(cmd);
this.addCommander(cmd);
@@ -3113,6 +3094,19 @@ public class Player extends GameEntity implements Comparable<Player> {
}
}
public void initCommanderColor(Card cmd) {
if (cmd.getStaticAbilities().stream().anyMatch(stAb -> stAb.hasParam("Description") && stAb.getParam("Description")
.contains("If CARDNAME is your commander, choose a color before the game begins."))) {
Player p = cmd.getController();
String prompt = Localizer.getInstance().getMessage("lblChooseAColorFor", cmd.getName());
SpellAbility cmdColorsa = new SpellAbility.EmptySa(ApiType.ChooseColor, cmd, p);
MagicColor.Color chosenColor = p.getController().chooseColor(prompt, cmdColorsa, ColorSet.WUBRG);
cmd.setChosenColors(List.of(chosenColor.getName()));
p.getGame().getAction().notifyOfValue(cmdColorsa, cmd,
Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosenColor.getName()), p);
}
}
public boolean allCardsUniqueManaSymbols() {
for (final Card c : getCardsIn(ZoneType.Library)) {
Set<CardStateName> cardStateNames = c.isSplitCard() ? EnumSet.of(CardStateName.LeftSplit, CardStateName.RightSplit) : EnumSet.of(CardStateName.Original);

View File

@@ -6,6 +6,7 @@ import com.google.common.collect.Multimap;
import forge.LobbyPlayer;
import forge.card.ColorSet;
import forge.card.ICardFace;
import forge.card.MagicColor;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.deck.Deck;
@@ -265,8 +266,8 @@ public abstract class PlayerController {
public abstract boolean chooseFlipResult(SpellAbility sa, Player flipper, boolean[] results, boolean call);
public abstract byte chooseColor(String message, SpellAbility sa, ColorSet colors);
public abstract byte chooseColorAllowColorless(String message, Card c, ColorSet colors);
public abstract MagicColor.Color chooseColor(String message, SpellAbility sa, ColorSet colors);
public abstract MagicColor.Color chooseColorAllowColorless(String message, Card c, ColorSet colors);
public abstract List<String> chooseColors(String message, SpellAbility sa, int min, int max, List<String> options);
public abstract ICardFace chooseSingleCardFace(SpellAbility sa, String message, Predicate<ICardFace> cpp, String name);

View File

@@ -470,13 +470,16 @@ public class PlayerControllerForTests extends PlayerController {
}
@Override
public byte chooseColor(String message, SpellAbility sa, ColorSet colors) {
return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
public MagicColor.Color chooseColor(String message, SpellAbility sa, ColorSet colors) {
if (colors.countColors() == 0) {
return null;
}
return Iterables.getFirst(colors, MagicColor.Color.WHITE);
}
@Override
public byte chooseColorAllowColorless(String message, Card card, ColorSet colors) {
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS).getColorMask();
public MagicColor.Color chooseColorAllowColorless(String message, Card card, ColorSet colors) {
return Iterables.getFirst(colors, MagicColor.Color.COLORLESS);
}
private CardCollection chooseItems(CardCollectionView items, int amount) {

View File

@@ -77,7 +77,7 @@ public final class InputSelectCardsForConvokeOrImprovise extends InputSelectMany
}
if (colors.isMulticolor()) {
//prompt user if more than one option for which color to pay towards convoke
chosenColor = player.getController().chooseColorAllowColorless("Convoke " + card.toString() + " for which color?", card, colors);
chosenColor = player.getController().chooseColorAllowColorless("Convoke " + card.toString() + " for which color?", card, colors).getColorMask();
} else {
// Since the convoke mana logic can use colored mana as generic if needed,
// there is no need to prompt the user when convoking with a mono-color creature.

View File

@@ -10,7 +10,6 @@ import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckRecognizer;
import forge.deck.DeckSection;
import forge.game.*;
import forge.game.ability.AbilityKey;
@@ -1836,53 +1835,51 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
@Override
public List<String> chooseColors(final String message, final SpellAbility sa, final int min, final int max,
List<String> options) {
options = options.stream().map(DeckRecognizer::getLocalisedMagicColorName).collect(Collectors.toList());
List<String> choices = getGui().getChoices(message, min, max, options);
return choices.stream().map(DeckRecognizer::getColorNameByLocalisedName).collect(Collectors.toList());
List<MagicColor.Color> enumOptions = options.stream().map(s -> MagicColor.Color.fromByte(MagicColor.fromName(s))).collect(Collectors.toList());
List<MagicColor.Color> enumChoices = getGui().getChoices(message, min, max, enumOptions);
return enumChoices.stream().map(MagicColor.Color::getName).collect(Collectors.toList());
}
@Override
public byte chooseColor(final String message, final SpellAbility sa, final ColorSet colors) {
public MagicColor.Color chooseColor(final String message, final SpellAbility sa, final ColorSet colors) {
final int cntColors = colors.countColors();
switch (cntColors) {
case 0:
return 0;
return null;
case 1:
return colors.getColor();
return MagicColor.Color.fromByte(colors.getColor());
default:
return chooseColorCommon(message, sa == null ? null : sa.getHostCard(), colors, false);
}
}
@Override
public byte chooseColorAllowColorless(final String message, final Card c, final ColorSet colors) {
public MagicColor.Color chooseColorAllowColorless(final String message, final Card c, final ColorSet colors) {
final int cntColors = 1 + colors.countColors();
switch (cntColors) {
case 1:
return 0;
return MagicColor.Color.COLORLESS;
default:
return chooseColorCommon(message, c, colors, true);
}
}
private byte chooseColorCommon(final String message, final Card c, final ColorSet colors,
private MagicColor.Color chooseColorCommon(final String message, final Card c, final ColorSet colors,
final boolean withColorless) {
final ImmutableList.Builder<String> colorNamesBuilder = ImmutableList.builder();
if (withColorless) {
colorNamesBuilder.add(MagicColor.toLongString(MagicColor.COLORLESS));
List<MagicColor.Color> options = Lists.newArrayList(colors.toEnumSet());
if (withColorless && colors.countColors() > 0) {
options.add(MagicColor.Color.COLORLESS);
}
for (final MagicColor.Color color : colors) {
colorNamesBuilder.add(color.getName());
}
final ImmutableList<String> colorNames = colorNamesBuilder.build();
if (colorNames.size() > 2) {
return MagicColor.fromName(getGui().one(message, colorNames));
if (options.size() > 2) {
return getGui().one(message, options);
}
boolean confirmed = false;
confirmed = InputConfirm.confirm(this, CardView.get(c), message, true, colorNames);
confirmed = InputConfirm.confirm(this, CardView.get(c), message, true,
options.stream().map(MagicColor.Color::toString).collect(Collectors.toList()));
final int idxChosen = confirmed ? 0 : 1;
return MagicColor.fromName(colorNames.get(idxChosen));
return options.get(idxChosen);
}
@Override