mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
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:
@@ -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
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user