diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 8d9c231e8d7..f346e48bccd 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -45,6 +45,8 @@ import forge.util.Expressions; import forge.util.MyRandom; import forge.util.collect.FCollectionView; +import static forge.ai.AiCardMemory.isMemorySetEmpty; + //doesHumanAttackAndWin() uses the global variable AllZone.getComputerPlayer() /** @@ -268,6 +270,14 @@ public class AiAttackController { if (ai.getGame().getPhaseHandler().getNextTurn().equals(ai)) { return attackers; } + // no need to block is already holding mana to cast fog next turn + if (!isMemorySetEmpty(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT)) { + // Don't send the card that'll do the fog effect to attack, it's unsafe! + if (attackers.contains(AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT)) { + attackers.remove(AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + } + return attackers; + } List opponentsAttackers = new ArrayList(oppList); opponentsAttackers = CardLists.filter(opponentsAttackers, new Predicate() { @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/FogAi.java b/forge-ai/src/main/java/forge/ai/ability/FogAi.java index 1d73d9dfa08..8c5cfeff097 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FogAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FogAi.java @@ -3,6 +3,7 @@ package forge.ai.ability; import forge.ai.*; import forge.game.Game; +import forge.game.GameObject; import forge.game.card.Card; import forge.game.card.CardPredicates; import forge.game.phase.PhaseType; @@ -10,6 +11,8 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Aggregates; +import java.util.List; + public class FogAi extends SpellAbilityAi { /* (non-Javadoc) @@ -18,6 +21,25 @@ public class FogAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player ai, SpellAbility sa) { final Game game = ai.getGame(); + final Card hostCard = sa.getHostCard(); + + // Don't cast it, if the effect is already in place + if (game.getPhaseHandler().isPreventCombatDamageThisTurn()) { + return false; + } + + // if card would be destroyed, react and use immediately if it's not own turn + if ((AiCardMemory.isRememberedCard(ai, hostCard, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT)) + && (!game.getStack().isEmpty()) && + (!game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) + ) { + final List objects = ComputerUtil + .predictThreatenedObjects(ai, sa); + if (objects.contains(hostCard)) { + AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK); + return true; + } + } // Reserve mana to cast this card if it will be likely needed if (((game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) || @@ -27,7 +49,7 @@ public class FogAi extends SpellAbilityAi { ) { ((PlayerControllerAi) ai.getController()).getAi().reserveManaSources(sa, PhaseType.COMBAT_DECLARE_BLOCKERS, true); - AiCardMemory.rememberCard(ai, sa.getHostCard(), AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + AiCardMemory.rememberCard(ai, hostCard, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); } @@ -44,11 +66,6 @@ public class FogAi extends SpellAbilityAi { return false; } - // Don't cast it, if the effect is already in place - if (game.getPhaseHandler().isPreventCombatDamageThisTurn()) { - return false; - } - if ("SeriousDamage".equals(sa.getParam("AILogic")) && game.getCombat() != null) { int dmg = 0; for (Card atk : game.getCombat().getAttackersOf(ai)) {