From ed9bc163cfe94f10f2672bceb513ffb2566d253d Mon Sep 17 00:00:00 2001 From: Myrd Date: Sat, 14 Feb 2015 15:06:14 +0000 Subject: [PATCH] Optimize replacement effect lookup during AI calculating mana. --- .../main/java/forge/ai/ComputerUtilMana.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 29cd709a537..c1c02ee435e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -1046,6 +1046,19 @@ public class ComputerUtilMana { final ArrayListMultimap manaMap = ArrayListMultimap.create(); final Game game = ai.getGame(); + List replacementEffects = new ArrayList(); + for (final Player p : game.getPlayers()) { + for (final Card crd : p.getAllCards()) { + for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) { + if (replacementEffect.requirementsCheck(game) + && replacementEffect.getMapParams().containsKey("ManaReplacement") + && replacementEffect.zonesCheck(game.getZoneOf(crd))) { + replacementEffects.add(replacementEffect); + } + } + } + } + // Loop over all current available mana sources for (final Card sourceCard : getAvailableMana(ai, checkPlayable)) { if (DEBUG_MANA_PAYMENT) { @@ -1085,23 +1098,17 @@ public class ComputerUtilMana { repParams.put("Player", ai); repParams.put("AbilityMana", m); - for (final Player p : game.getPlayers()) { - for (final Card crd : p.getAllCards()) { - for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) { - if (replacementEffect.requirementsCheck(game) - && replacementEffect.canReplace(repParams) - && replacementEffect.getMapParams().containsKey("ManaReplacement") - && replacementEffect.zonesCheck(game.getZoneOf(crd))) { - String repType = crd.getSVar(replacementEffect.getMapParams().get("ManaReplacement")); - if (repType.contains("Chosen")) { - repType = repType.replace("Chosen", MagicColor.toShortString(crd.getChosenColor())); - } - mp.setManaReplaceType(repType); - } + for (final ReplacementEffect replacementEffect : replacementEffects) { + if (replacementEffect.canReplace(repParams)) { + Card crd = replacementEffect.getHostCard(); + String repType = crd.getSVar(replacementEffect.getMapParams().get("ManaReplacement")); + if (repType.contains("Chosen")) { + repType = repType.replace("Chosen", MagicColor.toShortString(crd.getChosenColor())); } + mp.setManaReplaceType(repType); } } - + Set reflectedColors = CardUtil.getReflectableManaColors(m); // find possible colors if (mp.canProduce("W", m) || reflectedColors.contains(MagicColor.Constant.WHITE)) {