From e0c1492f884a76c4288e6003c602e63fdab57ab3 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 30 Oct 2015 22:34:42 +0100 Subject: [PATCH] * Fixed a problem that the AI was locked if a attack fee has to be paid but the AI was not able to pay the costs. --- .../src/mage/player/ai/ComputerPlayer6.java | 3 ++- .../src/mage/sets/conspiracy/GrenzoDungeonWarden.java | 4 ++-- .../src/mage/sets/divinevsdemonic/FaithsFetters.java | 2 +- .../test/AI/basic/PreventRepeatedActionsTest.java | 11 ++++++++--- Mage/src/mage/players/Library.java | 11 +++++++++++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index 022e7f9ee30..128c502cc63 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -1193,7 +1193,8 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { safeToAttack = false; } if (safeToAttack) { - attackingPlayer.declareAttacker(attacker.getId(), defenderId, game, false); + // undo has to be possible e.g. if not able to pay a attack fee (e.g. Ghostly Prison) + attackingPlayer.declareAttacker(attacker.getId(), defenderId, game, true); } } } diff --git a/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java b/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java index 855d62758c7..ddc3e84d5a7 100644 --- a/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java +++ b/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java @@ -100,9 +100,9 @@ class GrenzoDungeonWardenEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { if (controller.getLibrary().size() > 0) { - Card card = controller.getLibrary().removeFromBottom(game); + Card card = controller.getLibrary().getFromBottom(game); if (card != null) { - controller.moveCards(card, Zone.LIBRARY, Zone.GRAVEYARD, source, game); + controller.moveCards(card, Zone.GRAVEYARD, source, game); if (card.getCardType().contains(CardType.CREATURE)) { Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); if (sourcePermanent != null && card.getPower().getValue() <= sourcePermanent.getPower().getValue()) { diff --git a/Mage.Sets/src/mage/sets/divinevsdemonic/FaithsFetters.java b/Mage.Sets/src/mage/sets/divinevsdemonic/FaithsFetters.java index e586bbed0c7..d386108be97 100644 --- a/Mage.Sets/src/mage/sets/divinevsdemonic/FaithsFetters.java +++ b/Mage.Sets/src/mage/sets/divinevsdemonic/FaithsFetters.java @@ -71,7 +71,7 @@ public class FaithsFetters extends CardImpl { // When Faith's Fetters enters the battlefield, you gain 4 life. this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(4))); - // Enchanted permanent can't attack or block, and its activated abilities can't be activated unless they're mana abilities. + // Enchanted permanent's activated abilities can't be activated unless they're mana abilities. If enchanted permanent is a creature, it can't attack or block. Effect effect = new CantAttackBlockAttachedEffect(AttachmentType.AURA); effect.setText("Enchanted permanent can't attack or block,"); ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java index 1a6259d8e10..45e99f0806b 100644 --- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/PreventRepeatedActionsTest.java @@ -73,15 +73,20 @@ public class PreventRepeatedActionsTest extends CardTestPlayerBaseAI { */ @Test public void testBasaltMonolith() { + addCard(Zone.HAND, playerA, "Phyrexian Vault", 1); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); // Basalt Monolith doesn't untap during your untap step. // {T}: Add {3} to your mana pool. // {3}: Untap Basalt Monolith. - addCard(Zone.BATTLEFIELD, playerA, "Basalt Monolith", 1); + addCard(Zone.BATTLEFIELD, playerA, "Basalt Monolith", 1, true); - setStopAt(1, PhaseStep.END_TURN); + setStopAt(5, PhaseStep.END_TURN); execute(); - assertTapped("Basalt Monolith", false); + // {2}, {T}, Sacrifice a creature: Draw a card. + assertPermanentCount(playerA, "Phyrexian Vault", 1); + assertTapped("Basalt Monolith", true); + assertTappedCount("Plains", false, 3); } /** diff --git a/Mage/src/mage/players/Library.java b/Mage/src/mage/players/Library.java index ec7cfc1942a..1b72dd544a3 100644 --- a/Mage/src/mage/players/Library.java +++ b/Mage/src/mage/players/Library.java @@ -128,6 +128,17 @@ public class Library implements Serializable { return game.getCard(library.peekFirst()); } + /** + * Returns the bottommost card of the Library without removing it + * + * @param game + * @return Card + * @see Card + */ + public Card getFromBottom(Game game) { + return game.getCard(library.pollLast()); + } + public void putOnTop(Card card, Game game) { if (card.getOwnerId().equals(playerId)) { card.setZone(Zone.LIBRARY, game);