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)
This commit is contained in:
Seravy
2018-02-17 14:04:31 +01:00
parent 606f52e493
commit 9e58ec0f80
2 changed files with 33 additions and 6 deletions

View File

@@ -45,6 +45,8 @@ import forge.util.Expressions;
import forge.util.MyRandom; import forge.util.MyRandom;
import forge.util.collect.FCollectionView; import forge.util.collect.FCollectionView;
import static forge.ai.AiCardMemory.isMemorySetEmpty;
//doesHumanAttackAndWin() uses the global variable AllZone.getComputerPlayer() //doesHumanAttackAndWin() uses the global variable AllZone.getComputerPlayer()
/** /**
@@ -268,6 +270,14 @@ public class AiAttackController {
if (ai.getGame().getPhaseHandler().getNextTurn().equals(ai)) { if (ai.getGame().getPhaseHandler().getNextTurn().equals(ai)) {
return attackers; 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<Card> opponentsAttackers = new ArrayList<Card>(oppList); List<Card> opponentsAttackers = new ArrayList<Card>(oppList);
opponentsAttackers = CardLists.filter(opponentsAttackers, new Predicate<Card>() { opponentsAttackers = CardLists.filter(opponentsAttackers, new Predicate<Card>() {
@Override @Override

View File

@@ -3,6 +3,7 @@ package forge.ai.ability;
import forge.ai.*; import forge.ai.*;
import forge.game.Game; import forge.game.Game;
import forge.game.GameObject;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.card.CardPredicates; import forge.game.card.CardPredicates;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
@@ -10,6 +11,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.util.Aggregates; import forge.util.Aggregates;
import java.util.List;
public class FogAi extends SpellAbilityAi { public class FogAi extends SpellAbilityAi {
/* (non-Javadoc) /* (non-Javadoc)
@@ -18,6 +21,25 @@ public class FogAi extends SpellAbilityAi {
@Override @Override
protected boolean canPlayAI(Player ai, SpellAbility sa) { protected boolean canPlayAI(Player ai, SpellAbility sa) {
final Game game = ai.getGame(); 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<GameObject> 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 // Reserve mana to cast this card if it will be likely needed
if (((game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) || 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); ((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; 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) { if ("SeriousDamage".equals(sa.getParam("AILogic")) && game.getCombat() != null) {
int dmg = 0; int dmg = 0;
for (Card atk : game.getCombat().getAttackersOf(ai)) { for (Card atk : game.getCombat().getAttackersOf(ai)) {