From 02299a04005c0f06d494794d01dbfb4cc71208fc Mon Sep 17 00:00:00 2001 From: tehdiplomat Date: Mon, 11 Nov 2019 14:12:49 -0500 Subject: [PATCH] Add 7 Dwarves --- .../src/main/java/forge/deck/DeckFormat.java | 53 +++++++++++++------ .../deckeditor/controllers/ACEditorBase.java | 6 +++ .../src/forge/deck/FDeckEditor.java | 30 ++++------- forge-gui/res/cardsfolder/s/seven_dwarves.txt | 11 ++++ .../main/java/forge/quest/QuestSpellShop.java | 5 ++ 5 files changed, 69 insertions(+), 36 deletions(-) create mode 100644 forge-gui/res/cardsfolder/s/seven_dwarves.txt diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 99bc2613fad..f9cd57dc0ef 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -21,7 +21,6 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; - import forge.StaticData; import forge.card.CardRules; import forge.card.CardRulesPredicates; @@ -37,8 +36,11 @@ import forge.util.TextUtil; import org.apache.commons.lang3.Range; import org.apache.commons.lang3.tuple.ImmutablePair; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; import java.util.Map.Entry; +import java.util.Set; /** * GameType is an enum to determine the type of current game. :) @@ -324,23 +326,32 @@ public enum DeckFormat { } final int maxCopies = getMaxCardCopies(); - if (maxCopies < Integer.MAX_VALUE) { - //Must contain no more than 4 of the same card - //shared among the main deck and sideboard, except - //basic lands, Shadowborn Apostle, Relentless Rats and Rat Colony + //Must contain no more than 4 of the same card + //shared among the main deck and sideboard, except + //basic lands, Shadowborn Apostle, Relentless Rats and Rat Colony + // Seven Dwarves can have 7 in the deck. More than 7 in deck + sb is ok in Limited - final CardPool allCards = deck.getAllCardsInASinglePool(hasCommander()); + final CardPool allCards = deck.getAllCardsInASinglePool(hasCommander()); - // should group all cards by name, so that different editions of same card are really counted as the same card - for (final Entry cp : Aggregates.groupSumBy(allCards, PaperCard.FN_GET_NAME)) { - final IPaperCard simpleCard = StaticData.instance().getCommonCards().getCard(cp.getKey()); - if (simpleCard == null) { - return TextUtil.concatWithSpace("contains the nonexisting card", cp.getKey()); - } + // should group all cards by name, so that different editions of same card are really counted as the same card + for (final Entry cp : Aggregates.groupSumBy(allCards, PaperCard.FN_GET_NAME)) { + final IPaperCard simpleCard = StaticData.instance().getCommonCards().getCard(cp.getKey()); + // Might cause issues since it ignores "Special" Cards + if (simpleCard == null) { + return TextUtil.concatWithSpace("contains the nonexisting card", cp.getKey()); + } - if (!canHaveAnyNumberOf(simpleCard) && cp.getValue() > maxCopies) { - return TextUtil.concatWithSpace("must not contain more than", String.valueOf(maxCopies), "copies of the card", cp.getKey()); - } + if (canHaveAnyNumberOf(simpleCard)) { + continue; + } + + Integer cardCopies = canHaveSpecificNumberInDeck(simpleCard); + if (cardCopies != null && deck.getMain().countByName(cp.getKey(), true) > cardCopies) { + return TextUtil.concatWithSpace("must not contain more than", String.valueOf(cardCopies), "copies of the card", cp.getKey()); + } + + if (cardCopies == null && cp.getValue() > maxCopies) { + return TextUtil.concatWithSpace("must not contain more than", String.valueOf(maxCopies), "copies of the card", cp.getKey()); } } @@ -362,6 +373,16 @@ public enum DeckFormat { "A deck can have any number of cards named CARDNAME."); } + public static Integer canHaveSpecificNumberInDeck(final IPaperCard card) { + // Ideally, this would be parsed during card parsing and set this value + if (Iterables.contains(card.getRules().getMainPart().getKeywords(), + "A deck can have up to seven cards named CARDNAME.")) { + return 7; + } + + return null; + } + public static String getPlaneSectionConformanceProblem(final CardPool planes) { //Must contain at least 10 planes/phenomenons, but max 2 phenomenons. Singleton. if (planes == null || planes.countAll() < 10) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java index 1e809ae2752..3bd75e1d858 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/ACEditorBase.java @@ -212,6 +212,12 @@ public abstract class ACEditorBase cardAmountInfo = Iterables.find(cardsByName, new Predicate>() { @Override public boolean apply(Entry t) { diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index 4df93c636c4..ceeb090d095 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -10,11 +10,7 @@ import com.google.common.collect.ImmutableList; import forge.Forge; import forge.Forge.KeyInputAdapter; import forge.Graphics; -import forge.assets.FImage; -import forge.assets.FSkin; -import forge.assets.FSkinFont; -import forge.assets.FSkinImage; -import forge.assets.FTextureRegionImage; +import forge.assets.*; import forge.card.CardDb; import forge.card.CardEdition; import forge.card.CardPreferences; @@ -37,26 +33,14 @@ import forge.planarconquest.ConquestUtil; import forge.properties.ForgePreferences.FPref; import forge.screens.FScreen; import forge.screens.TabPageScreen; -import forge.toolbox.FContainer; -import forge.toolbox.FEvent; +import forge.toolbox.*; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FEvent.FEventType; -import forge.toolbox.FLabel; -import forge.toolbox.FOptionPane; -import forge.toolbox.GuiChoose; -import forge.util.Callback; -import forge.util.ItemPool; -import forge.util.Lang; -import forge.util.Localizer; -import forge.util.Utils; +import forge.util.*; import forge.util.storage.IStorage; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.Map.Entry; public class FDeckEditor extends TabPageScreen { @@ -779,6 +763,12 @@ public class FDeckEditor extends TabPageScreen { } else { max = (limit == CardLimit.Singleton ? 1 : FModel.getPreferences().getPrefInt(FPref.DECK_DEFAULT_CARD_LIMIT)); + + Integer cardCopies = DeckFormat.canHaveSpecificNumberInDeck(card); + if (cardCopies != null) { + max = cardCopies; + } + max -= deck.getMain().count(card); if (deck.has(DeckSection.Sideboard)) { max -= deck.get(DeckSection.Sideboard).count(card); diff --git a/forge-gui/res/cardsfolder/s/seven_dwarves.txt b/forge-gui/res/cardsfolder/s/seven_dwarves.txt new file mode 100644 index 00000000000..3e5e8db3f09 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/seven_dwarves.txt @@ -0,0 +1,11 @@ +Name:Seven Dwarves +ManaCost:1 R +Types:Creature Dwarf +PT:2/2 +K:A deck can have up to seven cards named CARDNAME. +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +1/+1 for each other creature named Seven Dwarves you control. +SVar:X:Count$Valid Creature.namedSeven Dwarves+Other +SVar:BuffedBy:Creature.namedSeven Dwarves +SVar:PlayMain1:TRUE +DeckNeeds:Name$Seven Dwarves +Oracle:Seven Dwarves gets +1/+1 for each other creature named Seven Dwarves you control.\nA deck can have up to seven cards named Seven Dwarves. \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index 5924404f35f..e3f49e70786 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -360,6 +360,11 @@ public class QuestSpellShop { //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.canHaveAnyNumberOf(card)) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); + } else { + Integer cardCopies = DeckFormat.canHaveSpecificNumberInDeck(card); + if (cardCopies != null) { + numToKeep = cardCopies; + } } if (numToKeep < item.getValue()) {