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();
}
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;
}
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;
}
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;
}
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;
}
Aggregations