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.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardUtil;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.combat.Combat;
@@ -905,7 +904,7 @@ public class ComputerUtilCard {
}
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.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));

View File

@@ -244,7 +244,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
//if Iona does prevent from casting, allow it to draw
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;
}
}

View File

@@ -1789,7 +1789,7 @@ public class AbilityUtils {
if (sq[0].contains("HasNumChosenColors")) {
int sum = 0;
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;
}
@@ -1990,7 +1990,7 @@ public class AbilityUtils {
// Count$CardMulticolor.<numMC>.<numNotMC>
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);
}
// Count$Madness.<True>.<False>
@@ -2046,7 +2046,7 @@ public class AbilityUtils {
}
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")) {
return doXMath(c.getDamageHistory().getCreatureAttacksThisTurn(), expr, c, ctb);
@@ -3766,7 +3766,7 @@ public class AbilityUtils {
someCards = CardLists.filter(someCards, new Predicate<Card>() {
@Override
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>() {
@Override
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.card.Card;
import forge.game.card.CardFactory;
import forge.game.card.CardUtil;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.item.PaperCard;
@@ -35,7 +34,7 @@ public class PlayLandVariantEffect extends SpellAbilityEffect {
cards = Lists.newArrayList(Iterables.filter(cards, cpp));
}
// current color of source card
final ColorSet color = CardUtil.getColors(source);
final ColorSet color = source.determineColor();
if (color.isColorless()) {
return;
}

View File

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

View File

@@ -4937,17 +4937,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
view.updateEmblem(this);
}
/*
* there are easy checkers for Color. The CardUtil functions should be made
* part of the Card class, so calling out is not necessary
*/
public final boolean isOfColor(final String col) { return CardUtil.getColors(this).hasAnyColor(MagicColor.fromName(col)); }
public final boolean isBlack() { return CardUtil.getColors(this).hasBlack(); }
public final boolean isBlue() { return CardUtil.getColors(this).hasBlue(); }
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 isOfColor(final String col) { return determineColor().hasAnyColor(MagicColor.fromName(col)); }
public final boolean isBlack() { return determineColor().hasBlack(); }
public final boolean isBlue() { return determineColor().hasBlue(); }
public final boolean isRed() { return determineColor().hasRed(); }
public final boolean isGreen() { return determineColor().hasGreen(); }
public final boolean isWhite() { return determineColor().hasWhite(); }
public final boolean isColorless() { return determineColor().isColorless(); }
public final boolean sharesNameWith(final Card c1) {
// 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.setFaceDown(in.isFaceDown());
int foil = in.getCurrentState().getFoil();
if (foil > 0) {
out.setFoil(foil);
}
return out;
}

View File

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

View File

@@ -264,7 +264,7 @@ public final class CardPredicates {
return new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return CardUtil.getColors(c).hasAnyColor(color);
return c.determineColor().hasAnyColor(color);
}
};
} // getColor()
@@ -273,7 +273,7 @@ public final class CardPredicates {
return new Predicate<Card>() {
@Override
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>() {
@Override
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;
case "MostProminentColor":
byte mask = CardFactoryUtil.getMostProminentColors(game.getCardsIn(ZoneType.Battlefield));
if (!CardUtil.getColors(card).hasAnyColor(mask))
if (!card.determineColor().hasAnyColor(mask))
return false;
break;
case "LastCastThisTurn":
@@ -703,7 +703,7 @@ public class CardProperty {
if (castSA == null) {
return false;
}
if (!CardUtil.getColors(card).hasAnyColor(castSA.getPayingColors().getColor())) {
if (!card.determineColor().hasAnyColor(castSA.getPayingColors().getColor())) {
return false;
}
break;

View File

@@ -85,10 +85,6 @@ public final class CardUtil {
return false;
}
public static ColorSet getColors(final Card c) {
return c.determineColor();
}
public static boolean isStackingKeyword(final String keyword) {
String kw = keyword;
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) {
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) {
@@ -343,7 +338,7 @@ public final class CardUtil {
byte combinedColor = 0;
for (Card tgt : tgts) {
ColorSet cs = CardUtil.getColors(tgt);
ColorSet cs = tgt.determineColor();
for (byte color : MagicColor.WUBRG) {
if(!cs.hasAnyColor(color))
continue;

View File

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

View File

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

View File

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

View File

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

View File

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