From 724287360c2efd157a829afb4292ed9ecaf1fb75 Mon Sep 17 00:00:00 2001 From: SpeedProg Date: Thu, 30 Apr 2020 12:52:47 +0200 Subject: [PATCH] Multiplayer test and fix for Angel of Serenity leaves battlefied trigger when controlled by other then owner and owner leaves game --- .../test/multiplayer/AngelOfSerenityTest.java | 69 +++++++++++++++++++ Mage/src/main/java/mage/game/GameImpl.java | 3 + .../main/java/mage/players/PlayerImpl.java | 2 +- 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/multiplayer/AngelOfSerenityTest.java diff --git a/Mage.Tests/src/test/java/org/mage/test/multiplayer/AngelOfSerenityTest.java b/Mage.Tests/src/test/java/org/mage/test/multiplayer/AngelOfSerenityTest.java new file mode 100644 index 00000000000..e6ac798929e --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/multiplayer/AngelOfSerenityTest.java @@ -0,0 +1,69 @@ +package org.mage.test.multiplayer; + +import mage.constants.MultiplayerAttackOption; +import mage.constants.PhaseStep; +import mage.constants.RangeOfInfluence; +import mage.constants.Zone; +import mage.game.FreeForAll; +import mage.game.Game; +import mage.game.GameException; +import mage.game.mulligan.MulliganType; +import org.junit.Assert; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestMultiPlayerBase; + +import java.io.FileNotFoundException; + +public class AngelOfSerenityTest extends CardTestMultiPlayerBase { + @Override + protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException { + // Start Life = 2 + Game game = new FreeForAll(MultiplayerAttackOption.MULTIPLE, RangeOfInfluence.ALL, MulliganType.GAME_DEFAULT.getMulligan(0), 2); + // Player order: A -> D -> C -> B + playerA = createPlayer(game, playerA, "PlayerA"); + playerB = createPlayer(game, playerB, "PlayerB"); + playerC = createPlayer(game, playerC, "PlayerC"); + playerD = createPlayer(game, playerD, "PlayerD"); + return game; + } + + /** + * In a multiplayer game when Angel of Serenity leaves the Battlefield because the OWNER leaves the game 800.4a, + * it should return the exiled creatures if Angel of Serenity is controlled by a player that does not leave, + * since then 800.4d does not apply. + * 20200417 - 800.4a/800.4d + */ + @Test + public void TestAngelOfSerenityTakeoverExileReturn() { + + addCard(Zone.BATTLEFIELD, playerA, "Island", 7); // add mana to cast card to take over Angel + addCard(Zone.HAND, playerA, "Agent of Treachery"); + + + addCard(Zone.BATTLEFIELD, playerB, "Plains", 3); + addCard(Zone.BATTLEFIELD, playerB, "Dromoka Dunecaster", 3); + + addCard(Zone.BATTLEFIELD, playerC, "Plains", 7); + addCard(Zone.HAND, playerC, "Angel of Serenity"); // {4}{W}{W}{W} + + + // player C turn is 3 + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerC, "Angel of Serenity"); + addTarget(playerC, "Dromoka Dunecaster^Dromoka Dunecaster^Dromoka Dunecaster"); + + // player A 2nd turn is 5 + castSpell(5, PhaseStep.PRECOMBAT_MAIN, playerA, "Agent of Treachery"); + addTarget(playerA, "Angel of Serenity"); + + concede(5, PhaseStep.POSTCOMBAT_MAIN, playerC); + + setStopAt(6, PhaseStep.UPKEEP); + execute(); + assertAllCommandsUsed(); + + Assert.assertFalse("Player of Angel of Serenity did not leave the game", playerC.isInGame()); + assertPermanentCount(playerA, 8); + assertPermanentCount(playerB, 3); + assertHandCount(playerB, 4); + } +} diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index e367d7f7630..b5470ba96ff 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -2581,6 +2581,9 @@ public abstract class GameImpl implements Game, Serializable { } } } + for(Card card : toOutside) { + rememberLKI(card.getId(), Zone.BATTLEFIELD, card); + } // needed to send event that permanent leaves the battlefield to allow non stack effects to execute player.moveCards(toOutside, Zone.OUTSIDE, null, this); // triggered abilities that don't use the stack have to be executed diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 75fc352ec58..1bc9a3b339f 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -3987,7 +3987,7 @@ public abstract class PlayerImpl implements Player, Serializable { for (Card card : cards) { if (card instanceof Permanent) { game.getBattlefield().removePermanent(card.getId()); - ZoneChangeEvent event = new ZoneChangeEvent(card.getId(), + ZoneChangeEvent event = new ZoneChangeEvent((Permanent)card, (source == null ? null : source.getSourceId()), byOwner ? card.getOwnerId() : getId(), Zone.BATTLEFIELD, Zone.OUTSIDE, appliedEffects); game.fireEvent(event);