Fix EntersBattlefieldOneOrMoreTriggeredAbility (#12592)

* Apply fix for ZONE_CHANGE_GROUP events making tokens controlled by different players

* Add test

* Remove unused import

* Fix implementation

* Rewrite to use ZONE_CHANGE_BATCH

* Fix OPPONENT case

* Add default case

* refactor to avoid using stream as local variable and use ZoneChangeEvents in filters

* Fix typo
This commit is contained in:
jimga150 2024-07-30 00:39:01 -04:00 committed by GitHub
parent 32042687fb
commit c73cfebcd9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 50 additions and 28 deletions

View file

@ -0,0 +1,30 @@
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 jimga150
*/
public class EntersBattlefieldOneOrMoreTriggerTest extends CardTestPlayerBase {
@Test
public void testZoneChangeMulti() {
addCard(Zone.BATTLEFIELD, playerA, "Marneus Calgar", 1);
addCard(Zone.BATTLEFIELD, playerA, "Gor Muldrak, Amphinologist", 1);
addCard(Zone.BATTLEFIELD, playerB, "Marneus Calgar", 1);
addCard(Zone.BATTLEFIELD, playerB, "Memnite", 1);
setStrictChooseMode(true);
setStopAt(2, PhaseStep.UPKEEP);
execute();
assertPermanentCount(playerA, "Salamander Warrior Token", 1);
assertPermanentCount(playerB, "Salamander Warrior Token", 1);
assertHandCount(playerA, 1);
assertHandCount(playerB, 1);
}
}

View file

@ -1,6 +1,5 @@
package mage.abilities.common; package mage.abilities.common;
import mage.MageItem;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.constants.TargetController; import mage.constants.TargetController;
@ -8,12 +7,10 @@ import mage.constants.Zone;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.events.ZoneChangeGroupEvent; import mage.game.events.ZoneChangeBatchEvent;
import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import java.util.Objects; import java.util.UUID;
import java.util.stream.Stream;
/** /**
* "Whenever one or more {filter} enter the battlefield under {target controller} control, * "Whenever one or more {filter} enter the battlefield under {target controller} control,
@ -40,37 +37,32 @@ public class EntersBattlefieldOneOrMoreTriggeredAbility extends TriggeredAbility
@Override @Override
public boolean checkEventType(GameEvent event, Game game) { public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE_GROUP; return event.getType() == GameEvent.EventType.ZONE_CHANGE_BATCH;
} }
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
ZoneChangeGroupEvent zEvent = (ZoneChangeGroupEvent) event;
Player controller = game.getPlayer(this.controllerId); Player controller = game.getPlayer(this.controllerId);
if (zEvent.getToZone() != Zone.BATTLEFIELD || controller == null) { if (controller == null) {
return false; return false;
} }
switch (this.targetController) { ZoneChangeBatchEvent zEvent = (ZoneChangeBatchEvent) event;
case YOU: return zEvent.getEvents().stream()
if (!controller.getId().equals(zEvent.getPlayerId())) { .filter(z -> z.getToZone() == Zone.BATTLEFIELD)
return false; .filter(z -> filterPermanent.match(z.getTarget(), this.controllerId, this, game))
} .anyMatch(z -> {
break; UUID enteringPermanentControllerID = z.getTarget().getControllerId();
case OPPONENT: switch (this.targetController) {
if (!controller.hasOpponent(zEvent.getPlayerId(), game)) { case YOU:
return false; return enteringPermanentControllerID.equals(this.controllerId);
} case OPPONENT:
break; return controller.hasOpponent(enteringPermanentControllerID, game);
} default:
throw new IllegalArgumentException("Unsupported target: " + this.targetController);
return Stream.concat( }
zEvent.getTokens().stream(), });
zEvent.getCards().stream()
.map(MageItem::getId)
.map(game::getPermanent)
.filter(Objects::nonNull)
).anyMatch(permanent -> filterPermanent.match(permanent, this.controllerId, this, game));
} }
@Override @Override