From 9993366adef453d143bae3afd0ba7cad270c9bf6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 16 Apr 2018 07:36:44 +0300 Subject: [PATCH 1/3] - Experimental: DigAi prefers to give lands to the opponent instead of functional cards e.g. for Karn, Scion of Urza. --- forge-ai/src/main/java/forge/ai/ability/DigAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java index 1c98e4e25ac..17b4a8c6299 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java @@ -126,7 +126,7 @@ public class DigAi extends SpellAbilityAi { public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable valid, boolean isOptional, Player relatedPlayer) { Card chosen = ComputerUtilCard.getBestAI(valid); if (sa.getActivatingPlayer().isOpponentOf(ai) && relatedPlayer.isOpponentOf(ai)) { - return ComputerUtilCard.getWorstAI(valid); + return ComputerUtilCard.getWorstPermanentAI(valid, false, true, false, false); } return chosen; } From 77da5c973b1ad659da6848301add5e602ab995b7 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Wed, 18 Apr 2018 22:54:52 +0100 Subject: [PATCH 2/3] Fixed repeated cards in brawl --- .../src/main/java/forge/deck/DeckgenUtil.java | 5 ++++- .../forge/limited/CardThemedDeckBuilder.java | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 8f1872893bb..7636f166389 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -5,6 +5,7 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.StaticData; import forge.card.CardDb; import forge.card.CardRules; import forge.card.CardRulesPredicates; @@ -540,7 +541,7 @@ public class DeckgenUtil { if(partners.size()>0&&commander.getRules().canBePartnerCommander()){ selectedPartner=partners.get(MyRandom.getRandom().nextInt(partners.size())); - preSelectedCards.remove(selectedPartner); + preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(selectedPartner.getName())); } //randomly remove cards int removeCount=0; @@ -562,6 +563,7 @@ public class DeckgenUtil { ++i; } preSelectedCards.removeAll(toRemove); + preSelectedCards.removeAll(StaticData.instance().getCommonCards().getAllCards(commander.getName())); gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,preSelectedCards,forAi,format); }else{ cardDb = FModel.getMagicDb().getCommonCards(); @@ -582,6 +584,7 @@ public class DeckgenUtil { } List shortList = cardList.subList(1, shortlistlength); shortList.remove(commander); + shortList.removeAll(StaticData.instance().getCommonCards().getAllCards(commander.getName())); gen = new CardThemedCommanderDeckBuilder(commander, selectedPartner,shortList,forAi,format); } diff --git a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java index 57c709bdcba..520e998ec30 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java @@ -4,6 +4,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.StaticData; import forge.card.*; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; @@ -503,17 +504,22 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { @Override public boolean apply(PaperCard card) { return format.isLegalCard(card) - &&!card.getRules().getManaCost().isPureGeneric() + && !card.getRules().getManaCost().isPureGeneric() && colors.containsAllColorsFrom(card.getRules().getColorIdentity().getColor()) && !deckList.contains(card) - && (keyCard == null || !keyCard.equals(card)) - && (secondKeyCard==null || !secondKeyCard.equals(card)) - &&!card.getRules().getAiHints().getRemAIDecks() - &&!card.getRules().getAiHints().getRemRandomDecks() - &&!card.getRules().getMainPart().getType().isLand(); + && !card.getRules().getAiHints().getRemAIDecks() + && !card.getRules().getAiHints().getRemRandomDecks() + && !card.getRules().getMainPart().getType().isLand(); } }; List randomPool = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); + //ensure we do not add more keycards in case they are commanders + if (keyCard != null) { + randomPool.removeAll(StaticData.instance().getCommonCards().getAllCards(keyCard.getName())); + } + if (secondKeyCard != null) { + randomPool.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName())); + } Collections.shuffle(randomPool, MyRandom.getRandom()); Iterator iRandomPool=randomPool.iterator(); while (deckList.size() < targetSize) { From 76cad4ae7e587b8057128e320a579917a309f283 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 19 Apr 2018 12:58:15 +0100 Subject: [PATCH 3/3] Fixed repeated cards in brawl and improved quality of randomly added cards --- .../forge/limited/CardThemedDeckBuilder.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java index 520e998ec30..de75375989b 100644 --- a/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/limited/CardThemedDeckBuilder.java @@ -479,6 +479,14 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } } + private Set getDeckListNames(){ + Set deckListNames = new HashSet<>(); + for(PaperCard card:deckList){ + deckListNames.add(card.getName()); + } + return deckListNames; + } + /** * If the deck does not have 40 cards, fix it. This method should not be * called if the stuff above it is working correctly. @@ -501,25 +509,27 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } Predicate possibleFromFullPool = new Predicate() { + Set deckListNames = getDeckListNames(); @Override public boolean apply(PaperCard card) { return format.isLegalCard(card) && !card.getRules().getManaCost().isPureGeneric() && colors.containsAllColorsFrom(card.getRules().getColorIdentity().getColor()) - && !deckList.contains(card) + && !deckListNames.contains(card.getName()) && !card.getRules().getAiHints().getRemAIDecks() && !card.getRules().getAiHints().getRemRandomDecks() && !card.getRules().getMainPart().getType().isLand(); } }; - List randomPool = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); + List possibleList = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); //ensure we do not add more keycards in case they are commanders if (keyCard != null) { - randomPool.removeAll(StaticData.instance().getCommonCards().getAllCards(keyCard.getName())); + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(keyCard.getName())); } if (secondKeyCard != null) { - randomPool.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName())); + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName())); } + List randomPool = CardRanker.rankCardsInDeck(possibleList).subList(0,new Float(possibleList.size()*0.25).intValue()); Collections.shuffle(randomPool, MyRandom.getRandom()); Iterator iRandomPool=randomPool.iterator(); while (deckList.size() < targetSize) { @@ -734,20 +744,29 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { * number to add */ private void addRandomCards(int num) { + Set deckListNames = getDeckListNames(); Predicate possibleFromFullPool = new Predicate() { @Override public boolean apply(PaperCard card) { return format.isLegalCard(card) &&!card.getRules().getManaCost().isPureGeneric() && colors.containsAllColorsFrom(card.getRules().getColorIdentity().getColor()) - && !deckList.contains(card) + && !deckListNames.contains(card.getName()) &&!card.getRules().getAiHints().getRemAIDecks() &&!card.getRules().getAiHints().getRemRandomDecks() &&!card.getRules().getMainPart().getType().isLand(); } }; - List randomPool = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); - Collections.shuffle(randomPool, MyRandom.getRandom()); + List possibleList = Lists.newArrayList(pool.getAllCards(possibleFromFullPool)); + //ensure we do not add more keycards in case they are commanders + if (keyCard != null) { + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(keyCard.getName())); + } + if (secondKeyCard != null) { + possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName())); + } + List randomPool = CardRanker.rankCardsInDeck(possibleList).subList(0,new Float(possibleList.size()*0.25).intValue()); + Collections.shuffle(randomPool); Iterator iRandomPool=randomPool.iterator(); for(int i=0;i