From bd5a33edff83eaf76cb217b6931e0c7a82a8ea76 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 21 May 2022 16:39:05 +0800 Subject: [PATCH] refactor deckgen for adventure -some phones don't like streams --- .../stage/ConsoleCommandInterpreter.java | 10 +++ .../src/main/java/forge/deck/DeckgenUtil.java | 79 ++++++------------- 2 files changed, 34 insertions(+), 55 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index 68d93e5d6b5..aec9dbcc31f 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -219,6 +219,16 @@ public class ConsoleCommandInterpreter { } return "Enemy deck list dumped to stdout."; }); + registerCommand(new String[]{"dumpEnemyColorIdentity"}, s -> { + for(EnemyData E : new Array.ArrayIterator<>(WorldData.getAllEnemies())){ + Deck D = E.generateDeck(Current.player().isFantasyMode()); + DeckProxy DP = new DeckProxy(D, "Constructed", GameType.Constructed, null); + ColorSet colorSet = DP.getColor(); + System.out.printf("%s Colors: %s | Deck Colors: %s (%s)\n", E.name, E.colors, DP.getColorIdentity().toEnumSet().toString(), DP.getName() + ); + } + return "Enemy color Identity dumped to stdout."; + }); registerCommand(new String[]{"heal", "amount"}, s -> { if(s.length<1) return "Command needs 1 parameter"; int N = 0; diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index be89b6c962a..d128b0aa3de 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -8,8 +8,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.apache.commons.lang3.tuple.Pair; @@ -61,6 +59,7 @@ import forge.util.storage.IStorage; */ // TODO This class can be used for home menu constructed deck generation as well. public class DeckgenUtil { + private static List advPrecons = Lists.newArrayList(), advThemes = Lists.newArrayList(); public static Deck buildCardGenDeck(GameFormat format, boolean isForAI){ try { @@ -437,7 +436,14 @@ public class DeckgenUtil { /** @return {@link forge.deck.Deck} */ public static Deck getRandomOrPreconOrThemeDeck(String colors, boolean forAi, boolean isTheme) { final List selection = new ArrayList<>(); - List allDecks = new ArrayList<>(); + Deck deck = null; + if (advPrecons.isEmpty()) { + advPrecons.addAll(DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons())); + } + if (advThemes.isEmpty()) { + advThemes.addAll(DeckProxy.getAllThemeDecks()); + advThemes.addAll(DeckProxy.getNonEasyQuestDuelDecks()); + } if (!colors.isEmpty()) { for (char c : colors.toLowerCase().toCharArray()) { switch (c) { @@ -449,61 +455,24 @@ public class DeckgenUtil { } } } - //limit selection to three - if (!selection.isEmpty() && selection.size() < 4) { - //monocolor - if (selection.size() == 1) { - if (isTheme) { - //duels and theme - allDecks = Stream.concat(DeckProxy.getAllThemeDecks().parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60) - .filter(deckProxy -> deckProxy.getColor() != null && deckProxy.getColor().isMonoColor() - && deckProxy.getColor().hasExactlyColor(ColorSet.fromNames(selection).getColor())), - DeckProxy.getNonEasyQuestDuelDecks().parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60) - .filter(deckProxy -> deckProxy.getColor() != null && deckProxy.getColor().isMonoColor() - && deckProxy.getColor().hasExactlyColor(ColorSet.fromNames(selection).getColor()))) - .collect(Collectors.toList()); - } else { - allDecks = DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons()).parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60) - .filter(deckProxy -> deckProxy.getColor() != null && deckProxy.getColor().isMonoColor() && deckProxy.getColor().hasExactlyColor(ColorSet.fromNames(selection).getColor())) - .collect(Collectors.toList()); - } + try { + if (!selection.isEmpty() && selection.size() < 4) { + Predicate pred = Predicates.and(deckProxy -> deckProxy.getMainSize() <= 60, deckProxy -> deckProxy.getColorIdentity().hasAllColors(ColorSet.fromNames(colors.toCharArray()).getColor())); + if (isTheme) + deck = Aggregates.random(Iterables.filter(advThemes, pred)).getDeck(); + else + deck = Aggregates.random(Iterables.filter(advPrecons, pred)).getDeck(); } else { - if (isTheme) { - //duels and theme - allDecks = Stream.concat(DeckProxy.getAllThemeDecks().parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60) - .filter(deckProxy -> deckProxy.getColor() != null && deckProxy.getColor().hasAllColors(ColorSet.fromNames(selection).getColor())), - DeckProxy.getNonEasyQuestDuelDecks().parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60) - .filter(deckProxy -> deckProxy.getColor() != null && deckProxy.getColor().hasAllColors(ColorSet.fromNames(selection).getColor()))) - .collect(Collectors.toList()); - } else { - allDecks = DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons()).parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60) - .filter(deckProxy -> deckProxy.getColor() != null && deckProxy.getColor().hasAllColors(ColorSet.fromNames(selection).getColor())) - .collect(Collectors.toList()); - } - } - } else { - //no specific colors - if (isTheme) { - //duels and theme - allDecks = Stream.concat(DeckProxy.getAllThemeDecks().parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60), - DeckProxy.getNonEasyQuestDuelDecks().parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60)) - .collect(Collectors.toList()); - } else { - allDecks = DeckProxy.getAllPreconstructedDecks(QuestController.getPrecons()).parallelStream() - .filter(deckProxy -> deckProxy.getMainSize() <= 60) - .collect(Collectors.toList()); + if (isTheme) + deck = Aggregates.random(Iterables.filter(advThemes, deckProxy -> deckProxy.getMainSize() <= 60)).getDeck(); + else + deck = Aggregates.random(Iterables.filter(advPrecons, deckProxy -> deckProxy.getMainSize() <= 60)).getDeck(); } + } catch (Exception e) { + e.printStackTrace(); } - if (!allDecks.isEmpty()) { - return Aggregates.random(allDecks).getDeck(); + if (deck != null) { + return deck; } return DeckgenUtil.buildColorDeck(selection, null, forAi); }