- Fixed #8839 and added test for it.

This commit is contained in:
Jeff Wadsworth 2022-05-06 10:23:10 -05:00
parent 77b2c932d0
commit b279d4b318
3 changed files with 83 additions and 6 deletions

View file

@ -15,6 +15,7 @@ import mage.game.events.GameEvent;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import java.util.UUID; import java.util.UUID;
import mage.game.stack.StackAbility;
/** /**
* @author TheElk801 * @author TheElk801
@ -58,16 +59,25 @@ class StrictProctorTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public boolean checkEventType(GameEvent event, Game game) { public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ABILITY_TRIGGERED; return event.getType() == GameEvent.EventType.TRIGGERED_ABILITY;
} }
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
GameEvent triggeringEvent = (GameEvent) game.getState().getValue(event.getId().toString()); // retrieve the event that led to the trigger triggering
if (triggeringEvent == null || triggeringEvent.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { // verify that it is a ETB event
StackAbility stackAbilityOfTriggeredAbility = (StackAbility) game.getObject(event.getTargetId());
if (stackAbilityOfTriggeredAbility == null
|| stackAbilityOfTriggeredAbility.getSourceId() == null) {
return false; return false;
} }
getEffects().setTargetPointer(new FixedTarget(triggeringEvent.getTargetId(), game)); GameEvent triggeringEvent = (GameEvent) game.getState().getValue("triggeringEvent" + stackAbilityOfTriggeredAbility.getSourceId());
if (triggeringEvent == null
|| triggeringEvent.getType() != GameEvent.EventType.ENTERS_THE_BATTLEFIELD) {
return false;
}
// set the target to the ability that gets triggered from the enter the battlefield trigger
getEffects().setTargetPointer(new FixedTarget(event.getTargetId(), game));
return true; return true;
} }
@ -78,7 +88,7 @@ class StrictProctorTriggeredAbility extends TriggeredAbilityImpl {
@Override @Override
public String getRule() { public String getRule() {
return "Whenever a permanent entering the battlefield causes a triggered ability to trigger, " + return "Whenever a permanent entering the battlefield causes a triggered ability to trigger, "
"counter that ability unless its controller pays {2}."; + "counter that ability unless its controller pays {2}.";
} }
} }

View file

@ -0,0 +1,64 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.mage.test.cards.triggers;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author jeffwadsworth
*/
public class StrictProctorTest extends CardTestPlayerBase {
@Test
public void testStrictProctorPaid() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
// Whenever a permanent entering the battlefield causes a triggered ability to
// trigger, counter that ability unless its controller pays {2}.
addCard(Zone.BATTLEFIELD, playerA, "Strict Proctor", 1);
// Whenever a land enters the battlefield under your control, you gain 3 life.
addCard(Zone.BATTLEFIELD, playerA, "Primeval Bounty", 1);
// land to play for trigger
addCard(Zone.HAND, playerA, "Swamp", 1);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Swamp"); // play land
setChoice(playerA, "Yes"); // pay the {2} mana cost to prevent the countering of the trigger
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 23); // player gains the 3 life
}
@Test
public void testStrictProctorNotPaid() {
setStrictChooseMode(true);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
// Whenever a permanent entering the battlefield causes a triggered ability to
// trigger, counter that ability unless its controller pays {2}.
addCard(Zone.BATTLEFIELD, playerA, "Strict Proctor", 1);
// Whenever a land enters the battlefield under your control, you gain 3 life.
addCard(Zone.BATTLEFIELD, playerA, "Primeval Bounty", 1);
// land to play for trigger
addCard(Zone.HAND, playerA, "Swamp", 1);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Swamp"); // play land
setChoice(playerA, "No"); // do not pay the {2} mana cost to prevent the countering of the trigger
setStopAt(1, PhaseStep.END_TURN);
execute();
assertAllCommandsUsed();
assertLife(playerA, 20); // player does not gain the 3 life
}
}

View file

@ -93,6 +93,9 @@ public class TriggeredAbilities extends ConcurrentHashMap<String, TriggeredAbili
if (ability.checkTrigger(event, game) && ability.checkTriggeredAlready(game) && ability.checkUsedAlready(game)) { if (ability.checkTrigger(event, game) && ability.checkTriggeredAlready(game) && ability.checkUsedAlready(game)) {
NumberOfTriggersEvent numberOfTriggersEvent = new NumberOfTriggersEvent(ability, event); NumberOfTriggersEvent numberOfTriggersEvent = new NumberOfTriggersEvent(ability, event);
// store the event that led to the triggered event (Strict Proctor)
// numberOfTriggerers event is only checked in replacement effects
game.getState().setValue("triggeringEvent" + ability.getSourceId(), event);
if (!game.replaceEvent(numberOfTriggersEvent)) { if (!game.replaceEvent(numberOfTriggersEvent)) {
for (int i = 0; i < numberOfTriggersEvent.getAmount(); i++) { for (int i = 0; i < numberOfTriggersEvent.getAmount(); i++) {
ability.trigger(game, ability.getControllerId(), event); ability.trigger(game, ability.getControllerId(), event);