From 9e58ec0f80152a744ab68a76927f00296a29a4e8 Mon Sep 17 00:00:00 2001 From: Seravy Date: Sat, 17 Feb 2018 14:04:31 +0100 Subject: [PATCH] React to removal of Spike Weaver by using the effect if it's already planning to do later Don't leave blockers if planning to use fog effect, except the card that will do so. (might need to tap to use it, or might get killed if attacking) --- .../java/forge/ai/AiAttackController.java | 10 +++++++ .../src/main/java/forge/ai/ability/FogAi.java | 29 +++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) 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)) {