From 0cc2ece57321ee1319e86008ed248b56a57adb90 Mon Sep 17 00:00:00 2001 From: Sloth Date: Sun, 26 Oct 2014 19:51:55 +0000 Subject: [PATCH] - The AI will now be aware of opponents Royal Assassin and similar cards. --- .../java/forge/ai/AiAttackController.java | 10 ++++++- .../main/java/forge/ai/ComputerUtilCard.java | 30 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index 26591449e74..e5bbdf1a60e 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -973,10 +973,18 @@ public class AiAttackController { } } } - if (ComputerUtilCard.canBeBlockedProfitably(defendingOpponent, attacker)) { + + if (!attacker.hasKeyword("vigilance") && ComputerUtilCard.canBeKilledByRoyalAssassin(ai, attacker)) { canKillAllDangerous = false; canBeKilled = true; + canBeKilledByOne = true; + isWorthLessThanAllKillers = false; + hasCombatEffect = false; } + else if (ComputerUtilCard.canBeBlockedProfitably(defendingOpponent, attacker)) { + canKillAllDangerous = false; + canBeKilled = true; + } // if the creature cannot block and can kill all opponents they might as // well attack, they do nothing staying back diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 00aeda5eecf..62fc1a31051 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -14,6 +14,7 @@ import forge.deck.Deck; import forge.deck.DeckSection; import forge.game.Game; import forge.game.ability.AbilityUtils; +import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; @@ -592,6 +593,35 @@ public class ComputerUtilCard { aiAtk.declareAttackers(combat); return combat.isAttacking(card); } + + public static boolean canBeKilledByRoyalAssassin(final Player ai, final Card card) { + boolean wasTapped = card.isTapped(); + for (Player opp : ai.getOpponents()) { + for (Card c : opp.getCardsIn(ZoneType.Battlefield)) { + for (SpellAbility sa : c.getSpellAbilities()) { + if (sa.getApi() != ApiType.Destroy) { + continue; + } + if (!ComputerUtilCost.canPayCost(sa, opp)) { + continue; + } + sa.setActivatingPlayer(opp); + if (sa.canTarget(card)) { + continue; + } + // check whether the ability can only target tapped creatures + card.setTapped(true); + if (!sa.canTarget(card)) { + card.setTapped(wasTapped); + continue; + } + card.setTapped(wasTapped); + return true; + } + } + } + return false; + } /** * Create a mock combat and returns the list of likely blockers.