From e6af43b060a7dd53116546f49ab67a3f8820068e Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Wed, 30 May 2018 07:19:54 +0100 Subject: [PATCH] Implemented hand filtering properly using deck land ratio Made hand filtering optional and disabled by default --- .../src/main/java/forge/StaticData.java | 10 ++++++ .../src/main/java/forge/game/GameAction.java | 31 ++++++++++++++++--- .../home/settings/CSubmenuPreferences.java | 1 + .../home/settings/VSubmenuPreferences.java | 9 ++++++ .../forge/screens/settings/SettingsPage.java | 4 +++ .../src/main/java/forge/model/FModel.java | 2 ++ .../forge/properties/ForgePreferences.java | 1 + 7 files changed, 53 insertions(+), 5 deletions(-) diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 6c7d931d7b3..9e8629baf20 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -37,6 +37,8 @@ public class StaticData { private Predicate brawlPredicate; private Predicate modernPredicate; + private boolean filteredHandsEnabled = false; + // Loaded lazily: private IStorage boosters; private IStorage specialBoosters; @@ -209,6 +211,14 @@ public class StaticData { return brawlPredicate; } + public void setFilteredHandsEnabled(boolean filteredHandsEnabled){ + this.filteredHandsEnabled = filteredHandsEnabled; + } + + public boolean getFilteredHandsEnabled(){ + return filteredHandsEnabled; + } + public PaperCard getCardByEditionDate(PaperCard card, Date editionDate) { PaperCard c = this.getCommonCards().getCardFromEdition(card.getName(), editionDate, CardDb.SetPreference.LatestCoreExp, card.getArtIndex()); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 36b446dff47..ad4e4f6dc0a 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -20,6 +20,7 @@ package forge.game; import com.google.common.base.Predicate; import com.google.common.collect.*; import forge.GameCommand; +import forge.StaticData; import forge.card.CardStateName; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; @@ -1567,6 +1568,7 @@ public class GameAction { //check initial hand List lib1 = Lists.newArrayList(p1.getZone(ZoneType.Library).getCards().threadSafeIterable()); List hand1 = lib1.subList(0,p1.getMaxHandSize()); + System.out.println(hand1.toString()); //shuffle List shuffledCards = Lists.newArrayList(p1.getZone(ZoneType.Library).getCards().threadSafeIterable()); @@ -1574,22 +1576,38 @@ public class GameAction { //check a second hand List hand2 = shuffledCards.subList(0,p1.getMaxHandSize()); + System.out.println(hand2.toString()); //choose better hand according to land count - if(getHandScore(hand1)>getHandScore(hand2)){ + float averageLandRatio = getLandRatio(lib1); + if(getHandScore(hand1, averageLandRatio)>getHandScore(hand2, averageLandRatio)){ p1.getZone(ZoneType.Library).setCards(shuffledCards); } p1.drawCards(p1.getMaxHandSize()); } - private int getHandScore(List hand){ + private float getLandRatio(List deck){ + int landCount = 0; + for(Card c:deck){ + if(c.isLand()){ + landCount++; + } + } + if (landCount == 0 ){ + return 0; + } + return new Float(landCount)/new Float(deck.size()); + } + + private float getHandScore(List hand, float landRatio){ int landCount = 0; for(Card c:hand){ if(c.isLand()){ landCount++; } } - return Math.abs(3-landCount); + float averageCount = landRatio * hand.size(); + return Math.abs(averageCount-landCount); } public void startGame(GameOutcome lastGameOutcome) { @@ -1612,8 +1630,11 @@ public class GameAction { game.setAge(GameStage.Mulligan); for (final Player p1 : game.getPlayers()) { - - drawStartingHand(p1); + if (StaticData.instance().getFilteredHandsEnabled() ) { + drawStartingHand(p1); + } else { + p1.drawCards(p1.getStartingHandSize()); + } // If pl has Backup Plan as a Conspiracy draw that many extra hands diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index ef7276a47b3..d7efbea3719 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -101,6 +101,7 @@ public enum CSubmenuPreferences implements ICDoc { lstControls.add(Pair.of(view.getCbRandomArtInPools(), FPref.UI_RANDOM_ART_IN_POOLS)); lstControls.add(Pair.of(view.getCbEnforceDeckLegality(), FPref.ENFORCE_DECK_LEGALITY)); lstControls.add(Pair.of(view.getCbPerformanceMode(), FPref.PERFORMANCE_MODE)); + lstControls.add(Pair.of(view.getCbFilteredHands(), FPref.FILTERED_HANDS)); lstControls.add(Pair.of(view.getCbCloneImgSource(), FPref.UI_CLONE_MODE_SOURCE)); lstControls.add(Pair.of(view.getCbRemoveSmall(), FPref.DECKGEN_NOSMALL)); lstControls.add(Pair.of(view.getCbCardBased(), FPref.DECKGEN_CARDBASED)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index 3c3c2b37d65..6486d73aac3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -69,6 +69,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final JCheckBox cbWorkshopSyntax = new OptionsCheckBox("Workshop Syntax Checker"); private final JCheckBox cbEnforceDeckLegality = new OptionsCheckBox("Deck Conformance"); private final JCheckBox cbPerformanceMode = new OptionsCheckBox("Performance Mode"); + private final JCheckBox cbFilteredHands = new OptionsCheckBox("Filtered Hands"); private final JCheckBox cbImageFetcher = new OptionsCheckBox("Automatically Download Missing Card Art"); private final JCheckBox cbCloneImgSource = new OptionsCheckBox("Clones Use Original Card Art"); private final JCheckBox cbScaleLarger = new OptionsCheckBox("Scale Image Larger"); @@ -175,6 +176,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbPerformanceMode, titleConstraints); pnlPrefs.add(new NoteLabel("Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents)."), descriptionConstraints); + pnlPrefs.add(cbFilteredHands, titleConstraints); + pnlPrefs.add(new NoteLabel("Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart)"), descriptionConstraints); + pnlPrefs.add(cbCloneImgSource, titleConstraints); pnlPrefs.add(new NoteLabel("When enabled clones will use their original art instead of the cloned card's art."), descriptionConstraints); @@ -641,6 +645,11 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbPerformanceMode; } + /** @return {@link javax.swing.JCheckBox} */ + public JCheckBox getCbFilteredHands() { + return cbFilteredHands; + } + /** @return {@link javax.swing.JCheckBox} */ public JCheckBox getCbCloneImgSource() { return cbCloneImgSource; diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 5204f333eed..7d76e3f190d 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -117,6 +117,10 @@ public class SettingsPage extends TabPage { "Performance Mode", "Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents)."), 1); + lstSettings.addItem(new BooleanSetting(FPref.FILTERED_HANDS, + "Filtered Hands", + "Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart)"), + 1); lstSettings.addItem(new BooleanSetting(FPref.UI_CLONE_MODE_SOURCE, "Clones Use Original Card Art", "When enabled clones will use their original art instead of the cloned card's art."), diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index 782fd3ac175..3528ed4d14e 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -173,6 +173,8 @@ public final class FModel { magicDb.setBrawlPredicate(formats.get("Brawl").getFilterRules()); magicDb.setModernPredicate(formats.getModern().getFilterRules()); + magicDb.setFilteredHandsEnabled(preferences.getPrefBoolean(FPref.FILTERED_HANDS)); + blocks = new StorageBase<>("Block definitions", new CardBlock.Reader(ForgeConstants.BLOCK_DATA_DIR + "blocks.txt", magicDb.getEditions())); questPreferences = new QuestPreferences(); conquestPreferences = new ConquestPreferences(); diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index 96add1638de..7e2c7096384 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -154,6 +154,7 @@ public class ForgePreferences extends PreferencesStore { ENFORCE_DECK_LEGALITY ("true"), PERFORMANCE_MODE ("false"), + FILTERED_HANDS ("false"), DEV_MODE_ENABLED ("false"), DEV_WORKSHOP_SYNTAX ("false"),