Search in sources :

Example 1 with FilterMana

use of mage.filter.FilterMana in project mage by magefree.

the class CommanderColorIdentityTest method getColorIdentityString.

private String getColorIdentityString(String cardName) {
    CardInfo cardInfo = CardRepository.instance.findCard(cardName);
    if (cardInfo == null) {
        throw new IllegalArgumentException("Couldn't find the card " + cardName + " in the DB.");
    }
    Card card = cardInfo.getCard();
    FilterMana filterMana = card.getColorIdentity();
    return filterMana.toString();
}
Also used : FilterMana(mage.filter.FilterMana) CardInfo(mage.cards.repository.CardInfo) Card(mage.cards.Card)

Example 2 with FilterMana

use of mage.filter.FilterMana in project mage by magefree.

the class CommandersPlateEffect method apply.

@Override
public boolean apply(Game game, Ability source) {
    Player player = game.getPlayer(source.getControllerId());
    if (player == null) {
        return false;
    }
    Permanent permanent = null;
    if (affectedObjectsSet) {
        permanent = game.getPermanent(targetPointer.getFirst(game, source));
        if (permanent == null) {
            discard();
            return true;
        }
    } else {
        Permanent equipment = game.getPermanent(source.getSourceId());
        if (equipment != null && equipment.getAttachedTo() != null) {
            permanent = game.getPermanentOrLKIBattlefield(equipment.getAttachedTo());
        }
    }
    Set<UUID> commanders = game.getCommandersIds(player, CommanderCardType.COMMANDER_OR_OATHBREAKER, false);
    if (commanders.isEmpty()) {
        return false;
    }
    ObjectColor color = new ObjectColor("WUBRG");
    for (UUID commanderId : commanders) {
        Card card = game.getCard(commanderId);
        if (card == null) {
            continue;
        }
        FilterMana identity = card.getColorIdentity();
        if (identity.isWhite()) {
            color.setWhite(false);
        }
        if (identity.isBlue()) {
            color.setBlue(false);
        }
        if (identity.isBlack()) {
            color.setBlack(false);
        }
        if (identity.isRed()) {
            color.setRed(false);
        }
        if (identity.isGreen()) {
            color.setGreen(false);
        }
    }
    if (permanent != null) {
        permanent.addAbility(ProtectionAbility.from(color), source.getSourceId(), game);
    }
    return true;
}
Also used : Player(mage.players.Player) FilterMana(mage.filter.FilterMana) FilterPermanent(mage.filter.FilterPermanent) Permanent(mage.game.permanent.Permanent) FilterControlledCreaturePermanent(mage.filter.common.FilterControlledCreaturePermanent) TargetPermanent(mage.target.TargetPermanent) ObjectColor(mage.ObjectColor) UUID(java.util.UUID) Card(mage.cards.Card)

Example 3 with FilterMana

use of mage.filter.FilterMana in project mage by magefree.

the class Commander method validate.

