diff --git a/Mage.Sets/src/mage/cards/b/BygoneBishop.java b/Mage.Sets/src/mage/cards/b/BygoneBishop.java index 3311232959f..d4c2a08083d 100644 --- a/Mage.Sets/src/mage/cards/b/BygoneBishop.java +++ b/Mage.Sets/src/mage/cards/b/BygoneBishop.java @@ -54,7 +54,7 @@ public class BygoneBishop extends CardImpl { } public BygoneBishop(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); this.subtype.add("Spirit"); this.subtype.add("Cleric"); this.power = new MageInt(2); @@ -64,6 +64,7 @@ public class BygoneBishop extends CardImpl { this.addAbility(FlyingAbility.getInstance()); // Whenever you cast a creature spell with converted mana cost 3 or less, investigate. + // (Put a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card.") this.addAbility(new SpellCastControllerTriggeredAbility(new InvestigateEffect(), filterSpell, false)); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InvestigateTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InvestigateTest.java new file mode 100644 index 00000000000..cc9166636cb --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InvestigateTest.java @@ -0,0 +1,69 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.cards.abilities.keywords; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class InvestigateTest extends CardTestPlayerBase { + + @Test + public void testBriarbridgePatrol() { + // Whenever Briarbridge Patrol deals damage to one or more creatures, investigate (Create a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card."). + // At the beginning of each end step, if you sacrificed three or more Clues this turn, you may put a creature card from your hand onto the battlefield. + addCard(Zone.BATTLEFIELD, playerA, "Briarbridge Patrol", 1); // 3/3 + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + + addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1); // 2/4 + + attack(1, playerA, "Briarbridge Patrol"); + block(1, playerB, "Pillarfield Ox", "Briarbridge Patrol"); + + attack(3, playerA, "Briarbridge Patrol"); + block(3, playerB, "Pillarfield Ox", "Briarbridge Patrol"); + + activateAbility(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "{2},"); + + setStopAt(3, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + assertPermanentCount(playerA, "Briarbridge Patrol", 1); + assertHandCount(playerA, 2); // 1 from sacrificed Clue and 1 from draw of turn 3 + assertPermanentCount(playerA, "Clue", 1); + + } +} diff --git a/Mage.Tests/src/test/java/org/mage/test/rollback/StateValuesTest.java b/Mage.Tests/src/test/java/org/mage/test/rollback/StateValuesTest.java index bffa982f92c..9652c1990ce 100644 --- a/Mage.Tests/src/test/java/org/mage/test/rollback/StateValuesTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/rollback/StateValuesTest.java @@ -1,94 +1,94 @@ -/* - * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of BetaSteward_at_googlemail.com. - */ -package org.mage.test.rollback; - -import mage.constants.PhaseStep; -import mage.constants.Zone; -import org.junit.Test; -import org.mage.test.serverside.base.CardTestPlayerBase; - -/** - * - * @author LevelX2 - */ -public class StateValuesTest extends CardTestPlayerBase { - - @Test - public void testDragonWhelpActivatedFourTimes() { - addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); - // Flying - // {R}: Dragon Whelp gets +1/+0 until end of turn. If this ability has been activated four or more times this turn, sacrifice Dragon Whelp at the beginning of the next end step. - addCard(Zone.BATTLEFIELD, playerA, "Dragon Whelp", 1); // 2/3 - - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); - attack(1, playerA, "Dragon Whelp"); - - activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); - activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); - - attack(3, playerA, "Dragon Whelp"); - - rollbackTurns(3, PhaseStep.BEGIN_COMBAT, playerA, 0); - - setStopAt(4, PhaseStep.UPKEEP); - execute(); - - assertLife(playerA, 20); - assertLife(playerB, 12); - - assertPermanentCount(playerA, "Dragon Whelp", 1); - assertGraveyardCount(playerA, "Dragon Whelp", 0); - - } - - @Test - public void testBriarbridgePatrol() { - // Whenever Briarbridge Patrol deals damage to one or more creatures, investigate (Create a colorless Clue artifact token onto the battlefield with "2, Sacrifice this artifact: Draw a card."). - // At the beginning of each end step, if you sacrificed three or more Clues this turn, you may put a creature card from your hand onto the battlefield. - addCard(Zone.BATTLEFIELD, playerA, "Briarbridge Patrol", 1); // 3/3 - - addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1); // 2/2 - - attack(1, playerA, "Briarbridge Patrol"); - block(1, playerB, "Pillarfield Ox", "Briarbridge Patrol"); - - attack(3, playerA, "Briarbridge Patrol"); - block(3, playerB, "Pillarfield Ox", "Briarbridge Patrol"); - rollbackTurns(3, PhaseStep.POSTCOMBAT_MAIN, playerA, 0); - - setStopAt(3, PhaseStep.END_TURN); - execute(); - - assertLife(playerA, 20); - assertLife(playerB, 20); - - assertPermanentCount(playerA, "Clue", 2); - - } -} +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.test.rollback; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class StateValuesTest extends CardTestPlayerBase { + + @Test + public void testDragonWhelpActivatedFourTimes() { + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4); + // Flying + // {R}: Dragon Whelp gets +1/+0 until end of turn. If this ability has been activated four or more times this turn, sacrifice Dragon Whelp at the beginning of the next end step. + addCard(Zone.BATTLEFIELD, playerA, "Dragon Whelp", 1); // 2/3 + + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); + activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); + attack(1, playerA, "Dragon Whelp"); + + activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); + activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: "); + + attack(3, playerA, "Dragon Whelp"); + + rollbackTurns(3, PhaseStep.BEGIN_COMBAT, playerA, 0); + + setStopAt(4, PhaseStep.UPKEEP); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 12); + + assertPermanentCount(playerA, "Dragon Whelp", 1); + assertGraveyardCount(playerA, "Dragon Whelp", 0); + + } + + @Test + public void testBriarbridgePatrol() { + // Whenever Briarbridge Patrol deals damage to one or more creatures, investigate (Create a colorless Clue artifact token onto the battlefield with "{2}, Sacrifice this artifact: Draw a card."). + // At the beginning of each end step, if you sacrificed three or more Clues this turn, you may put a creature card from your hand onto the battlefield. + addCard(Zone.BATTLEFIELD, playerA, "Briarbridge Patrol", 1); // 3/3 + + addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1); // 2/4 + + attack(1, playerA, "Briarbridge Patrol"); + block(1, playerB, "Pillarfield Ox", "Briarbridge Patrol"); + + attack(3, playerA, "Briarbridge Patrol"); + block(3, playerB, "Pillarfield Ox", "Briarbridge Patrol"); + rollbackTurns(3, PhaseStep.POSTCOMBAT_MAIN, playerA, 0); + + setStopAt(3, PhaseStep.END_TURN); + execute(); + + assertLife(playerA, 20); + assertLife(playerB, 20); + + assertPermanentCount(playerA, "Clue", 2); + + } +} diff --git a/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java index 3b410899d99..4e61eae9ba2 100644 --- a/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java @@ -29,10 +29,11 @@ public class DealsDamageToOneOrMoreCreaturesTriggeredAbility extends DealsDamage if (super.checkTrigger(event, game)) { // check that combat damage does only once trigger also if multiple creatures were damaged because they block or were blocked by source if (game.getTurn().getStepType().equals(PhaseStep.COMBAT_DAMAGE) || game.getTurn().getStepType().equals(PhaseStep.FIRST_COMBAT_DAMAGE)) { - Integer stepHash = (Integer) game.getState().getValue("damageStep" + getOriginalId()); - if (stepHash == null || game.getStep().hashCode() != stepHash) { + String stepHash = (String) game.getState().getValue("damageStep" + getOriginalId()); + String newStepHash = game.getStep().getType().toString() + game.getTurnNum(); + if (stepHash == null || !newStepHash.equals(stepHash)) { // this ability did not trigger during this damage step - game.getState().setValue("damageStep" + getOriginalId(), game.getStep().hashCode()); + game.getState().setValue("damageStep" + getOriginalId(), game.getStep().getType().toString() + game.getTurnNum()); return true; } } else {