Merge branch 'foiling' into 'master'

Fix dropping foil from card when copying

See merge request core-developers/forge!5666
This commit is contained in:
Michael Kamensky
2021-10-28 19:54:20 +00:00
16 changed files with 36 additions and 46 deletions

View File

@@ -40,7 +40,6 @@ import forge.game.card.CardFactory;
import forge.game.card.CardFactoryUtil; import forge.game.card.CardFactoryUtil;
import forge.game.card.CardLists; import forge.game.card.CardLists;
import forge.game.card.CardPredicates; import forge.game.card.CardPredicates;
import forge.game.card.CardUtil;
import forge.game.card.CounterEnumType; import forge.game.card.CounterEnumType;
import forge.game.card.CounterType; import forge.game.card.CounterType;
import forge.game.combat.Combat; import forge.game.combat.Combat;
@@ -905,7 +904,7 @@ public class ComputerUtilCard {
} }
for (final Card crd : list) { for (final Card crd : list) {
ColorSet color = CardUtil.getColors(crd); ColorSet color = crd.determineColor();
if (color.hasWhite()) map.get(0).setValue(Integer.valueOf(map.get(0).getValue()+1)); if (color.hasWhite()) map.get(0).setValue(Integer.valueOf(map.get(0).getValue()+1));
if (color.hasBlue()) map.get(1).setValue(Integer.valueOf(map.get(1).getValue()+1)); if (color.hasBlue()) map.get(1).setValue(Integer.valueOf(map.get(1).getValue()+1));
if (color.hasBlack()) map.get(2).setValue(Integer.valueOf(map.get(2).getValue()+1)); if (color.hasBlack()) map.get(2).setValue(Integer.valueOf(map.get(2).getValue()+1));

View File

@@ -244,7 +244,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
//if Iona does prevent from casting, allow it to draw //if Iona does prevent from casting, allow it to draw
for (final Card io : player.getCardsIn(ZoneType.Battlefield, "Iona, Shield of Emeria")) { for (final Card io : player.getCardsIn(ZoneType.Battlefield, "Iona, Shield of Emeria")) {
if (CardUtil.getColors(imprinted).hasAnyColor(MagicColor.fromName(io.getChosenColor()))) { if (imprinted.determineColor().hasAnyColor(MagicColor.fromName(io.getChosenColor()))) {
return allow; return allow;
} }
} }

View File

@@ -1789,7 +1789,7 @@ public class AbilityUtils {
if (sq[0].contains("HasNumChosenColors")) { if (sq[0].contains("HasNumChosenColors")) {
int sum = 0; int sum = 0;
for (Card card : getDefinedCards(c, sq[1], sa)) { for (Card card : getDefinedCards(c, sq[1], sa)) {
sum += CardUtil.getColors(card).getSharedColors(ColorSet.fromNames(c.getChosenColors())).countColors(); sum += card.determineColor().getSharedColors(ColorSet.fromNames(c.getChosenColors())).countColors();
} }
return sum; return sum;
} }
@@ -1990,7 +1990,7 @@ public class AbilityUtils {
// Count$CardMulticolor.<numMC>.<numNotMC> // Count$CardMulticolor.<numMC>.<numNotMC>
if (sq[0].contains("CardMulticolor")) { if (sq[0].contains("CardMulticolor")) {
final boolean isMulti = CardUtil.getColors(c).isMulticolor(); final boolean isMulti = c.determineColor().isMulticolor();
return doXMath(Integer.parseInt(sq[isMulti ? 1 : 2]), expr, c, ctb); return doXMath(Integer.parseInt(sq[isMulti ? 1 : 2]), expr, c, ctb);
} }
// Count$Madness.<True>.<False> // Count$Madness.<True>.<False>
@@ -2046,7 +2046,7 @@ public class AbilityUtils {
} }
if (sq[0].contains("CardNumColors")) { if (sq[0].contains("CardNumColors")) {
return doXMath(CardUtil.getColors(c).countColors(), expr, c, ctb); return doXMath(c.determineColor().countColors(), expr, c, ctb);
} }
if (sq[0].contains("CardNumAttacksThisTurn")) { if (sq[0].contains("CardNumAttacksThisTurn")) {
return doXMath(c.getDamageHistory().getCreatureAttacksThisTurn(), expr, c, ctb); return doXMath(c.getDamageHistory().getCreatureAttacksThisTurn(), expr, c, ctb);
@@ -3766,7 +3766,7 @@ public class AbilityUtils {
someCards = CardLists.filter(someCards, new Predicate<Card>() { someCards = CardLists.filter(someCards, new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
return CardUtil.getColors(c).isMulticolor(); return c.determineColor().isMulticolor();
} }
}); });
} }
@@ -3775,7 +3775,7 @@ public class AbilityUtils {
someCards = CardLists.filter(someCards, new Predicate<Card>() { someCards = CardLists.filter(someCards, new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
return CardUtil.getColors(c).isMonoColor(); return c.determineColor().isMonoColor();
} }
}); });
} }

