mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
- Updated ProtectAi to use new canPlay()
This commit is contained in:
@@ -10,7 +10,6 @@ import forge.ai.AiAttackController;
|
|||||||
import forge.ai.ComputerUtil;
|
import forge.ai.ComputerUtil;
|
||||||
import forge.ai.ComputerUtilCard;
|
import forge.ai.ComputerUtilCard;
|
||||||
import forge.ai.ComputerUtilCombat;
|
import forge.ai.ComputerUtilCombat;
|
||||||
import forge.ai.ComputerUtilCost;
|
|
||||||
import forge.ai.SpellAbilityAi;
|
import forge.ai.SpellAbilityAi;
|
||||||
import forge.card.MagicColor;
|
import forge.card.MagicColor;
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
@@ -22,7 +21,6 @@ import forge.game.card.Card;
|
|||||||
import forge.game.card.CardCollection;
|
import forge.game.card.CardCollection;
|
||||||
import forge.game.card.CardLists;
|
import forge.game.card.CardLists;
|
||||||
import forge.game.combat.Combat;
|
import forge.game.combat.Combat;
|
||||||
import forge.game.cost.Cost;
|
|
||||||
import forge.game.phase.PhaseHandler;
|
import forge.game.phase.PhaseHandler;
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
@@ -163,78 +161,50 @@ public class ProtectAi extends SpellAbilityAi {
|
|||||||
} // getProtectCreatures()
|
} // getProtectCreatures()
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean canPlayAI(Player ai, SpellAbility sa) {
|
protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) {
|
||||||
final Card hostCard = sa.getHostCard();
|
final boolean notAiMain1 = !(ph.getPlayerTurn() == ai && ph.getPhase() == PhaseType.MAIN1);
|
||||||
final Game game = ai.getGame();
|
|
||||||
final PhaseHandler ph = game.getPhaseHandler();
|
|
||||||
// if there is no target and host card isn't in play, don't activate
|
|
||||||
if ((sa.getTargetRestrictions() == null) && !hostCard.isInPlay()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Cost cost = sa.getPayCosts();
|
|
||||||
|
|
||||||
// temporarily disabled until better AI
|
|
||||||
if (!ComputerUtilCost.checkLifeCost(ai, cost, hostCard, 4, null)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ComputerUtilCost.checkDiscardCost(ai, cost, hostCard)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ComputerUtilCost.checkCreatureSacrificeCost(ai, cost, hostCard)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ComputerUtilCost.checkRemoveCounterCost(cost, hostCard)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Phase Restrictions
|
|
||||||
boolean notAiMain1 = !(ph.getPlayerTurn() == ai && ph.getPhase() == PhaseType.MAIN1);
|
|
||||||
if (SpellAbilityAi.isSorcerySpeed(sa)) {
|
if (SpellAbilityAi.isSorcerySpeed(sa)) {
|
||||||
//only non-instants are Floating Shield, Midvast Protector, Sejiri Steppe
|
// sorceries can only give protection in order to create an unblockable attacker
|
||||||
//sorceries can only give protection in order to create an unblockable attacker
|
|
||||||
if (notAiMain1) {
|
if (notAiMain1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
final Game game = ai.getGame();
|
||||||
if (game.getStack().isEmpty()) {
|
if (game.getStack().isEmpty()) {
|
||||||
//try to save attacker or blocker
|
// try to save attacker or blocker
|
||||||
if (ph.getPhase() != PhaseType.COMBAT_DECLARE_BLOCKERS) {
|
if (ph.getPhase() != PhaseType.COMBAT_DECLARE_BLOCKERS) {
|
||||||
if (notAiMain1) {
|
if (notAiMain1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//prevent repeated protects
|
// prevent repeated protects
|
||||||
if (game.getStack().peekAbility().getApi() == ApiType.Protection) {
|
if (game.getStack().peekAbility().getApi() == ApiType.Protection) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean checkApiLogic(final Player ai, final SpellAbility sa) {
|
||||||
if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
|
if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
|
||||||
final List<Card> cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa);
|
final List<Card> cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa);
|
||||||
|
|
||||||
if (cards.size() == 0) {
|
if (cards.size() == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* // when this happens we need to expand AI to consider if its ok
|
* when this happens we need to expand AI to consider if its ok
|
||||||
* for everything? for (Card card : cards) { // TODO if AI doesn't
|
* for everything? for (Card card : cards) { // TODO if AI doesn't
|
||||||
* control Card and Pump is a Curse, than maybe use?
|
* control Card and Pump is a Curse, than maybe use?
|
||||||
*
|
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
return protectTgtAI(ai, sa, false);
|
return protectTgtAI(ai, sa, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
} // protectPlayAI()
|
}
|
||||||
|
|
||||||
private boolean protectTgtAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
|
private boolean protectTgtAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
|
||||||
final Game game = ai.getGame();
|
final Game game = ai.getGame();
|
||||||
|
|||||||
Reference in New Issue
Block a user