From 89c11676d7ca19b5d69502c9309d2c644d8560f2 Mon Sep 17 00:00:00 2001 From: drdev Date: Tue, 24 Nov 2015 19:07:10 +0000 Subject: [PATCH] Avoid prompting to order the same set of spell/abilities more than once --- .../forge/player/PlayerControllerHuman.java | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 0797596a199..eebee4a578e 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1195,20 +1195,44 @@ public class PlayerControllerHuman return HumanPlay.payCostDuringAbilityResolve(this, player, sa.getHostCard(), cost, sa, null); } + //stores saved order for different sets of SpellAbilities + private final HashMap> orderedSALookup = new HashMap>(); + @Override public void orderAndPlaySimultaneousSa(final List activePlayerSAs) { List orderedSAs = activePlayerSAs; - if (activePlayerSAs.size() > 1) { // give a dual list form to create instead of needing to do it one at a time + if (activePlayerSAs.size() > 1) { final String firstStr = orderedSAs.get(0).toString(); - for (int i = 1; i < orderedSAs.size(); i++) { //don't prompt user if all options are the same - if (!orderedSAs.get(i).toString().equals(firstStr)) { + boolean needPrompt = false; + String saLookupKey = firstStr; + char delim = (char)5; + for (int i = 1; i < orderedSAs.size(); i++) { + final String saStr = orderedSAs.get(i).toString(); + if (!needPrompt && !saStr.equals(firstStr)) { + needPrompt = true; //prompt by default unless all abilities are the same + } + saLookupKey += delim + saStr; + } + if (needPrompt) { + List savedOrder = orderedSALookup.get(saLookupKey); + if (savedOrder == null) { //prompt if no saved order for the current set of abilities orderedSAs = getGui().order("Select order for simultaneous abilities", "Resolve first", activePlayerSAs, null); - break; + //save order to avoid needing to prompt a second time to order the same abilties + savedOrder = new ArrayList(activePlayerSAs.size()); + for (SpellAbility sa : activePlayerSAs) { + savedOrder.add(orderedSAs.indexOf(sa)); + } + orderedSALookup.put(saLookupKey, savedOrder); + } + else { //avoid prompt and just apply saved order + orderedSAs = new ArrayList(); + for (Integer index : savedOrder) { + orderedSAs.add(activePlayerSAs.get(index)); + } } } } - final int size = orderedSAs.size(); - for (int i = size - 1; i >= 0; i--) { + for (int i = orderedSAs.size() - 1; i >= 0; i--) { final SpellAbility next = orderedSAs.get(i); if (next.isTrigger()) { HumanPlay.playSpellAbility(this, player, next);