diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java index 574bfec565d..d59a9fa4efb 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java @@ -133,14 +133,7 @@ public class AusHighlander extends Constructed { Map counts = new HashMap<>(); countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - for (Map.Entry entry : counts.entrySet()) { - if (entry.getValue() > 1) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(1, counts) && valid; int totalPoints = 0; for (Map.Entry entry : counts.entrySet()) { diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java index 8b1feca862b..fdf8ace0736 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Brawl.java @@ -49,14 +49,7 @@ public class Brawl extends Constructed { Map counts = new HashMap<>(); countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - for (Map.Entry entry : counts.entrySet()) { - if (entry.getValue() > 1) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(1, counts) && valid; for (String bannedCard : banned) { if (counts.containsKey(bannedCard)) { diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java index 527cbbead6d..7af1dc83a9e 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java @@ -88,14 +88,7 @@ public class CanadianHighlander extends Constructed { Map counts = new HashMap<>(); countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - for (Map.Entry entry : counts.entrySet()) { - if (entry.getValue() > 1) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(1, counts) && valid; int allowedPoints = 10; int totalPoints = 0; diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java index d9fcf98cd2e..431aa35cbf4 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Commander.java @@ -99,14 +99,7 @@ public class Commander extends Constructed { Map counts = new HashMap<>(); countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - for (Map.Entry entry : counts.entrySet()) { - if (entry.getValue() > 1) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(1, counts) && valid; for (String bannedCard : banned) { if (counts.containsKey(bannedCard)) { diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/FreeformCommander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/FreeformCommander.java index fc6da30d759..8a1a41c6316 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/FreeformCommander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/FreeformCommander.java @@ -59,14 +59,7 @@ public class FreeformCommander extends Constructed { countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - for (Map.Entry entry : counts.entrySet()) { - if (entry.getValue() > 1) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(1, counts) && valid; if (deck.getSideboard().isEmpty() || deck.getSideboard().size() > 2) { invalid.put("Commander", "Sideboard must contain only the commander(s)"); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Oathbreaker.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Oathbreaker.java index 28231f41e73..5ca36ba2161 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Oathbreaker.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/Oathbreaker.java @@ -99,14 +99,7 @@ public class Oathbreaker extends Vintage { } } - for (Map.Entry entry : counts.entrySet()) { - if (entry.getValue() > 1) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(1, counts) && valid; Set commanderNames = new HashSet<>(); Set signatureSpells = new HashSet<>(); diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java index a93db2a326f..e136d332054 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/TinyLeaders.java @@ -113,14 +113,7 @@ public class TinyLeaders extends Constructed { counts.put(deck.getName(), 1); // add the commander to the counts, so it can't be in the deck or sideboard again countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - for (Map.Entry entry : counts.entrySet()) { - if (entry.getValue() > 1) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(1, counts) && valid; for (String bannedCard : banned) { if (counts.containsKey(bannedCard)) { diff --git a/Mage.Server.Plugins/Mage.Deck.Limited/src/mage/deck/Limited.java b/Mage.Server.Plugins/Mage.Deck.Limited/src/mage/deck/Limited.java index 30d32964e01..542f0450457 100644 --- a/Mage.Server.Plugins/Mage.Deck.Limited/src/mage/deck/Limited.java +++ b/Mage.Server.Plugins/Mage.Deck.Limited/src/mage/deck/Limited.java @@ -3,6 +3,9 @@ package mage.deck; import mage.cards.decks.Deck; import mage.cards.decks.DeckValidator; +import java.util.HashMap; +import java.util.Map; + /** * @author BetaSteward_at_googlemail.com */ @@ -29,9 +32,15 @@ public class Limited extends DeckValidator { if (deck.getCards().size() < getDeckMinSize()) { invalid.put("Deck", "Must contain at least " + getDeckMinSize() + " cards: has only " + deck.getCards().size() + " cards"); valid = false; - + } + Map counts = new HashMap<>(); + countCards(counts, deck.getCards()); + for (Map.Entry entry : counts.entrySet()) { + if (entry.getValue() > 7 && entry.getKey().equals("Seven Dwarves")) { + invalid.put(entry.getKey(), "Too many: " + entry.getValue()); + valid = false; + } } return valid; } - } diff --git a/Mage.Sets/src/mage/cards/s/SevenDwarves.java b/Mage.Sets/src/mage/cards/s/SevenDwarves.java new file mode 100644 index 00000000000..03a6b1caa1b --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SevenDwarves.java @@ -0,0 +1,64 @@ +package mage.cards.s; + +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.permanent.AnotherPredicate; + +import java.util.UUID; + +/** + * @author TheElk801 + */ +public final class SevenDwarves extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(AnotherPredicate.instance); + filter.add(new NamePredicate("Seven Dwarves")); + } + + private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter); + + public SevenDwarves(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.DWARF); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Seven Dwarves gets +1/+1 for each other creature named Seven Dwarves you control. + this.addAbility(new SimpleStaticAbility( + new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield).setText( + "{this} gets +1/+1 for each other creature named Seven Dwarves you control" + ) + )); + + // A deck can have up to seven cards named Seven Dwarves. + this.addAbility(new SimpleStaticAbility( + Zone.ALL, new InfoEffect("A deck can have up to seven cards named Seven Dwarves.") + )); + } + + private SevenDwarves(final SevenDwarves card) { + super(card); + } + + @Override + public SevenDwarves copy() { + return new SevenDwarves(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java index 222d60f52a5..4c7b18c94e9 100644 --- a/Mage.Sets/src/mage/sets/ThroneOfEldraine.java +++ b/Mage.Sets/src/mage/sets/ThroneOfEldraine.java @@ -155,6 +155,7 @@ public final class ThroneOfEldraine extends ExpansionSet { cards.add(new SetCardInfo("Savvy Hunter", 200, Rarity.UNCOMMON, mage.cards.s.SavvyHunter.class)); cards.add(new SetCardInfo("Scorching Dragonfire", 139, Rarity.COMMON, mage.cards.s.ScorchingDragonfire.class)); cards.add(new SetCardInfo("Searing Barrage", 140, Rarity.COMMON, mage.cards.s.SearingBarrage.class)); + cards.add(new SetCardInfo("Seven Dwarves", 141, Rarity.COMMON, mage.cards.s.SevenDwarves.class)); cards.add(new SetCardInfo("Shimmer Dragon", 317, Rarity.RARE, mage.cards.s.ShimmerDragon.class)); cards.add(new SetCardInfo("Shinechaser", 201, Rarity.UNCOMMON, mage.cards.s.Shinechaser.class)); cards.add(new SetCardInfo("Shining Armor", 29, Rarity.COMMON, mage.cards.s.ShiningArmor.class)); diff --git a/Mage/src/main/java/mage/cards/decks/Constructed.java b/Mage/src/main/java/mage/cards/decks/Constructed.java index aaa95e435bb..8718c635408 100644 --- a/Mage/src/main/java/mage/cards/decks/Constructed.java +++ b/Mage/src/main/java/mage/cards/decks/Constructed.java @@ -16,8 +16,8 @@ public class Constructed extends DeckValidator { private static final Logger logger = Logger.getLogger(DeckValidator.class); - protected static final List anyNumberCardsAllowed = new ArrayList<>(Arrays.asList( - "Relentless Rats", "Shadowborn Apostle", "Rat Colony", "Persistent Petitioners" + private static final List anyNumberCardsAllowed = new ArrayList<>(Arrays.asList( + "Relentless Rats", "Shadowborn Apostle", "Rat Colony", "Persistent Petitioners", "Seven Dwarves" )); protected static final List basicLandNames = new ArrayList<>(Arrays.asList( "Forest", "Island", "Mountain", "Swamp", "Plains", "Wastes", "Snow-Covered Forest", @@ -67,14 +67,8 @@ public class Constructed extends DeckValidator { Map counts = new HashMap<>(); countCards(counts, deck.getCards()); countCards(counts, deck.getSideboard()); - for (Entry entry : counts.entrySet()) { - if (entry.getValue() > 4) { - if (!basicLandNames.contains(entry.getKey()) && !anyNumberCardsAllowed.contains(entry.getKey())) { - invalid.put(entry.getKey(), "Too many: " + entry.getValue()); - valid = false; - } - } - } + valid = checkCounts(4, counts) && valid; + for (String bannedCard : banned) { if (counts.containsKey(bannedCard)) { invalid.put(bannedCard, "Banned"); @@ -179,4 +173,21 @@ public class Constructed extends DeckValidator { } return legal; } + + protected boolean checkCounts(int maxCopies, Map counts) { + boolean valid = true; + for (Entry entry : counts.entrySet()) { + if (entry.getValue() > maxCopies + && !basicLandNames.contains(entry.getKey()) + && !anyNumberCardsAllowed.contains(entry.getKey())) { + invalid.put(entry.getKey(), "Too many: " + entry.getValue()); + valid = false; + } + if (entry.getValue() > 7 && entry.getKey().equals("Seven Dwarves")) { + invalid.put(entry.getKey(), "Too many: " + entry.getValue()); + valid = false; + } + } + return valid; + } }