Merge branch 'multiplayer' into 'master'

ensure that View(s) are used for ManaAbility choice(s)

See merge request core-developers/forge!251
This commit is contained in:
Sol
2018-02-24 00:14:05 +00:00

View File

@@ -7,6 +7,7 @@ import java.util.List;
import java.util.Queue; import java.util.Queue;
import forge.game.GameActionUtil; import forge.game.GameActionUtil;
import forge.game.spellability.SpellAbilityView;
import forge.util.TextUtil; import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -193,7 +194,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
return false; return false;
} }
List<SpellAbility> abilities = new ArrayList<SpellAbility>(); HashMap<SpellAbilityView, SpellAbility> abilitiesMap = new HashMap<>();
// you can't remove unneeded abilities inside a for (am:abilities) loop :( // you can't remove unneeded abilities inside a for (am:abilities) loop :(
final String typeRes = manaCost.getSourceRestriction(); final String typeRes = manaCost.getSourceRestriction();
@@ -222,7 +223,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
} }
} }
abilities.add(ma); abilitiesMap.put(ma.getView(), ma);
// skip express mana if the ability is not undoable or reusable // skip express mana if the ability is not undoable or reusable
if (!ma.isUndoable() || !ma.getPayCosts().isRenewableResource() || ma.getSubAbility() != null) { if (!ma.isUndoable() || !ma.getPayCosts().isRenewableResource() || ma.getSubAbility() != null) {
@@ -230,7 +231,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
} }
} }
if (abilities.isEmpty() || (chosenAbility != null && !abilities.contains(chosenAbility))) { if (abilitiesMap.isEmpty() || (chosenAbility != null && !abilitiesMap.containsKey(chosenAbility))) {
return false; return false;
} }
@@ -263,10 +264,10 @@ public abstract class InputPayMana extends InputSyncronizedBase {
isPayingGeneric = true; // for further processing isPayingGeneric = true; // for further processing
} }
else { else {
final List<SpellAbility> colorMatches = new ArrayList<SpellAbility>(); final HashMap<SpellAbilityView, SpellAbility> colorMatches = new HashMap<>();
for (SpellAbility sa : abilities) { for (SpellAbility sa : abilitiesMap.values()) {
if (abilityProducesManaColor(sa, sa.getManaPartRecursive(), colorNeeded)) { if (abilityProducesManaColor(sa, sa.getManaPartRecursive(), colorNeeded)) {
colorMatches.add(sa); colorMatches.put(sa.getView(), sa);
} }
} }
@@ -275,9 +276,9 @@ public abstract class InputPayMana extends InputSyncronizedBase {
// This is wrong. Sometimes all abilities aren't created equal // This is wrong. Sometimes all abilities aren't created equal
choice = false; choice = false;
} }
else if (colorMatches.size() < abilities.size()) { else if (colorMatches.size() < abilitiesMap.size()) {
// leave behind only color matches // leave behind only color matches
abilities = colorMatches; abilitiesMap = colorMatches;
} }
} }
} }
@@ -289,7 +290,8 @@ public abstract class InputPayMana extends InputSyncronizedBase {
final SpellAbility chosen; final SpellAbility chosen;
if (chosenAbility == null) { if (chosenAbility == null) {
chosen = abilities.size() > 1 && choice ? getController().getGui().one("Choose mana ability", abilities) : abilities.get(0); ArrayList<SpellAbilityView> choices = new ArrayList<>(abilitiesMap.keySet());
chosen = abilitiesMap.size() > 1 && choice ? abilitiesMap.get(getController().getGui().one("Choose mana ability", choices)) : abilitiesMap.get(choices.get(0));
} else { } else {
chosen = chosenAbility; chosen = chosenAbility;
} }