From b32a7862363ffadc8de2ad5ec587e6009d20aa9b Mon Sep 17 00:00:00 2001 From: jmlundeen Date: Thu, 27 Nov 2025 09:39:46 -0600 Subject: [PATCH] add verify checks for Double Faced Cards having abilities on main card * add booleans to card scanner, restricting to checking cards by name and set. Reduces duplication of verify checks across sets. --- .../src/main/java/mage/cards/RateCard.java | 2 +- .../java/mage/verify/VerifyCardDataTest.java | 19 ++++++++++++++++-- .../mage/cards/repository/CardScanner.java | 20 +++++++++++++------ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Mage.Common/src/main/java/mage/cards/RateCard.java b/Mage.Common/src/main/java/mage/cards/RateCard.java index b9c21e6a06e..8b3dbd9b6d4 100644 --- a/Mage.Common/src/main/java/mage/cards/RateCard.java +++ b/Mage.Common/src/main/java/mage/cards/RateCard.java @@ -61,7 +61,7 @@ public final class RateCard { public static void bootstrapCardsAndRatings() { // preload cards and ratings log.info("Loading cards and rating..."); - List cards = CardScanner.getAllCards(false); + List cards = CardScanner.getAllCards(false, true, true); for (Card card : cards) { RateCard.rateCard(card, null); } diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 85c4c3c07c2..8e2f7b0e142 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -329,7 +329,8 @@ public class VerifyCardDataTest { checkWrongAbilitiesTextStart(); int cardIndex = 0; - for (Card card : CardScanner.getAllCards()) { + List allCards = CardScanner.getAllCards(true, true, false); + for (Card card : allCards) { cardIndex++; if (card instanceof CardWithHalves) { check(((CardWithHalves) card).getLeftHalfCard(), cardIndex); @@ -346,7 +347,7 @@ public class VerifyCardDataTest { printMessages(outputMessages); if (failed > 0) { - Assert.fail(String.format("found %d errors in %d cards verify (see errors list above)", failed, CardScanner.getAllCards().size())); + Assert.fail(String.format("found %d errors in %d cards verify (see errors list above)", failed, allCards.size())); } } @@ -2291,6 +2292,20 @@ public class VerifyCardDataTest { fail(card, "abilities", "card has backup but is missing this.addAbility(backupAbility)"); } + // special check: DFC main card should not have abilities + if (card instanceof DoubleFacedCardHalf && !card.getMainCard().getInitAbilities().isEmpty()) { + fail(card, "abilities", "transforming double-faced card should not have abilities on the main card"); + } + + // TODO: remove after transform ability removed + // special check: new DFC implementation should not have transform ability + if (card instanceof DoubleFacedCardHalf && card.getAbilities().containsClass(TransformAbility.class) + && !card.getAbilities().containsClass(DayboundAbility.class) + && !card.getAbilities().containsClass(CraftAbility.class) + && !card.getAbilities().containsClass(SiegeAbility.class)) { + fail(card, "abilities", "new transforming double-faced card should not have transform ability"); + } + // special check: Werewolves front ability should only be on front and vice versa if (card.getAbilities().containsClass(WerewolfFrontTriggeredAbility.class) && (card.isNightCard() || (card instanceof DoubleFacedCardHalf && ((DoubleFacedCardHalf) card).isBackSide()))) { fail(card, "abilities", "card is a back face werewolf with a front face ability"); diff --git a/Mage/src/main/java/mage/cards/repository/CardScanner.java b/Mage/src/main/java/mage/cards/repository/CardScanner.java index 8f3d429b850..57e748bc530 100644 --- a/Mage/src/main/java/mage/cards/repository/CardScanner.java +++ b/Mage/src/main/java/mage/cards/repository/CardScanner.java @@ -3,10 +3,7 @@ package mage.cards.repository; import mage.cards.*; import org.apache.log4j.Logger; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; +import java.util.*; /** * @author North @@ -83,17 +80,28 @@ public final class CardScanner { } public static List getAllCards() { - return getAllCards(true); + return getAllCards(true, true, true); } - public static List getAllCards(boolean ignoreCustomSets) { + public static List getAllCards(boolean ignoreCustomSets, boolean uniqueByName, boolean uniqueBySet) { + Set uniqueCardNames = new HashSet<>(); Collection sets = Sets.getInstance().values(); List cards = new ArrayList<>(); for (ExpansionSet set : sets) { if (ignoreCustomSets && set.getSetType().isCustomSet()) { continue; } + if (uniqueBySet) { + uniqueCardNames.clear(); + } for (ExpansionSet.SetCardInfo setInfo : set.getSetCardInfo()) { + if (uniqueByName) { + String cardName = setInfo.getName(); + if (uniqueCardNames.contains(cardName)) { + continue; + } + uniqueCardNames.add(cardName); + } cards.add(CardImpl.createCard(setInfo.getCardClass(), new CardSetInfo(setInfo.getName(), set.getCode(), setInfo.getCardNumber(), setInfo.getRarity(), setInfo.getGraphicInfo()))); }