diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 311ab017f85..fbec4b0988a 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -573,6 +573,23 @@ public class Game { } public void onPlayerLost(Player p) { + // Rule 800.4 Losing a Multiplayer game + CardCollectionView cards = this.getCardsInGame(); + + for(Card c : cards) { + if (c.getOwner().equals(p)) { + c.ceaseToExist(); + } else { + c.removeTempController(p); + if (c.getController().equals(p)) { + this.getAction().exile(c); + } + } + } + + // Remove leftover items from + this.getStack().removeInstancesControlledBy(p); + ingamePlayers.remove(p); final Map runParams = new TreeMap(); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index c6fd548b30f..de62fb87e0c 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2201,6 +2201,15 @@ public class Card extends GameEntity implements Comparable { } } + public final void removeTempController(final Player player) { + // Remove each key that yields this player + for(Entry kv : tempControllers.entrySet()) { + if (kv.getValue().equals(player)) { + tempControllers.remove(kv.getKey()); + } + } + } + public final void clearTempControllers() { if (tempControllers.isEmpty()) { return; } tempControllers.clear(); @@ -3436,9 +3445,7 @@ public class Card extends GameEntity implements Comparable { // Just remove it's zone, so we don't run through the exile stuff // This allows auras on phased out tokens to just phase out permanently - getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); - getZone().remove(this); - getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + this.ceaseToExist(); } if (!phasedOut) { @@ -6710,4 +6717,10 @@ public class Card extends GameEntity implements Comparable { this.changedCardColors.put(entry.getKey(), entry.getValue()); } } + + public void ceaseToExist() { + getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); + getZone().remove(this); + getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + } } diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index f66c09af07e..5db1927a253 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -719,6 +719,14 @@ public class MagicStack /* extends MyObservable */ implements Iterable