@Override
public boolean validate(Deck deck) {
    boolean valid = true;
    errorsList.clear();
    FilterMana colorIdentity = new FilterMana();
    Set<Card> commanders = new HashSet<>();
    Card companion;
    int sbsize = deck.getSideboard().size();
    Card card1;
    Card card2;
    Card card3;
    Iterator<Card> iter;
    switch(deck.getSideboard().size()) {
        case 1:
            companion = null;
            commanders.add(deck.getSideboard().iterator().next());
            break;
        case 2:
            iter = deck.getSideboard().iterator();
            card1 = iter.next();
            card2 = iter.next();
            if (card1.getAbilities().stream().anyMatch(CompanionAbility.class::isInstance)) {
                companion = card1;
                commanders.add(card2);
            } else if (card2.getAbilities().stream().anyMatch(CompanionAbility.class::isInstance)) {
                companion = card2;
                commanders.add(card1);
            } else {
                companion = null;
                commanders.add(card1);
                commanders.add(card2);
            }
            break;
        case 3:
            iter = deck.getSideboard().iterator();
            card1 = iter.next();
            card2 = iter.next();
            card3 = iter.next();
            if (card1.getAbilities().stream().anyMatch(CompanionAbility.class::isInstance)) {
                companion = card1;
                commanders.add(card2);
                commanders.add(card3);
            } else if (card2.getAbilities().stream().anyMatch(CompanionAbility.class::isInstance)) {
                companion = card2;
                commanders.add(card1);
                commanders.add(card3);
            } else if (card3.getAbilities().stream().anyMatch(CompanionAbility.class::isInstance)) {
                companion = card3;
                commanders.add(card1);
                commanders.add(card2);
            } else {
                companion = null;
                addError(DeckValidatorErrorType.PRIMARY, "Commander", "Sideboard must contain only the commander(s) and up to 1 companion");
                valid = false;
            }
            break;
        default:
            companion = null;
            addError(DeckValidatorErrorType.PRIMARY, "Commander", "Sideboard must contain only the commander(s) and up to 1 companion");
            valid = false;
    }
    if (companion != null && deck.getCards().size() + deck.getSideboard().size() != 101) {
        addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 101 + " cards (companion doesn't count for deck size): has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
        valid = false;
    } else if (companion == null && deck.getCards().size() + deck.getSideboard().size() != 100) {
        addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 100 + " cards: has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
        valid = false;
    }
    Map<String, Integer> counts = new HashMap<>();
    countCards(counts, deck.getCards());
    countCards(counts, deck.getSideboard());
    valid = checkCounts(1, counts) && valid;
    for (String bannedCard : banned) {
        if (counts.containsKey(bannedCard)) {
            addError(DeckValidatorErrorType.BANNED, bannedCard, "Banned", true);
            valid = false;
        }
    }
    Set<String> commanderNames = new HashSet<>();
    for (Card commander : commanders) {
        commanderNames.add(commander.getName());
    }
    if (commanders.size() == 2 && commanders.stream().map(MageObject::getAbilities).filter(abilities -> abilities.contains(PartnerAbility.getInstance())).count() != 2 && commanders.stream().map(MageObject::getAbilities).filter(abilities -> abilities.contains(FriendsForeverAbility.getInstance())).count() != 2 && !CardUtil.castStream(commanders.stream().map(MageObject::getAbilities), PartnerWithAbility.class).map(PartnerWithAbility::getPartnerName).allMatch(commanderNames::contains)) {
        for (Card commander : commanders) {
            addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Commander with invalid Partner (" + commander.getName() + ')', true);
            valid = false;
        }
    }
    for (Card commander : commanders) {
        if (bannedCommander.contains(commander.getName())) {
            addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Commander banned (" + commander.getName() + ')', true);
            valid = false;
        }
        if ((!commander.hasCardTypeForDeckbuilding(CardType.CREATURE) || !commander.isLegendary()) && !commander.getAbilities().contains(CanBeYourCommanderAbility.getInstance())) {
            addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Commander invalid (" + commander.getName() + ')', true);
            valid = false;
        }
        if (commanders.size() == 2 && bannedPartner.contains(commander.getName())) {
            addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Commander Partner banned (" + commander.getName() + ')', true);
            valid = false;
        }
        ManaUtil.collectColorIdentity(colorIdentity, commander.getColorIdentity());
    }
    // no needs in cards check on wrong commanders
    if (!valid) {
        return false;
    }
    for (Card card : deck.getCards()) {
        if (!ManaUtil.isColorIdentityCompatible(colorIdentity, card.getColorIdentity())) {
            addError(DeckValidatorErrorType.OTHER, card.getName(), "Invalid color (" + colorIdentity.toString() + ')', true);
            valid = false;
        }
    }
    for (Card card : deck.getSideboard()) {
        if (!ManaUtil.isColorIdentityCompatible(colorIdentity, card.getColorIdentity())) {
            addError(DeckValidatorErrorType.OTHER, card.getName(), "Invalid color (" + colorIdentity.toString() + ')', true);
            valid = false;
        }
    }
    for (Card card : deck.getCards()) {
        if (!isSetAllowed(card.getExpansionSetCode())) {
            if (!legalSets(card)) {
                addError(DeckValidatorErrorType.WRONG_SET, card.getName(), "Not allowed Set: " + card.getExpansionSetCode(), true);
                valid = false;
            }
        }
    }
    for (Card card : deck.getSideboard()) {
        if (!isSetAllowed(card.getExpansionSetCode())) {
            if (!legalSets(card)) {
                addError(DeckValidatorErrorType.WRONG_SET, card.getName(), "Not allowed Set: " + card.getExpansionSetCode(), true);
                valid = false;
            }
        }
    }
    // Check for companion legality
    if (companion != null) {
        Set<Card> cards = new HashSet<>(deck.getCards());
        cards.addAll(commanders);
        for (Ability ability : companion.getAbilities()) {
            if (ability instanceof CompanionAbility) {
                CompanionAbility companionAbility = (CompanionAbility) ability;
                if (!companionAbility.isLegal(cards, getDeckMinSize())) {
                    addError(DeckValidatorErrorType.PRIMARY, companion.getName(), "Commander Companion (deck invalid for companion)", true);
                    valid = false;
                }
                break;
            }
        }
    }
    return valid;
}
Also used : PartnerAbility(mage.abilities.keyword.PartnerAbility) java.util(java.util) DeckValidatorErrorType(mage.cards.decks.DeckValidatorErrorType) FriendsForeverAbility(mage.abilities.keyword.FriendsForeverAbility) PartnerWithAbility(mage.abilities.keyword.PartnerWithAbility) Deck(mage.cards.decks.Deck) CanBeYourCommanderAbility(mage.abilities.common.CanBeYourCommanderAbility) Sets(mage.cards.Sets) CardUtil(mage.util.CardUtil) Constructed(mage.cards.decks.Constructed) ManaUtil(mage.util.ManaUtil) ExpansionSet(mage.cards.ExpansionSet) CardType(mage.constants.CardType) MageObject(mage.MageObject) CompanionAbility(mage.abilities.keyword.CompanionAbility) ObjectColor(mage.ObjectColor) Card(mage.cards.Card) Ability(mage.abilities.Ability) FilterMana(mage.filter.FilterMana) PartnerAbility(mage.abilities.keyword.PartnerAbility) FriendsForeverAbility(mage.abilities.keyword.FriendsForeverAbility) PartnerWithAbility(mage.abilities.keyword.PartnerWithAbility) CanBeYourCommanderAbility(mage.abilities.common.CanBeYourCommanderAbility) CompanionAbility(mage.abilities.keyword.CompanionAbility) Ability(mage.abilities.Ability) FilterMana(mage.filter.FilterMana) CompanionAbility(mage.abilities.keyword.CompanionAbility) MageObject(mage.MageObject) Card(mage.cards.Card)

Example 4 with FilterMana

use of mage.filter.FilterMana in project mage by magefree.

the class Oathbreaker method validate.

@Override
public boolean validate(Deck deck) {
    boolean valid = true;
    errorsList.clear();
    if (deck.getCards().size() + deck.getSideboard().size() != 60) {
        addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 60 + " cards: has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
        valid = false;
    }
    Map<String, Integer> counts = new HashMap<>();
    countCards(counts, deck.getCards());
    countCards(counts, deck.getSideboard());
    for (String bannedCard : banned) {
        if (counts.containsKey(bannedCard)) {
            addError(DeckValidatorErrorType.BANNED, bannedCard, "Banned", true);
            valid = false;
        }
    }
    valid = checkCounts(1, counts) && valid;
    Set<String> commanderNames = new HashSet<>();
    Set<String> signatureSpells = new HashSet<>();
    FilterMana allCommandersColor = new FilterMana();
    if (deck.getSideboard().size() < 2 || deck.getSideboard().size() > 4) {
        addError(DeckValidatorErrorType.PRIMARY, "Oathbreaker", "Sideboard must contain only 2 or 4 cards (oathbreaker + signature spell)");
        valid = false;
    } else {
        // collect data
        for (Card commander : deck.getSideboard()) {
            if (commander.isInstantOrSorcery()) {
                signatureSpells.add(commander.getName());
            } else {
                if (commander.hasCardTypeForDeckbuilding(CardType.PLANESWALKER)) {
                    commanderNames.add(commander.getName());
                    // color identity from commanders only, not spell
                    ManaUtil.collectColorIdentity(allCommandersColor, commander.getColorIdentity());
                } else {
                    addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Oathbreaker (only planeswalker can be Oathbreaker, not " + commander.getName(), true);
                    valid = false;
                }
            }
        }
        // check size (1+1 or 2+2 allows)
        if (commanderNames.isEmpty() || commanderNames.size() > 2) {
            addError(DeckValidatorErrorType.PRIMARY, "Oathbreaker", "Sideboard must contains 1 or 2 oathbreakers, but found: " + commanderNames.size());
            valid = false;
        }
        if (signatureSpells.isEmpty() || signatureSpells.size() > 2) {
            addError(DeckValidatorErrorType.PRIMARY, "Signature Spell", "Sideboard must contains 1 or 2 signature spells, but found: " + signatureSpells.size());
            valid = false;
        }
        if (signatureSpells.size() != commanderNames.size()) {
            addError(DeckValidatorErrorType.PRIMARY, "Oathbreaker", "Sideboard must contains 1 + 1 or 2 + 2 cards, but found: " + commanderNames.size() + " + " + signatureSpells.size());
            valid = false;
        }
        // check partners
        for (Card commander : deck.getSideboard()) {
            if (commanderNames.contains(commander.getName())) {
                // partner checks
                if (commanderNames.size() == 2 && !commander.getAbilities().contains(PartnerAbility.getInstance())) {
                    boolean partnersWith = false;
                    for (Ability ability : commander.getAbilities()) {
                        if (ability instanceof PartnerWithAbility && commanderNames.contains(((PartnerWithAbility) ability).getPartnerName())) {
                            partnersWith = true;
                            break;
                        }
                    }
                    if (!partnersWith) {
                        addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Oathbreaker without Partner (" + commander.getName() + ')', true);
                        valid = false;
                    }
                }
            }
        }
        // xmage doesn't allows to select pairs of spell + oathbreaker, what's why it requires one color combo minimum
        for (Card spell : deck.getSideboard()) {
            if (signatureSpells.contains(spell.getName())) {
                FilterMana spellColor = spell.getColorIdentity();
                boolean haveSameColor = false;
                for (Card commander : deck.getSideboard()) {
                    if (commanderNames.contains(commander.getName())) {
                        FilterMana commanderColor = commander.getColorIdentity();
                        if (ManaUtil.isColorIdentityCompatible(commanderColor, spellColor)) {
                            haveSameColor = true;
                        }
                    }
                }
                if (!haveSameColor) {
                    addError(DeckValidatorErrorType.PRIMARY, spell.getName(), "Signature Spell (can't find oathbreaker with compatible color identity: " + spell.getName() + " - " + spellColor + ")", true);
                    valid = false;
                }
            }
        }
    }
    // no needs in cards check on wrong commanders
    if (!valid) {
        return false;
    }
    for (Card card : deck.getCards()) {
        if (!ManaUtil.isColorIdentityCompatible(allCommandersColor, card.getColorIdentity())) {
            addError(DeckValidatorErrorType.OTHER, card.getName(), "Invalid color (" + card.getColorIdentity() + ')', true);
            valid = false;
        }
    }
    for (Card card : deck.getSideboard()) {
        if (!isSetAllowed(card.getExpansionSetCode())) {
            if (!legalSets(card)) {
                addError(DeckValidatorErrorType.WRONG_SET, card.getName(), "Not allowed Set: " + card.getExpansionSetCode(), true);
                valid = false;
            }
        }
    }
    return valid;
}
Also used : PartnerAbility(mage.abilities.keyword.PartnerAbility) PartnerWithAbility(mage.abilities.keyword.PartnerWithAbility) Ability(mage.abilities.Ability) PartnerWithAbility(mage.abilities.keyword.PartnerWithAbility) FilterMana(mage.filter.FilterMana) Card(mage.cards.Card)

Example 5 with FilterMana

use of mage.filter.FilterMana in project mage by magefree.

the class TinyLeaders method validate.

/**
 * @param deck
 * @return - True if deck is valid
 */
@Override
public boolean validate(Deck deck) {
    boolean valid = true;
    errorsList.clear();
    if (deck.getCards().size() != getDeckMinSize()) {
        addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " cards: has " + deck.getCards().size() + " cards");
        valid = false;
    }
    Map<String, Integer> counts = new HashMap<>();
    // add the commander to the counts, so it can't be in the deck or sideboard again
    counts.put(deck.getName(), 1);
    countCards(counts, deck.getCards());
    countCards(counts, deck.getSideboard());
    valid = checkCounts(1, counts) && valid;
    for (String bannedCard : banned) {
        if (counts.containsKey(bannedCard)) {
            addError(DeckValidatorErrorType.BANNED, bannedCard, "Banned", true);
            valid = false;
        }
    }
    if (deck.getSideboard().size() <= 10) {
        Card commander = GameTinyLeadersImpl.getCommanderCard(deck.getName(), null);
        if (commander == null || commander.getManaValue() > 3) {
            if (commander == null) {
                if (deck.getName() == null) {
                    addError(DeckValidatorErrorType.PRIMARY, "Leader", "You have to save your deck with the leader card name entered to the DECK NAME field of the DECK EDITOR (top left) so that XMage knows your leader." + "(You can use the \"Sultai\" for a UBG (3/3) default Commander or \"Glass\" for a colorless 3/3 default Commander.)");
                } else {
                    addError(DeckValidatorErrorType.PRIMARY, "Leader", "Leader [" + deck.getName() + "] not found. You have to enter the name of the leader card into the DECK NAME field of the DECK EDITOR (top left). Check your spelling " + "(use the \"Sultai\" for a UBG (3/3) default Commander or \"Glass\" for a colorless (3/3) default Commander)");
                }
            }
            if (commander != null && commander.getManaValue() > 3) {
                addError(DeckValidatorErrorType.PRIMARY, "Leader", "Commanders mana value is greater than 3");
            }
            return false;
        }
        if ((commander.hasCardTypeForDeckbuilding(CardType.CREATURE) && commander.isLegendary()) || commander.hasCardTypeForDeckbuilding(CardType.PLANESWALKER)) {
            if (!bannedCommander.contains(commander.getName())) {
                FilterMana color = commander.getColorIdentity();
                for (Card card : deck.getCards()) {
                    if (!isCardFormatValid(card, commander, color)) {
                        valid = false;
                    }
                }
                for (Card card : deck.getSideboard()) {
                    if (!isCardFormatValid(card, commander, color)) {
                        valid = false;
                    }
                }
            } else {
                addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Commander banned (" + commander.getName() + ')', true);
                valid = false;
            }
        } else {
            addError(DeckValidatorErrorType.PRIMARY, commander.getName(), "Commander invalide (" + commander.getName() + ')', true);
            valid = false;
        }
    } else {
        addError(DeckValidatorErrorType.PRIMARY, "Commander", "Sideboard must contain only a maximum of 10 sideboard cards (the Tiny Leader name must be written to the deck name)");
        valid = false;
    }
    for (Card card : deck.getCards()) {
        if (!isSetAllowed(card.getExpansionSetCode())) {
            if (!legalSets(card)) {
                addError(DeckValidatorErrorType.WRONG_SET, card.getName(), "Not allowed Set " + card.getExpansionSetCode(), true);
                valid = false;
            }
        }
    }
    for (Card card : deck.getSideboard()) {
        if (!isSetAllowed(card.getExpansionSetCode())) {
            if (!legalSets(card)) {
                addError(DeckValidatorErrorType.WRONG_SET, card.getName(), "Not allowed Set " + card.getExpansionSetCode(), true);
                valid = false;
            }
        }
    }
    return valid;
}
Also used : FilterMana(mage.filter.FilterMana) HashMap(java.util.HashMap)

Aggregations

FilterMana (mage.filter.FilterMana)17 Card (mage.cards.Card)10 Ability (mage.abilities.Ability)6 Mana (mage.Mana)5 CompanionAbility (mage.abilities.keyword.CompanionAbility)5 PartnerAbility (mage.abilities.keyword.PartnerAbility)5 PartnerWithAbility (mage.abilities.keyword.PartnerWithAbility)5 java.util (java.util)4 ObjectColor (mage.ObjectColor)4 CanBeYourCommanderAbility (mage.abilities.common.CanBeYourCommanderAbility)4 Constructed (mage.cards.decks.Constructed)4 Deck (mage.cards.decks.Deck)4 DeckValidatorErrorType (mage.cards.decks.DeckValidatorErrorType)4 CardType (mage.constants.CardType)4 Player (mage.players.Player)4 ManaUtil (mage.util.ManaUtil)4 UUID (java.util.UUID)3 ExpansionSet (mage.cards.ExpansionSet)3 Sets (mage.cards.Sets)3 FriendsForeverAbility (mage.abilities.keyword.FriendsForeverAbility)2