View File

@@ -15,7 +15,6 @@ import forge.game.Game;
import forge.game.ability.SpellAbilityEffect; import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardFactory; import forge.game.card.CardFactory;
import forge.game.card.CardUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.item.PaperCard; import forge.item.PaperCard;
@@ -35,7 +34,7 @@ public class PlayLandVariantEffect extends SpellAbilityEffect {
cards = Lists.newArrayList(Iterables.filter(cards, cpp)); cards = Lists.newArrayList(Iterables.filter(cards, cpp));
} }
// current color of source card // current color of source card
final ColorSet color = CardUtil.getColors(source); final ColorSet color = source.determineColor();
if (color.isColorless()) { if (color.isColorless()) {
return; return;
} }

View File

@@ -15,7 +15,6 @@ import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollectionView; import forge.game.card.CardCollectionView;
import forge.game.card.CardLists; import forge.game.card.CardLists;
import forge.game.card.CardUtil;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -65,7 +64,7 @@ public class ProtectAllEffect extends SpellAbilityEffect {
} }
} else if (sa.getParam("Gains").equals("TargetedCardColor")) { } else if (sa.getParam("Gains").equals("TargetedCardColor")) {
for (final Card c : sa.getSATargetingCard().getTargets().getTargetCards()) { for (final Card c : sa.getSATargetingCard().getTargets().getTargetCards()) {
ColorSet cs = CardUtil.getColors(c); ColorSet cs = c.determineColor();
for (byte col : MagicColor.WUBRG) { for (byte col : MagicColor.WUBRG) {
if (cs.hasAnyColor(col)) if (cs.hasAnyColor(col))
gains.add(MagicColor.toLongString(col).toLowerCase()); gains.add(MagicColor.toLongString(col).toLowerCase());

View File

@@ -4937,17 +4937,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
view.updateEmblem(this); view.updateEmblem(this);
} }
/* public final boolean isOfColor(final String col) { return determineColor().hasAnyColor(MagicColor.fromName(col)); }
* there are easy checkers for Color. The CardUtil functions should be made public final boolean isBlack() { return determineColor().hasBlack(); }
* part of the Card class, so calling out is not necessary public final boolean isBlue() { return determineColor().hasBlue(); }
*/ public final boolean isRed() { return determineColor().hasRed(); }
public final boolean isOfColor(final String col) { return CardUtil.getColors(this).hasAnyColor(MagicColor.fromName(col)); } public final boolean isGreen() { return determineColor().hasGreen(); }
public final boolean isBlack() { return CardUtil.getColors(this).hasBlack(); } public final boolean isWhite() { return determineColor().hasWhite(); }
public final boolean isBlue() { return CardUtil.getColors(this).hasBlue(); } public final boolean isColorless() { return determineColor().isColorless(); }
public final boolean isRed() { return CardUtil.getColors(this).hasRed(); }
public final boolean isGreen() { return CardUtil.getColors(this).hasGreen(); }
public final boolean isWhite() { return CardUtil.getColors(this).hasWhite(); }
public final boolean isColorless() { return CardUtil.getColors(this).isColorless(); }
public final boolean sharesNameWith(final Card c1) { public final boolean sharesNameWith(final Card c1) {
// in a corner case where c1 is null, there is no name to share with. // in a corner case where c1 is null, there is no name to share with.

View File

@@ -104,6 +104,11 @@ public class CardFactory {
out.setCommander(in.isRealCommander()); out.setCommander(in.isRealCommander());
//out.setFaceDown(in.isFaceDown()); //out.setFaceDown(in.isFaceDown());
int foil = in.getCurrentState().getFoil();
if (foil > 0) {
out.setFoil(foil);
}
return out; return out;
} }

View File

@@ -338,7 +338,7 @@ public class CardFactoryUtil {
} }
for (final Card crd : list) { for (final Card crd : list) {
ColorSet color = CardUtil.getColors(crd); ColorSet color = crd.determineColor();
for (int i = 0; i < cntColors; i++) { for (int i = 0; i < cntColors; i++) {
if (color.hasAnyColor(MagicColor.WUBRG[i])) if (color.hasAnyColor(MagicColor.WUBRG[i]))
map[i]++; map[i]++;
@@ -376,7 +376,7 @@ public class CardFactoryUtil {
} }
for (final Card crd : list) { for (final Card crd : list) {
ColorSet color = CardUtil.getColors(crd); ColorSet color = crd.determineColor();
for (int i = 0; i < cntColors; i++) { for (int i = 0; i < cntColors; i++) {
if (color.hasAnyColor(MagicColor.WUBRG[i])) if (color.hasAnyColor(MagicColor.WUBRG[i]))
map[i]++; map[i]++;
@@ -407,7 +407,7 @@ public class CardFactoryUtil {
} }
for (final Card crd : list) { for (final Card crd : list) {
ColorSet color = CardUtil.getColors(crd); ColorSet color = crd.determineColor();
for (int i = 0; i < cntColors; i++) { for (int i = 0; i < cntColors; i++) {
if (color.hasAnyColor(colorRestrictions.get(i))) { if (color.hasAnyColor(colorRestrictions.get(i))) {
map[i]++; map[i]++;

View File

@@ -264,7 +264,7 @@ public final class CardPredicates {
return new Predicate<Card>() { return new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
return CardUtil.getColors(c).hasAnyColor(color); return c.determineColor().hasAnyColor(color);
} }
}; };
} // getColor() } // getColor()
@@ -273,7 +273,7 @@ public final class CardPredicates {
return new Predicate<Card>() { return new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
return CardUtil.getColors(c).hasExactlyColor(color); return c.determineColor().hasExactlyColor(color);
} }
}; };
} }
@@ -282,7 +282,7 @@ public final class CardPredicates {
return new Predicate<Card>() { return new Predicate<Card>() {
@Override @Override
public boolean apply(final Card c) { public boolean apply(final Card c) {
return CardUtil.getColors(c).isColorless(); return c.determineColor().isColorless();
} }
}; };
} }

View File

@@ -689,7 +689,7 @@ public class CardProperty {
break; break;
case "MostProminentColor": case "MostProminentColor":
byte mask = CardFactoryUtil.getMostProminentColors(game.getCardsIn(ZoneType.Battlefield)); byte mask = CardFactoryUtil.getMostProminentColors(game.getCardsIn(ZoneType.Battlefield));
if (!CardUtil.getColors(card).hasAnyColor(mask)) if (!card.determineColor().hasAnyColor(mask))
return false; return false;
break; break;
case "LastCastThisTurn": case "LastCastThisTurn":
@@ -703,7 +703,7 @@ public class CardProperty {
if (castSA == null) { if (castSA == null) {
return false; return false;
} }
if (!CardUtil.getColors(card).hasAnyColor(castSA.getPayingColors().getColor())) { if (!card.determineColor().hasAnyColor(castSA.getPayingColors().getColor())) {
return false; return false;
} }
break; break;

View File

@@ -85,10 +85,6 @@ public final class CardUtil {
return false; return false;
} }
public static ColorSet getColors(final Card c) {
return c.determineColor();
}
public static boolean isStackingKeyword(final String keyword) { public static boolean isStackingKeyword(final String keyword) {
String kw = keyword; String kw = keyword;
if (kw.startsWith("HIDDEN")) { if (kw.startsWith("HIDDEN")) {
@@ -158,7 +154,6 @@ public final class CardUtil {
public static List<Card> getLastTurnCast(final String valid, final Card src, final CardTraitBase ctb) { public static List<Card> getLastTurnCast(final String valid, final Card src, final CardTraitBase ctb) {
return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src, ctb); return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src, ctb);
} }
public static List<Card> getLKICopyList(final Iterable<Card> in, Map<Integer, Card> cachedMap) { public static List<Card> getLKICopyList(final Iterable<Card> in, Map<Integer, Card> cachedMap) {
@@ -343,7 +338,7 @@ public final class CardUtil {
byte combinedColor = 0; byte combinedColor = 0;
for (Card tgt : tgts) { for (Card tgt : tgts) {
ColorSet cs = CardUtil.getColors(tgt); ColorSet cs = tgt.determineColor();
for (byte color : MagicColor.WUBRG) { for (byte color : MagicColor.WUBRG) {
if(!cs.hasAnyColor(color)) if(!cs.hasAnyColor(color))
continue; continue;

View File

@@ -158,7 +158,7 @@ public class TokenInfo {
if (!colorMap.isEmpty()) { if (!colorMap.isEmpty()) {
if (!result.isColorless()) { if (!result.isColorless()) {
// change Token Colors // change Token Colors
byte color = CardUtil.getColors(result).getColor(); byte color = result.determineColor().getColor();
for (final Map.Entry<String, String> e : colorMap.entrySet()) { for (final Map.Entry<String, String> e : colorMap.entrySet()) {
byte v = MagicColor.fromName(e.getValue()); byte v = MagicColor.fromName(e.getValue());

View File

@@ -34,7 +34,6 @@ import forge.game.GameObjectPredicates;
import forge.game.GameType; import forge.game.GameType;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.Player; import forge.game.player.Player;
@@ -300,9 +299,9 @@ public class SpellAbilityCondition extends SpellAbilityVariables {
if (first == null) { if (first == null) {
return false; return false;
} }
byte firstColor = CardUtil.getColors(first).getColor(); byte firstColor = first.determineColor().getColor();
for (Card c : tgts) { for (Card c : tgts) {
if (CardUtil.getColors(c).getColor() != firstColor) { if (c.determineColor().getColor() != firstColor) {
return false; return false;
} }
} }

View File

@@ -23,7 +23,7 @@ public class IntegerConstraint {
@Override @Override
public String toString() { public String toString() {
if( min == max ) { if (min == max) {
return String.valueOf( min ); return String.valueOf( min );
} }
return "between " + min + " and " + max; return "between " + min + " and " + max;

View File

@@ -13,7 +13,6 @@ import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard; import forge.card.mana.ManaCostShard;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardCollectionView; import forge.game.card.CardCollectionView;
import forge.game.card.CardUtil;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -74,7 +73,7 @@ public final class InputSelectCardsForConvokeOrImprovise extends InputSelectMany
if (improvise) { if (improvise) {
chosenColor = ManaCostShard.COLORLESS.getColorMask(); chosenColor = ManaCostShard.COLORLESS.getColorMask();
} else { } else {
ColorSet colors = CardUtil.getColors(card); ColorSet colors = card.determineColor();
if (colors.isMulticolor()) { if (colors.isMulticolor()) {
//if card is multicolor, strip out any colors which can't be paid towards remaining cost //if card is multicolor, strip out any colors which can't be paid towards remaining cost
colors = ColorSet.fromMask(colors.getColor() & remainingCost.getUnpaidColors()); colors = ColorSet.fromMask(colors.getColor() & remainingCost.getUnpaidColors());

View File

@@ -30,8 +30,7 @@ public class FThreads {
public static void invokeInEdtNowOrLater(final Runnable proc) { public static void invokeInEdtNowOrLater(final Runnable proc) {
if (isGuiThread()) { if (isGuiThread()) {
GuiBase.getInterface().invokeInEdtNow(proc); GuiBase.getInterface().invokeInEdtNow(proc);
} } else {
else {
GuiBase.getInterface().invokeInEdtLater(proc); GuiBase.getInterface().invokeInEdtLater(proc);
} }
} }