mirror of
https://github.com/magefree/mage.git
synced 2025-12-23 03:51:58 -08:00
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:
parent
32042687fb
commit
c73cfebcd9
2 changed files with 50 additions and 28 deletions
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue