From cfcb0b754980637dd063f59d080ee78084ad9ce1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 5 Sep 2014 06:20:28 +0000 Subject: [PATCH] - Refactored the code that deals with holding mana sources for spells. Still need to figure out where to best place the decision to hold mana so that the AI is not too conservative in its plays related to useful pump spells. --- .../src/main/java/forge/ai/AiCardMemory.java | 9 +++++++++ .../src/main/java/forge/ai/ability/PumpAi.java | 6 ------ .../main/java/forge/ai/ability/PumpAiBase.java | 16 +++++++++++++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index c058fbd3a90..8f6ee2995c2 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -209,6 +209,15 @@ public class AiCardMemory { return false; } + /** + * Determines if the memory set is empty. + * @param set the memory set to inspect. + * @return true, if the given memory set contains no remembered cards. + */ + public boolean isMemorySetEmpty(MemorySet set) { + return getMemorySet(set).isEmpty(); + } + /** * Clears the "remembered attackers" memory set stored in this card memory for the given player. */ diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index c27e50c2b0b..24b5edc2b68 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -5,7 +5,6 @@ import forge.game.Game; import forge.game.GameObject; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; -import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; @@ -49,11 +48,6 @@ public class PumpAi extends PumpAiBase { */ @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { - SpellAbility futureSpell = ((PlayerControllerAi)ai.getController()).getAi().predictSpellToCastInMain2(ApiType.Pump); - if (futureSpell != null && futureSpell.getHostCard() != null) { - ((PlayerControllerAi)ai.getController()).getAi().reserveManaSourcesForMain2(futureSpell); - } - final Cost cost = sa.getPayCosts(); final Game game = ai.getGame(); final PhaseHandler ph = game.getPhaseHandler(); diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 738c10e3c77..53ec1c39442 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -3,13 +3,17 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; +import forge.ai.AiCardMemory; +import forge.ai.AiController; import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilCombat; +import forge.ai.PlayerControllerAi; import forge.ai.SpellAbilityAi; import forge.card.MagicColor; import forge.game.Game; +import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardFactory; import forge.game.card.CardLists; @@ -439,6 +443,16 @@ public abstract class PumpAiBase extends SpellAbilityAi { return false; } + // determine if some mana sources need to be held for the future spell to cast in Main 2 before determining whether to pump. + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + if (aic.getCardMemory().isMemorySetEmpty(AiCardMemory.MemorySet.HELD_MANA_SOURCES)) { + // only hold mana sources once + SpellAbility futureSpell = aic.predictSpellToCastInMain2(ApiType.Pump); + if (futureSpell != null && futureSpell.getHostCard() != null) { + aic.reserveManaSourcesForMain2(futureSpell); + } + } + // will the creature attack (only relevant for sorcery speed)? if (phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.isPlayerTurn(ai) @@ -448,7 +462,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { return true; } - // buff attacker/blocker using using triggered pump + // buff attacker/blocker using triggered pump if (sa.isTrigger() && phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { if (phase.isPlayerTurn(ai)) { if (CombatUtil.canAttack(c)) {