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