diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 86fbc9e25b0..faed8a063a9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2216,9 +2216,7 @@ public class ComputerUtil { } return ComputerUtilCard.getBestAI(list); } else { - // TODO: This is just picking randomly amongst already picked things. It should probably pick the worst instead. - List a = Arrays.asList(votes.keySet().toArray()); - return a.get(MyRandom.getRandom().nextInt(a.size())); + return Iterables.getFirst(votes.keySet(), null); } case "Protection": if (votes.isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 1514aeb9199..3011e56ba06 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -134,11 +134,7 @@ public class ComputerUtilMana { Collections.sort(orderedCards, new Comparator() { @Override public int compare(final Card card1, final Card card2) { - int result = Integer.compare(manaCardMap.get(card1), manaCardMap.get(card2)); - if(result == 0) { - result = Float.compare(card1.getTimestamp(), card2.getTimestamp()); - } - return result; + return Integer.compare(manaCardMap.get(card1), manaCardMap.get(card2)); } }); @@ -312,7 +308,7 @@ public class ComputerUtilMana { } // select which abilities may be used for each shard - ListMultimap sourcesForShards = ComputerUtilMana.groupAndOrderToPayShards(ai, manaAbilityMap, cost); + Multimap sourcesForShards = ComputerUtilMana.groupAndOrderToPayShards(ai, manaAbilityMap, cost); sortManaAbilities(sourcesForShards); @@ -862,6 +858,7 @@ public class ComputerUtilMana { } AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + int chanceToReserve = aic.getIntProperty(AiProps.RESERVE_MANA_FOR_MAIN2_CHANCE); PhaseType curPhase = ai.getGame().getPhaseHandler().getPhase(); @@ -880,8 +877,7 @@ public class ComputerUtilMana { // obey mana reservations for Main 2; otherwise, obey mana reservations depending on the "chance to reserve" // AI profile variable. if (sa.getSVar("LowPriorityAI").equals("")) { - float chanceToReserve = aic.getFloatProperty(AiProps.RESERVE_MANA_FOR_MAIN2_CHANCE); - if (MyRandom.getRandom().nextDouble() >= chanceToReserve) { + if (chanceToReserve == 0 || MyRandom.getRandom().nextInt(100) >= chanceToReserve) { return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index aa07131ee19..05ba5338e55 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -5,7 +5,6 @@ import java.util.List; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; - import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilCard; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java b/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java index 60e26137f9e..ddb90e701f1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; - import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.player.Player; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java index ce5f7f7246d..42e66c01d0a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; - import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index fa264850ec8..82dc7f1adfd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.collect.Lists; - import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCost; import forge.ai.ComputerUtilMana; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java index 09c33932bc7..ba2043efa14 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.base.Predicates; - import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; diff --git a/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java b/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java index f846683f935..87e9d2d9464 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.collect.Iterables; - import forge.ai.SpellAbilityAi; import forge.game.card.Card; import forge.game.card.CounterType; diff --git a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java index a32265d2892..509ff22f3a0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.collect.Maps; - import forge.ai.ComputerUtil; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java index f7b3d947ef4..dffcc09e823 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.base.Predicates; - import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java index afd693bd300..d800ec0e3a2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; - import forge.ai.ComputerUtilCard; import forge.ai.SpecialCardAi; import forge.ai.SpellAbilityAi; diff --git a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java index 41ef5175d29..a831818c7da 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.base.Predicates; - import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; import forge.game.ability.ApiType; diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 2c0415b6064..350f368a817 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -1,7 +1,6 @@ package forge.ai.ability; import com.google.common.base.Predicate; - import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.card.CardSplitType; diff --git a/forge-core/src/main/java/forge/util/MyRandom.java b/forge-core/src/main/java/forge/util/MyRandom.java index 22b551932a3..85d148b96d2 100644 --- a/forge-core/src/main/java/forge/util/MyRandom.java +++ b/forge-core/src/main/java/forge/util/MyRandom.java @@ -34,27 +34,22 @@ public class MyRandom { private static Random random = new SecureRandom(); /** - * Changes into a non-CSPRNG, which can be seeded for use in tests/repeatable experiments. - */ - public static void setSeed(int seed) { - System.out.println("Setting the RNG seed to: " + seed); - random = new Random(seed); - } - - /** - * Returns True with Percent probability. + *

+ * percentTrue.
+ * If percent is like 30, then 30% of the time it will be true. + *

* - * TODO: My guess is no one is passing in a number scaled to 100. This API should probably be cut. + * @param percent + * a int. + * @return a boolean. */ - public static boolean percentTrue(final long percent) { - return percent > MyRandom.getRandom().nextDouble() * 100; + public static boolean percentTrue(final int percent) { + return percent > MyRandom.getRandom().nextInt(100); } /** * Gets the random. * - * TODO: Make this private, and instead add a robust set of APIs here. - * * @return the random */ public static Random getRandom() { @@ -65,7 +60,7 @@ public class MyRandom { int[] groups = new int[numGroups]; for (int i = 0; i < value; i++) { - groups[MyRandom.getRandom().nextInt(numGroups)]++; + groups[random.nextInt(numGroups)]++; } return groups; diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java index 96dbca811eb..80393dc2186 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java @@ -35,7 +35,7 @@ public class KeywordCollection implements Iterable, Serializable { } public int size() { - return map.size(); + return map.values().size(); } public int getAmount(Keyword keyword) { diff --git a/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java b/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java index da27a3860fe..586e7c0231f 100644 --- a/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java +++ b/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java @@ -22,7 +22,6 @@ import forge.game.player.RegisteredPlayer; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.util.Lang; -import forge.util.MyRandom; public class SimulateMatch { public static void simulate(String[] args) { @@ -56,7 +55,6 @@ public class SimulateMatch { } else { System.err.println("Illegal parameter usage"); - argumentHelp(); return; } } @@ -80,10 +78,6 @@ public class SimulateMatch { type = GameType.valueOf(WordUtils.capitalize(params.get("f").get(0))); } - if (params.containsKey("s")) { - MyRandom.setSeed(Integer.parseInt(params.get("s").get(0))); - } - GameRules rules = new GameRules(type); rules.setAppliedVariants(EnumSet.of(type)); @@ -151,7 +145,7 @@ public class SimulateMatch { } private static void argumentHelp() { - System.out.println("Syntax: forge.exe sim -d ... -D [D] -n [N] -m [M] -t [T] -p [P] -f [F] -s [S] -q"); + System.out.println("Syntax: forge.exe sim -d ... -D [D] -n [N] -m [M] -t [T] -p [P] -f [F] -q"); System.out.println("\tsim - stands for simulation mode"); System.out.println("\tdeck1 (or deck2,...,X) - constructed deck name or filename (has to be quoted when contains multiple words)"); System.out.println("\tdeck is treated as file if it ends with a dot followed by three numbers or letters"); @@ -161,7 +155,6 @@ public class SimulateMatch { System.out.println("\tT - Type of tournament to run with all provided decks (Bracket, RoundRobin, Swiss)"); System.out.println("\tP - Amount of players per match (used only with Tournaments, defaults to 2)"); System.out.println("\tF - format of games, defaults to constructed"); - System.out.println("\ts - Set the RNG seed. Use if you want to play the same game twice."); System.out.println("\tq - Quiet flag. Output just the game result, not the entire game log."); } @@ -174,6 +167,7 @@ public class SimulateMatch { final Game g1 = mc.createGame(); // will run match in the same thread + long startTime = System.currentTimeMillis(); try { TimeLimitedCodeBlock.runWithTimeout(new Runnable() { @Override diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index c902306c00d..7fea93ce0e4 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -183,7 +183,7 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); Game simGame = sim.getSimulatedGameState(); - SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph"); // —Reveal a black card + SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph—Reveal a black card"); assertNotNull(unmorphSA); sim.simulateSpellAbility(unmorphSA); assertEquals(18, simGame.getPlayers().get(0).getLife()); diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java index 5813982902e..e3aee9cb6f5 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java @@ -29,14 +29,12 @@ import forge.item.IPaperCard; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.util.MyRandom; import junit.framework.TestCase; public class SimulationTestCase extends TestCase { private static boolean initialized = false; protected Game initAndCreateGame() { - MyRandom.setSeed(0); // Initialize the random seed to create predictable tests. List players = Lists.newArrayList(); Deck d1 = new Deck(); players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p2", null))); diff --git a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java index 91ceec02115..54a67f8f575 100644 --- a/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java +++ b/forge-gui/src/main/java/forge/quest/QuestDraftUtils.java @@ -368,6 +368,9 @@ public class QuestDraftUtils { // Update dialog with winner } + RegisteredPlayer regPlayer = mc.getWinner(); + //draft.setWinner(regPlayer.getPlayer().getName()); + //FModel.getQuest().save(); gui.finishGame(); } else { final HostedMatch newMatch = GuiBase.getInterface().hostMatch();