ColorSet: turn Set into an Enum (#8757)

This commit is contained in:
Hans Mackowiak
2025-10-09 15:03:45 +02:00
committed by GitHub
parent 1962a8d28b
commit f8d883d91f
28 changed files with 138 additions and 254 deletions

View File

@@ -710,9 +710,9 @@ public class ComputerUtilMana {
if (hasConverge && if (hasConverge &&
(toPay == ManaCostShard.GENERIC || toPay == ManaCostShard.X)) { (toPay == ManaCostShard.GENERIC || toPay == ManaCostShard.X)) {
final int unpaidColors = cost.getUnpaidColors() + cost.getColorsPaid() ^ ManaCostShard.COLORS_SUPERPOSITION; final int unpaidColors = cost.getUnpaidColors() + cost.getColorsPaid() ^ ManaCostShard.COLORS_SUPERPOSITION;
for (final byte b : ColorSet.fromMask(unpaidColors)) { for (final MagicColor.Color b : ColorSet.fromMask(unpaidColors)) {
// try and pay other colors for converge // try and pay other colors for converge
final ManaCostShard shard = ManaCostShard.valueOf(b); final ManaCostShard shard = ManaCostShard.valueOf(b.getColorMask());
saList = sourcesForShards.get(shard); saList = sourcesForShards.get(shard);
if (saList != null && !saList.isEmpty()) { if (saList != null && !saList.isEmpty()) {
toPay = shard; toPay = shard;
@@ -896,7 +896,8 @@ public class ComputerUtilMana {
if (hasConverge) { if (hasConverge) {
// add extra colors for paying converge // add extra colors for paying converge
final int unpaidColors = cost.getUnpaidColors() + cost.getColorsPaid() ^ ManaCostShard.COLORS_SUPERPOSITION; final int unpaidColors = cost.getUnpaidColors() + cost.getColorsPaid() ^ ManaCostShard.COLORS_SUPERPOSITION;
for (final byte b : ColorSet.fromMask(unpaidColors)) { for (final MagicColor.Color color : ColorSet.fromMask(unpaidColors)) {
final byte b = color.getColorMask();
final ManaCostShard shard = ManaCostShard.valueOf(b); final ManaCostShard shard = ManaCostShard.valueOf(b);
if (!sourcesForShards.containsKey(shard)) { if (!sourcesForShards.containsKey(shard)) {
if (ai.getManaPool().canPayForShardWithColor(shard, b)) { if (ai.getManaPool().canPayForShardWithColor(shard, b)) {
@@ -923,7 +924,7 @@ public class ComputerUtilMana {
ColorSet shared = ColorSet.fromMask(toPay.getColorMask()).getSharedColors(ColorSet.fromNames(m.getComboColors(saPayment).split(" "))); ColorSet shared = ColorSet.fromMask(toPay.getColorMask()).getSharedColors(ColorSet.fromNames(m.getComboColors(saPayment).split(" ")));
// but other effects might still lead to a more permissive payment // but other effects might still lead to a more permissive payment
if (!shared.isColorless()) { if (!shared.isColorless()) {
m.setExpressChoice(ColorSet.fromMask(shared.iterator().next())); m.setExpressChoice(shared.iterator().next().getShortName());
} }
getComboManaChoice(ai, saPayment, sa, cost); getComboManaChoice(ai, saPayment, sa, cost);
} }
@@ -1098,7 +1099,7 @@ public class ComputerUtilMana {
// * pay hybrids // * pay hybrids
// * pay phyrexian, keep mana for colorless // * pay phyrexian, keep mana for colorless
// * pay generic // * pay generic
return cost.getShardToPayByPriority(shardsToPay, ColorSet.ALL_COLORS.getColor()); return cost.getShardToPayByPriority(shardsToPay, ColorSet.WUBRG.getColor());
} }
private static void adjustManaCostToAvoidNegEffects(ManaCostBeingPaid cost, final Card card, Player ai) { private static void adjustManaCostToAvoidNegEffects(ManaCostBeingPaid cost, final Card card, Player ai) {

View File

@@ -1028,13 +1028,13 @@ public class PlayerControllerAi extends PlayerController {
if ((colors.getColor() & chosenColorMask) != 0) { if ((colors.getColor() & chosenColorMask) != 0) {
return chosenColorMask; return chosenColorMask;
} }
return Iterables.getFirst(colors, (byte)0); return Iterables.getFirst(colors, MagicColor.Color.COLORLESS).getColorMask();
} }
@Override @Override
public byte chooseColor(String message, SpellAbility sa, ColorSet colors) { public byte chooseColor(String message, SpellAbility sa, ColorSet colors) {
if (colors.countColors() < 2) { if (colors.countColors() < 2) {
return Iterables.getFirst(colors, MagicColor.WHITE); return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
} }
// You may switch on sa.getApi() here and use sa.getParam("AILogic") // You may switch on sa.getApi() here and use sa.getParam("AILogic")
CardCollectionView hand = player.getCardsIn(ZoneType.Hand); CardCollectionView hand = player.getCardsIn(ZoneType.Hand);
@@ -1047,7 +1047,7 @@ public class PlayerControllerAi extends PlayerController {
if ((colors.getColor() & chosenColorMask) != 0) { if ((colors.getColor() & chosenColorMask) != 0) {
return chosenColorMask; return chosenColorMask;
} }
return Iterables.getFirst(colors, MagicColor.WHITE); return Iterables.getFirst(colors, MagicColor.Color.WHITE).getColorMask();
} }
@Override @Override

View File

@@ -17,14 +17,12 @@
*/ */
package forge.card; package forge.card;
import com.google.common.collect.UnmodifiableIterator;
import forge.card.MagicColor.Color; import forge.card.MagicColor.Color;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.util.BinaryUtil; import forge.util.BinaryUtil;
import java.io.Serializable; import java.io.Serializable;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
@@ -37,90 +35,56 @@ import java.util.stream.Stream;
* *
* *
*/ */
public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Serializable { public enum ColorSet implements Iterable<Color>, Serializable {
C(Color.COLORLESS),
W(Color.WHITE),
U(Color.BLUE),
WU(Color.WHITE, Color.BLUE),
B(Color.BLACK),
WB(Color.WHITE, Color.BLACK),
UB(Color.BLUE, Color.BLACK),
WUB(Color.WHITE, Color.BLUE, Color.BLACK),
R(Color.RED),
RW(Color.RED, Color.WHITE),
UR(Color.BLUE, Color.RED),
URW(Color.BLUE, Color.RED, Color.WHITE),
BR(Color.BLACK, Color.RED),
RWB(Color.RED, Color.WHITE, Color.BLACK),
UBR(Color.BLUE, Color.BLACK, Color.RED),
WUBR(Color.WHITE, Color.BLUE, Color.BLACK, Color.RED),
G(Color.GREEN),
GW(Color.GREEN, Color.WHITE),
GU(Color.GREEN, Color.BLUE),
GWU(Color.GREEN, Color.WHITE, Color.BLUE),
BG(Color.BLACK, Color.GREEN),
WBG(Color.WHITE, Color.BLACK, Color.GREEN),
BGU(Color.BLACK, Color.GREEN, Color.BLUE),
GWUB(Color.GREEN, Color.WHITE, Color.BLUE, Color.BLACK),
RG(Color.RED, Color.GREEN),
RGW(Color.RED, Color.GREEN, Color.WHITE),
GUR(Color.GREEN, Color.BLUE, Color.RED),
RGWU(Color.RED, Color.GREEN, Color.WHITE, Color.BLUE),
BRG(Color.BLACK, Color.RED, Color.GREEN),
BRGW(Color.BLACK, Color.RED, Color.GREEN, Color.WHITE),
UBRG(Color.BLUE, Color.BLACK, Color.RED, Color.GREEN),
WUBRG(Color.WHITE, Color.BLUE, Color.BLACK, Color.RED, Color.GREEN)
;
private static final long serialVersionUID = 794691267379929080L; private static final long serialVersionUID = 794691267379929080L;
// needs to be before other static // needs to be before other static
private static final ColorSet[] cache = new ColorSet[MagicColor.ALL_COLORS + 1];
static {
byte COLORLESS = MagicColor.COLORLESS;
byte WHITE = MagicColor.WHITE;
byte BLUE = MagicColor.BLUE;
byte BLACK = MagicColor.BLACK;
byte RED = MagicColor.RED;
byte GREEN = MagicColor.GREEN;
Color C = Color.COLORLESS;
Color W = Color.WHITE;
Color U = Color.BLUE;
Color B = Color.BLACK;
Color R = Color.RED;
Color G = Color.GREEN;
//colorless
cache[COLORLESS] = new ColorSet(C);
//mono-color
cache[WHITE] = new ColorSet(W);
cache[BLUE] = new ColorSet(U);
cache[BLACK] = new ColorSet(B);
cache[RED] = new ColorSet(R);
cache[GREEN] = new ColorSet(G);
//two-color
cache[WHITE | BLUE] = new ColorSet(W, U);
cache[WHITE | BLACK] = new ColorSet(W, B);
cache[BLUE | BLACK] = new ColorSet(U, B);
cache[BLUE | RED] = new ColorSet(U, R);
cache[BLACK | RED] = new ColorSet(B, R);
cache[BLACK | GREEN] = new ColorSet(B, G);
cache[RED | GREEN] = new ColorSet(R, G);
cache[RED | WHITE] = new ColorSet(R, W);
cache[GREEN | WHITE] = new ColorSet(G, W);
cache[GREEN | BLUE] = new ColorSet(G, U);
//three-color
cache[WHITE | BLUE | BLACK] = new ColorSet(W, U, B);
cache[WHITE | BLACK | GREEN] = new ColorSet(W, B, G);
cache[BLUE | BLACK | RED] = new ColorSet(U, B, R);
cache[BLUE | RED | WHITE] = new ColorSet(U, R, W);
cache[BLACK | RED | GREEN] = new ColorSet(B, R, G);
cache[BLACK | GREEN | BLUE] = new ColorSet(B, G, U);
cache[RED | GREEN | WHITE] = new ColorSet(R, G, W);
cache[RED | WHITE | BLACK] = new ColorSet(R, W, B);
cache[GREEN | WHITE | BLUE] = new ColorSet(G, W, U);
cache[GREEN | BLUE | RED] = new ColorSet(G, U, R);
//four-color
cache[WHITE | BLUE | BLACK | RED] = new ColorSet(W, U, B, R);
cache[BLUE | BLACK | RED | GREEN] = new ColorSet(U, B, R, G);
cache[BLACK | RED | GREEN | WHITE] = new ColorSet(B, R, G, W);
cache[RED | GREEN | WHITE | BLUE] = new ColorSet(R, G, W, U);
cache[GREEN | WHITE | BLUE | BLACK] = new ColorSet(G, W, U, B);
//five-color
cache[WHITE | BLUE | BLACK | RED | GREEN] = new ColorSet(W, U, B, R, G);
}
private final Collection<Color> orderedShards; private final Collection<Color> orderedShards;
private final byte myColor;
private final float orderWeight; private final float orderWeight;
private final Set<Color> enumSet;
private final String desc;
public static final ColorSet ALL_COLORS = fromMask(MagicColor.ALL_COLORS);
public static final ColorSet NO_COLORS = fromMask(MagicColor.COLORLESS);
private ColorSet(final Color... ordered) { private ColorSet(final Color... ordered) {
this.orderedShards = Arrays.asList(ordered); this.orderedShards = Arrays.asList(ordered);
this.myColor = orderedShards.stream().map(Color::getColorMask).reduce((byte)0, (a, b) -> (byte)(a | b)); this.orderWeight = this.calcOrderWeight();
this.orderWeight = this.getOrderWeight();
this.enumSet = EnumSet.copyOf(orderedShards);
this.desc = orderedShards.stream().map(Color::getShortName).collect(Collectors.joining());
} }
public static ColorSet fromMask(final int mask) { public static ColorSet fromMask(final int mask) {
final int mask32 = mask & MagicColor.ALL_COLORS; final int mask32 = mask & MagicColor.ALL_COLORS;
return cache[mask32]; return values()[mask32];
} }
public static ColorSet fromEnums(final Color... colors) { public static ColorSet fromEnums(final Color... colors) {
@@ -167,7 +131,10 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* @return true, if successful * @return true, if successful
*/ */
public boolean hasAnyColor(final int colormask) { public boolean hasAnyColor(final int colormask) {
return (this.myColor & colormask) != 0; return (this.ordinal() & colormask) != 0;
}
public boolean hasAnyColor(final Color c) {
return this.orderedShards.contains(c);
} }
/** /**
@@ -178,12 +145,12 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* @return true, if successful * @return true, if successful
*/ */
public boolean hasAllColors(final int colormask) { public boolean hasAllColors(final int colormask) {
return (this.myColor & colormask) == colormask; return (this.ordinal() & colormask) == colormask;
} }
/** this has exactly the colors defined by operand. */ /** this has exactly the colors defined by operand. */
public boolean hasExactlyColor(final int colormask) { public boolean hasExactlyColor(final int colormask) {
return this.myColor == colormask; return this.ordinal() == colormask;
} }
/** this has no other colors except defined by operand. */ /** this has no other colors except defined by operand. */
@@ -193,17 +160,17 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
/** this has no other colors except defined by operand. */ /** this has no other colors except defined by operand. */
public boolean hasNoColorsExcept(final int colormask) { public boolean hasNoColorsExcept(final int colormask) {
return (this.myColor & ~colormask) == 0; return (this.ordinal() & ~colormask) == 0;
} }
/** This returns the colors that colormask contains that are not in color */ /** This returns the colors that colormask contains that are not in color */
public ColorSet getMissingColors(final byte colormask) { public ColorSet getMissingColors(final byte colormask) {
return fromMask(this.myColor & ~colormask); return fromMask(this.ordinal() & ~colormask);
} }
/** Operand has no other colors except defined by this. */ /** Operand has no other colors except defined by this. */
public boolean containsAllColorsFrom(final int colorProfile) { public boolean containsAllColorsFrom(final int colorProfile) {
return (~this.myColor & colorProfile) == 0; return (~this.ordinal() & colorProfile) == 0;
} }
/** /**
@@ -212,7 +179,7 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* @return the int * @return the int
*/ */
public int countColors() { public int countColors() {
return BinaryUtil.bitCount(this.myColor); return BinaryUtil.bitCount(this.ordinal());
} // bit count } // bit count
// order has to be: W U B R G multi colorless - same as cards numbering // order has to be: W U B R G multi colorless - same as cards numbering
@@ -222,7 +189,7 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* *
* @return the order weight * @return the order weight
*/ */
private float getOrderWeight() { private float calcOrderWeight() {
float res = this.countColors(); float res = this.countColors();
if (hasWhite()) { if (hasWhite()) {
res += 0.0005f; res += 0.0005f;
@@ -241,6 +208,10 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
} }
return res; return res;
} }
public float getOrderWeight()
{
return orderWeight;
}
/** /**
* Checks if is colorless. * Checks if is colorless.
@@ -248,7 +219,7 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* @return true, if is colorless * @return true, if is colorless
*/ */
public boolean isColorless() { public boolean isColorless() {
return this.myColor == 0; return this == C;
} }
/** /**
@@ -266,7 +237,7 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* @return true, if is all colors * @return true, if is all colors
*/ */
public boolean isAllColors() { public boolean isAllColors() {
return this == ALL_COLORS; return this == WUBRG;
} }
/** /**
@@ -286,17 +257,7 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* @return true, if is equal * @return true, if is equal
*/ */
public boolean isEqual(final byte color) { public boolean isEqual(final byte color) {
return color == this.myColor; return color == this.ordinal();
}
/*
* (non-Javadoc)
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(final ColorSet other) {
return Float.compare(this.orderWeight, other.orderWeight);
} }
// Presets // Presets
@@ -346,23 +307,13 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
} }
public ColorSet inverse() { public ColorSet inverse() {
byte mask = this.myColor; byte mask = (byte)this.ordinal();
mask ^= MagicColor.ALL_COLORS; mask ^= MagicColor.ALL_COLORS;
return fromMask(mask); return fromMask(mask);
} }
public byte getColor() { public byte getColor() {
return myColor; return (byte)ordinal();
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return desc;
} }
/** /**
@@ -372,7 +323,7 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
* @return true, if successful * @return true, if successful
*/ */
public boolean sharesColorWith(final ColorSet ccOther) { public boolean sharesColorWith(final ColorSet ccOther) {
return (this.myColor & ccOther.myColor) != 0; return (this.ordinal() & ccOther.ordinal()) != 0;
} }
public ColorSet getSharedColors(final ColorSet ccOther) { public ColorSet getSharedColors(final ColorSet ccOther) {
@@ -380,50 +331,20 @@ public final class ColorSet implements Comparable<ColorSet>, Iterable<Byte>, Ser
} }
public ColorSet getOffColors(final ColorSet ccOther) { public ColorSet getOffColors(final ColorSet ccOther) {
return fromMask(~this.myColor & ccOther.myColor); return fromMask(~this.ordinal() & ccOther.ordinal());
} }
public Set<Color> toEnumSet() { public Set<Color> toEnumSet() {
return EnumSet.copyOf(enumSet); return EnumSet.copyOf(orderedShards);
} }
@Override //@Override
public Iterator<Byte> iterator() { public Iterator<Color> iterator() {
return new ColorIterator(); return this.orderedShards.iterator();
}
private class ColorIterator extends UnmodifiableIterator<Byte> {
int currentBit = -1;
private int getIndexOfNextColor(){
int nextBit = currentBit + 1;
while (nextBit < MagicColor.NUMBER_OR_COLORS) {
if ((myColor & MagicColor.WUBRG[nextBit]) != 0) {
break;
}
nextBit++;
}
return nextBit;
}
@Override
public boolean hasNext() {
return getIndexOfNextColor() < MagicColor.NUMBER_OR_COLORS;
}
@Override
public Byte next() {
currentBit = getIndexOfNextColor();
if (currentBit >= MagicColor.NUMBER_OR_COLORS) {
throw new NoSuchElementException();
}
return MagicColor.WUBRG[currentBit];
}
} }
public Stream<Color> stream() { public Stream<Color> stream() {
return this.toEnumSet().stream(); return this.orderedShards.stream();
} }
//Get array of mana cost shards for color set in the proper order //Get array of mana cost shards for color set in the proper order

View File

@@ -593,7 +593,7 @@ public class PaperCard implements Comparable<IPaperCard>, InventoryItemFromSet,
public PaperCardFlags withMarkedColors(ColorSet markedColors) { public PaperCardFlags withMarkedColors(ColorSet markedColors) {
if(markedColors == null) if(markedColors == null)
markedColors = ColorSet.NO_COLORS; markedColors = ColorSet.C;
return new PaperCardFlags(this, markedColors, null); return new PaperCardFlags(this, markedColors, null);
} }

View File

@@ -112,25 +112,19 @@ public abstract class PaperCardPredicates {
} }
private static final class PredicateColor implements Predicate<PaperCard> { private static final class PredicateColor implements Predicate<PaperCard> {
private final byte operand; private final MagicColor.Color operand;
private PredicateColor(final byte color) { private PredicateColor(final MagicColor.Color color) {
this.operand = color; this.operand = color;
} }
@Override @Override
public boolean test(final PaperCard card) { public boolean test(final PaperCard card) {
for (final byte color : card.getRules().getColor()) { if (card.getRules().getColor().hasAnyColor(operand)) {
if (color == operand) { return true;
return true;
}
} }
if (card.getRules().getType().hasType(CardType.CoreType.Land)) { if (card.getRules().getType().hasType(CardType.CoreType.Land) && card.getRules().getColorIdentity().hasAnyColor(operand)) {
for (final byte color : card.getRules().getColorIdentity()) { return true;
if (color == operand) {
return true;
}
}
} }
return false; return false;
} }
@@ -235,11 +229,11 @@ public abstract class PaperCardPredicates {
public static final Predicate<PaperCard> IS_RARE_OR_MYTHIC = PaperCardPredicates.IS_RARE.or(PaperCardPredicates.IS_MYTHIC_RARE); public static final Predicate<PaperCard> IS_RARE_OR_MYTHIC = PaperCardPredicates.IS_RARE.or(PaperCardPredicates.IS_MYTHIC_RARE);
public static final Predicate<PaperCard> IS_SPECIAL = new PredicateRarity(CardRarity.Special); public static final Predicate<PaperCard> IS_SPECIAL = new PredicateRarity(CardRarity.Special);
public static final Predicate<PaperCard> IS_BASIC_LAND_RARITY = new PredicateRarity(CardRarity.BasicLand); public static final Predicate<PaperCard> IS_BASIC_LAND_RARITY = new PredicateRarity(CardRarity.BasicLand);
public static final Predicate<PaperCard> IS_BLACK = new PredicateColor(MagicColor.BLACK); public static final Predicate<PaperCard> IS_BLACK = new PredicateColor(MagicColor.Color.BLACK);
public static final Predicate<PaperCard> IS_BLUE = new PredicateColor(MagicColor.BLUE); public static final Predicate<PaperCard> IS_BLUE = new PredicateColor(MagicColor.Color.BLUE);
public static final Predicate<PaperCard> IS_GREEN = new PredicateColor(MagicColor.GREEN); public static final Predicate<PaperCard> IS_GREEN = new PredicateColor(MagicColor.Color.GREEN);
public static final Predicate<PaperCard> IS_RED = new PredicateColor(MagicColor.RED); public static final Predicate<PaperCard> IS_RED = new PredicateColor(MagicColor.Color.RED);
public static final Predicate<PaperCard> IS_WHITE = new PredicateColor(MagicColor.WHITE); public static final Predicate<PaperCard> IS_WHITE = new PredicateColor(MagicColor.Color.WHITE);
public static final Predicate<PaperCard> IS_COLORLESS = paperCard -> paperCard.getRules().getColor().isColorless(); public static final Predicate<PaperCard> IS_COLORLESS = paperCard -> paperCard.getRules().getColor().isColorless();
public static final Predicate<PaperCard> IS_UNREBALANCED = PaperCard::isUnRebalanced; public static final Predicate<PaperCard> IS_UNREBALANCED = PaperCard::isUnRebalanced;
public static final Predicate<PaperCard> IS_REBALANCED = PaperCard::isRebalanced; public static final Predicate<PaperCard> IS_REBALANCED = PaperCard::isRebalanced;

View File

@@ -35,7 +35,7 @@ public class ForgeScript {
boolean withSource = property.endsWith("Source"); boolean withSource = property.endsWith("Source");
final ColorSet colors; final ColorSet colors;
if (withSource && StaticAbilityColorlessDamageSource.colorlessDamageSource(cardState)) { if (withSource && StaticAbilityColorlessDamageSource.colorlessDamageSource(cardState)) {
colors = ColorSet.NO_COLORS; colors = ColorSet.C;
} else { } else {
colors = cardState.getCard().getColor(cardState); colors = cardState.getCard().getColor(cardState);
} }

View File

@@ -34,7 +34,7 @@ public class ChangeTextEffect extends SpellAbilityEffect {
final String[] changedColorWordsArray = sa.getParam("ChangeColorWord").split(" "); final String[] changedColorWordsArray = sa.getParam("ChangeColorWord").split(" ");
if (changedColorWordsArray[0].equals("Choose")) { if (changedColorWordsArray[0].equals("Choose")) {
originalColor = sa.getActivatingPlayer().getController().chooseColor( originalColor = sa.getActivatingPlayer().getController().chooseColor(
Localizer.getInstance().getMessage("lblChooseColorReplace"), sa, ColorSet.ALL_COLORS); Localizer.getInstance().getMessage("lblChooseColorReplace"), sa, ColorSet.WUBRG);
changedColorWordOriginal = TextUtil.capitalize(MagicColor.toLongString(originalColor)); changedColorWordOriginal = TextUtil.capitalize(MagicColor.toLongString(originalColor));
} else { } else {
changedColorWordOriginal = changedColorWordsArray[0]; changedColorWordOriginal = changedColorWordsArray[0];
@@ -44,7 +44,7 @@ public class ChangeTextEffect extends SpellAbilityEffect {
if (changedColorWordsArray[1].equals("Choose")) { if (changedColorWordsArray[1].equals("Choose")) {
final ColorSet possibleNewColors; final ColorSet possibleNewColors;
if (originalColor == 0) { // no original color (ie. any or absent) if (originalColor == 0) { // no original color (ie. any or absent)
possibleNewColors = ColorSet.ALL_COLORS; possibleNewColors = ColorSet.WUBRG;
} else { // may choose any except original color } else { // may choose any except original color
possibleNewColors = ColorSet.fromMask(originalColor).inverse(); possibleNewColors = ColorSet.fromMask(originalColor).inverse();
} }

View File

@@ -156,7 +156,7 @@ public class ManaEffect extends SpellAbilityEffect {
for (int nChar = 0; nChar < colorsNeeded.length(); nChar++) { for (int nChar = 0; nChar < colorsNeeded.length(); nChar++) {
mask |= MagicColor.fromName(colorsNeeded.charAt(nChar)); mask |= MagicColor.fromName(colorsNeeded.charAt(nChar));
} }
colorMenu = mask == 0 ? ColorSet.ALL_COLORS : ColorSet.fromMask(mask); colorMenu = mask == 0 ? ColorSet.WUBRG : ColorSet.fromMask(mask);
byte val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu); byte val = chooser.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (0 == val) { if (0 == val) {
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName()); throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName());

View File

@@ -124,8 +124,8 @@ public class ProtectEffect extends SpellAbilityEffect {
} }
} else if (sa.getParam("Gains").startsWith("Defined")) { } else if (sa.getParam("Gains").startsWith("Defined")) {
CardCollection def = AbilityUtils.getDefinedCards(host, sa.getParam("Gains").substring(8), sa); CardCollection def = AbilityUtils.getDefinedCards(host, sa.getParam("Gains").substring(8), sa);
for (final Byte color : def.get(0).getColor()) { for (final MagicColor.Color color : def.get(0).getColor()) {
gains.add(MagicColor.toLongString(color)); gains.add(color.getName());
} }
} else { } else {
gains.addAll(choices); gains.addAll(choices);

View File

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

View File

@@ -2271,7 +2271,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars, ITr
public final ColorSet getMarkedColors() { public final ColorSet getMarkedColors() {
if (markedColor == null) { if (markedColor == null) {
return ColorSet.NO_COLORS; return ColorSet.C;
} }
return markedColor; return markedColor;
} }

View File

@@ -27,7 +27,7 @@ public class AchievementTracker {
activatedNonPWUltimates.add(card.getName()); activatedNonPWUltimates.add(card.getName());
} }
} }
if (card.getColor().equals(ColorSet.ALL_COLORS)) { if (card.getColor().equals(ColorSet.WUBRG)) {
challengesCompleted.add("Chromatic"); challengesCompleted.add("Chromatic");
} }
} }

View File

@@ -17,7 +17,6 @@
*/ */
package forge.game.spellability; package forge.game.spellability;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.GamePieceType; import forge.card.GamePieceType;
@@ -49,9 +48,9 @@ import forge.game.zone.ZoneType;
import forge.util.TextUtil; import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
@@ -658,8 +657,8 @@ public class AbilityManaPart implements java.io.Serializable {
} }
// replace Chosen for Spire colors // replace Chosen for Spire colors
if (origProduced.contains("ColorID")) { if (origProduced.contains("ColorID")) {
Iterator<String> colors = Iterators.transform(sa.getHostCard().getMarkedColors().iterator(), MagicColor::toLongString); String str = sa.getHostCard().getMarkedColors().stream().map(c -> c.getShortName()).collect(Collectors.joining(" "));
origProduced = origProduced.replace("ColorID", getChosenColor(sa, () -> colors)); origProduced = origProduced.replace("ColorID", str);
} }
if (origProduced.contains("NotedColors")) { if (origProduced.contains("NotedColors")) {
// Should only be used for Paliano, the High City // Should only be used for Paliano, the High City

View File

@@ -207,12 +207,12 @@ public final class StaticAbilityContinuous {
if (input.contains("CommanderColorID")) { if (input.contains("CommanderColorID")) {
if (!hostCard.getController().getCommanders().isEmpty()) { if (!hostCard.getController().getCommanders().isEmpty()) {
if (input.contains("NotCommanderColorID")) { if (input.contains("NotCommanderColorID")) {
for (Byte color : hostCard.getController().getNotCommanderColorID()) { for (MagicColor.Color color : hostCard.getController().getNotCommanderColorID()) {
newKeywords.add(input.replace("NotCommanderColorID", MagicColor.toLongString(color))); newKeywords.add(input.replace("NotCommanderColorID", color.getName()));
} }
return true; return true;
} else for (Byte color : hostCard.getController().getCommanderColorID()) { } else for (MagicColor.Color color : hostCard.getController().getCommanderColorID()) {
newKeywords.add(input.replace("CommanderColorID", MagicColor.toLongString(color))); newKeywords.add(input.replace("CommanderColorID", color.getName()));
} }
return true; return true;
} }
@@ -220,12 +220,9 @@ public final class StaticAbilityContinuous {
} }
// two variants for Red vs. red in keyword // two variants for Red vs. red in keyword
if (input.contains("ColorsYouCtrl") || input.contains("colorsYouCtrl")) { if (input.contains("ColorsYouCtrl") || input.contains("colorsYouCtrl")) {
final ColorSet colorsYouCtrl = CardUtil.getColorsFromCards(controller.getCardsIn(ZoneType.Battlefield)); for (MagicColor.Color color : CardUtil.getColorsFromCards(controller.getCardsIn(ZoneType.Battlefield))) {
String y = input.replaceAll("ColorsYouCtrl", StringUtils.capitalize(color.getName()));
for (byte color : colorsYouCtrl) { y = y.replaceAll("colorsYouCtrl", color.getName());
final String colorWord = MagicColor.toLongString(color);
String y = input.replaceAll("ColorsYouCtrl", StringUtils.capitalize(colorWord));
y = y.replaceAll("colorsYouCtrl", colorWord);
newKeywords.add(y); newKeywords.add(y);
} }
return true; return true;
@@ -709,8 +706,8 @@ public final class StaticAbilityContinuous {
newKeywords.removeIf(input -> { newKeywords.removeIf(input -> {
// replace one Keyword with list of keywords // replace one Keyword with list of keywords
if (input.startsWith("Protection") && input.contains("CardColors")) { if (input.startsWith("Protection") && input.contains("CardColors")) {
for (Byte color : affectedCard.getColor()) { for (MagicColor.Color color : affectedCard.getColor()) {
extraKeywords.add(input.replace("CardColors", MagicColor.toLongString(color))); extraKeywords.add(input.replace("CardColors", color.getName()));
} }
return true; return true;
} }
@@ -924,7 +921,7 @@ public final class StaticAbilityContinuous {
addColors = ColorSet.fromNames(hostCard.getChosenColors()); addColors = ColorSet.fromNames(hostCard.getChosenColors());
} }
} else if (colors.equals("All")) { } else if (colors.equals("All")) {
addColors = ColorSet.ALL_COLORS; addColors = ColorSet.WUBRG;
} else { } else {
addColors = ColorSet.fromNames(colors.split(" & ")); addColors = ColorSet.fromNames(colors.split(" & "));
} }

View File

@@ -54,7 +54,7 @@ public class Zone implements java.io.Serializable, Iterable<Card> {
// might support different order via preference later // might support different order via preference later
private static final Comparator<Card> COMPARATOR = Comparator.comparingInt((Card c) -> c.getCMC()) private static final Comparator<Card> COMPARATOR = Comparator.comparingInt((Card c) -> c.getCMC())
.thenComparing(c -> c.getColor()) .thenComparing(c -> c.getColor().getOrderWeight())
.thenComparing(Comparator.comparing(Card::getName)) .thenComparing(Comparator.comparing(Card::getName))
.thenComparing(Card::hasPerpetual); .thenComparing(Card::hasPerpetual);

View File

@@ -464,7 +464,7 @@ public class TrackableTypes {
public static final TrackableType<ColorSet> ColorSetType = new TrackableType<ColorSet>() { public static final TrackableType<ColorSet> ColorSetType = new TrackableType<ColorSet>() {
@Override @Override
public ColorSet getDefaultValue() { public ColorSet getDefaultValue() {
return ColorSet.NO_COLORS; return ColorSet.C;
} }
@Override @Override

View File

@@ -33,7 +33,7 @@ public class ColorSetRenderer extends ItemCellRenderer {
this.cs = (ColorSet) value; this.cs = (ColorSet) value;
} }
else { else {
this.cs = ColorSet.NO_COLORS; this.cs = ColorSet.C;
} }
this.setToolTipText(cs.toString()); this.setToolTipText(cs.toString());
return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column); return super.getTableCellRendererComponent(table, "", isSelected, hasFocus, row, column);

View File

@@ -214,22 +214,8 @@ public class VAssignGenericAmount {
pnlTargets.add(mp, "w 145px!, h 170px!, gap 5px 5px 3px 3px, ax center"); pnlTargets.add(mp, "w 145px!, h 170px!, gap 5px 5px 3px 3px, ax center");
mp.addMouseListener(mad); mp.addMouseListener(mad);
targetsMap.put(mp, at); targetsMap.put(mp, at);
} else if (at.entity instanceof Byte) { } else if (at.entity instanceof MagicColor.Color color) {
SkinImage manaSymbol; SkinImage manaSymbol = FSkin.getImage(FSkinProp.MANA_IMG.get(color.getShortName()));
byte color = (Byte) at.entity;
if (color == MagicColor.WHITE) {
manaSymbol = FSkin.getImage(FSkinProp.IMG_MANA_W);
} else if (color == MagicColor.BLUE) {
manaSymbol = FSkin.getImage(FSkinProp.IMG_MANA_U);
} else if (color == MagicColor.BLACK) {
manaSymbol = FSkin.getImage(FSkinProp.IMG_MANA_B);
} else if (color == MagicColor.RED) {
manaSymbol = FSkin.getImage(FSkinProp.IMG_MANA_R);
} else if (color == MagicColor.GREEN) {
manaSymbol = FSkin.getImage(FSkinProp.IMG_MANA_G);
} else { // Should never come here, but add this to avoid compile error
manaSymbol = FSkin.getImage(FSkinProp.IMG_MANA_COLORLESS);
}
final MiscCardPanel mp = new MiscCardPanel(matchUI, "", manaSymbol); final MiscCardPanel mp = new MiscCardPanel(matchUI, "", manaSymbol);
mp.setCardBounds(0, 0, 70, 70); mp.setCardBounds(0, 0, 70, 70);
pnlTargets.add(mp, "w 100px!, h 150px!, gap 5px 5px 3px 3px, ax center"); pnlTargets.add(mp, "w 100px!, h 150px!, gap 5px 5px 3px 3px, ax center");

View File

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

View File

@@ -45,7 +45,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
private int heroRace; private int heroRace;
private int avatarIndex; private int avatarIndex;
private boolean isFemale; private boolean isFemale;
private ColorSet colorIdentity = ColorSet.ALL_COLORS; private ColorSet colorIdentity = ColorSet.WUBRG;
// Deck data // Deck data
private Deck deck; private Deck deck;
@@ -396,9 +396,9 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
if (temp != null) if (temp != null)
setColorIdentity(temp); setColorIdentity(temp);
else else
colorIdentity = ColorSet.ALL_COLORS; colorIdentity = ColorSet.WUBRG;
} else } else
colorIdentity = ColorSet.ALL_COLORS; colorIdentity = ColorSet.WUBRG;
gold = data.readInt("gold"); gold = data.readInt("gold");
maxLife = data.readInt("maxLife"); maxLife = data.readInt("maxLife");

View File

@@ -250,8 +250,7 @@ public class CardUtil {
this.colors = 0; this.colors = 0;
for (String color : type.colors) { for (String color : type.colors) {
if ("colorID".equals(color)) if ("colorID".equals(color))
for (byte c : Current.player().getColorIdentity()) colors |= Current.player().getColorIdentity().getColor();
colors |= c;
else else
colors |= MagicColor.fromName(color.toLowerCase()); colors |= MagicColor.fromName(color.toLowerCase());
} }

View File

@@ -37,7 +37,6 @@ import forge.card.CardZoom;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.game.card.CardView; import forge.game.card.CardView;
import forge.game.player.PlayerView; import forge.game.player.PlayerView;
import forge.localinstance.skin.FSkinProp;
import forge.screens.match.MatchController; import forge.screens.match.MatchController;
import forge.toolbox.FCardPanel; import forge.toolbox.FCardPanel;
import forge.toolbox.FContainer; import forge.toolbox.FContainer;
@@ -165,25 +164,10 @@ public class VAssignGenericAmount extends FDialog {
max = max0; max = max0;
if (entity instanceof CardView) { if (entity instanceof CardView) {
obj = add(new EffectSourcePanel((CardView)entity)); obj = add(new EffectSourcePanel((CardView)entity));
} else if (entity instanceof PlayerView) { } else if (entity instanceof PlayerView player) {
PlayerView player = (PlayerView)entity;
obj = add(new MiscTargetPanel(player.getName(), MatchController.getPlayerAvatar(player), null)); obj = add(new MiscTargetPanel(player.getName(), MatchController.getPlayerAvatar(player), null));
} else if (entity instanceof Byte) { } else if (entity instanceof MagicColor.Color color) {
FSkinImageInterface manaSymbol; FSkinImageInterface manaSymbol = Forge.getAssets().manaImages().get(color.getShortName());
byte color = (Byte) entity;
if (color == MagicColor.WHITE) {
manaSymbol = Forge.getAssets().images().get(FSkinProp.IMG_MANA_W);
} else if (color == MagicColor.BLUE) {
manaSymbol = Forge.getAssets().images().get(FSkinProp.IMG_MANA_U);
} else if (color == MagicColor.BLACK) {
manaSymbol = Forge.getAssets().images().get(FSkinProp.IMG_MANA_B);
} else if (color == MagicColor.RED) {
manaSymbol = Forge.getAssets().images().get(FSkinProp.IMG_MANA_R);
} else if (color == MagicColor.GREEN) {
manaSymbol = Forge.getAssets().images().get(FSkinProp.IMG_MANA_G);
} else { // Should never come here, but add this to avoid compile error
manaSymbol = Forge.getAssets().images().get(FSkinProp.IMG_MANA_COLORLESS);
}
obj = add(new MiscTargetPanel("", manaSymbol, entity)); obj = add(new MiscTargetPanel("", manaSymbol, entity));
} else { } else {
obj = add(new MiscTargetPanel(entity.toString(), FSkinImage.UNKNOWN, null)); obj = add(new MiscTargetPanel(entity.toString(), FSkinImage.UNKNOWN, null));

View File

@@ -276,7 +276,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
// If the card has any ability that tracks mana spent, skip express Mana choice // If the card has any ability that tracks mana spent, skip express Mana choice
if (saPaidFor.tracksManaSpent()) { if (saPaidFor.tracksManaSpent()) {
colorCanUse = ColorSet.ALL_COLORS.getColor(); colorCanUse = ColorSet.WUBRG.getColor();
guessAbilityWithRequiredColors = false; guessAbilityWithRequiredColors = false;
} }

View File

@@ -105,7 +105,7 @@ public class ConquestRegion {
protected ConquestRegion read(String line) { protected ConquestRegion read(String line) {
String name = null; String name = null;
String artCardName = null; String artCardName = null;
ColorSet colorSet = ColorSet.ALL_COLORS; ColorSet colorSet = ColorSet.WUBRG;
Predicate<PaperCard> pred = x -> true; Predicate<PaperCard> pred = x -> true;
String key, value; String key, value;

View File

@@ -560,7 +560,7 @@ public final class BoosterUtils {
public static void sort(List<PaperCard> cards) { public static void sort(List<PaperCard> cards) {
//sort cards alphabetically so colors appear together and rares appear on top //sort cards alphabetically so colors appear together and rares appear on top
cards.sort(Comparator.comparing(PaperCard::getName)); cards.sort(Comparator.comparing(PaperCard::getName));
cards.sort(Comparator.comparing(c -> c.getRules().getColor())); cards.sort(Comparator.comparing(c -> c.getRules().getColor().getOrderWeight()));
cards.sort(Comparator.comparing(PaperCard::getRarity).reversed()); cards.sort(Comparator.comparing(PaperCard::getRarity).reversed());
} }
} }

View File

@@ -91,7 +91,7 @@ public enum ColumnDef {
* The color column. * The color column.
*/ */
COLOR("lblColor", "ttColor", 46, true, SortState.ASC, COLOR("lblColor", "ttColor", 46, true, SortState.ASC,
from -> toColor(from.getKey()), from -> toColor(from.getKey()).getOrderWeight(),
from -> toColor(from.getKey())), from -> toColor(from.getKey())),
/** /**
* The power column. * The power column.
@@ -271,7 +271,7 @@ public enum ColumnDef {
* The deck color column. * The deck color column.
*/ */
DECK_COLOR("lblColor", "ttColor", 70, true, SortState.ASC, DECK_COLOR("lblColor", "ttColor", 70, true, SortState.ASC,
from -> toDeckColor(from.getKey()), from -> toDeckColor(from.getKey()).getOrderWeight(),
from -> toDeckColor(from.getKey())), from -> toDeckColor(from.getKey())),
/** /**
* The deck format column. * The deck format column.
@@ -377,7 +377,7 @@ public enum ColumnDef {
} }
private static ColorSet toColor(final InventoryItem i) { private static ColorSet toColor(final InventoryItem i) {
return i instanceof IPaperCard ? ((IPaperCard) i).getRules().getColor() : ColorSet.NO_COLORS; return i instanceof IPaperCard ? ((IPaperCard) i).getRules().getColor() : ColorSet.C;
} }
private static Integer toPower(final InventoryItem i) { private static Integer toPower(final InventoryItem i) {

View File

@@ -441,7 +441,7 @@ public class SFilterUtil {
final byte colors = colors0; final byte colors = colors0;
final boolean wantColorless = buttonMap.get(StatTypes.COLORLESS).isSelected(); final boolean wantColorless = buttonMap.get(StatTypes.COLORLESS).isSelected();
final boolean wantMulticolor = buttonMap.get(StatTypes.MULTICOLOR).isSelected(); final boolean wantMulticolor = buttonMap.get(StatTypes.MULTICOLOR).isSelected();
final boolean wantAllColors = colors == ColorSet.ALL_COLORS.getColor(); final boolean wantAllColors = colors == ColorSet.WUBRG.getColor();
//Use color identity instead of color for lands, unless all colors are filtered out anyway. //Use color identity instead of color for lands, unless all colors are filtered out anyway.
final boolean filterLandsByCI = colors != 0 && FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FILTER_LANDS_BY_COLOR_IDENTITY); final boolean filterLandsByCI = colors != 0 && FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_FILTER_LANDS_BY_COLOR_IDENTITY);

View File

@@ -353,16 +353,19 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
final CardView vSource = CardView.get(sa.getHostCard()); final CardView vSource = CardView.get(sa.getHostCard());
final Map<Object, Integer> vAffected = new LinkedHashMap<>(manaAmount); final Map<Object, Integer> vAffected = new LinkedHashMap<>(manaAmount);
Integer maxAmount = different ? 1 : manaAmount; Integer maxAmount = different ? 1 : manaAmount;
for (Byte color : colorSet) { for (MagicColor.Color color : colorSet) {
if (color == MagicColor.Color.COLORLESS) {
continue;
}
vAffected.put(color, maxAmount); vAffected.put(color, maxAmount);
} }
final Map<Object, Integer> vResult = getGui().assignGenericAmount(vSource, vAffected, manaAmount, false, final Map<Object, Integer> vResult = getGui().assignGenericAmount(vSource, vAffected, manaAmount, false,
localizer.getMessage("lblMana").toLowerCase()); localizer.getMessage("lblMana").toLowerCase());
Map<Byte, Integer> result = new HashMap<>(); Map<Byte, Integer> result = new HashMap<>();
if (vResult != null) { //fix for netplay if (vResult != null) { //fix for netplay
for (Byte color : colorSet) { for (MagicColor.Color color : colorSet) {
if (vResult.containsKey(color)) { if (vResult.containsKey(color)) {
result.put(color, vResult.get(color)); result.put(color.getColorMask(), vResult.get(color));
} }
} }
} }
@@ -1868,8 +1871,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont
if (withColorless) { if (withColorless) {
colorNamesBuilder.add(MagicColor.toLongString(MagicColor.COLORLESS)); colorNamesBuilder.add(MagicColor.toLongString(MagicColor.COLORLESS));
} }
for (final Byte b : colors) { for (final MagicColor.Color color : colors) {
colorNamesBuilder.add(MagicColor.toLongString(b)); colorNamesBuilder.add(color.getName());
} }
final ImmutableList<String> colorNames = colorNamesBuilder.build(); final ImmutableList<String> colorNames = colorNamesBuilder.build();
if (colorNames.size() > 2) { if (colorNames.size() > 2) {