From 5aaf39f40b2f67184bcc66f1a4e9a6af25a502bf Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 15 Apr 2021 20:20:52 +0200 Subject: [PATCH] LTB triggers for opponents --- forge-game/src/main/java/forge/game/Game.java | 13 +++++++++++-- forge-game/src/main/java/forge/game/card/Card.java | 12 ++++++------ .../java/forge/game/trigger/TriggerHandler.java | 4 ++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 527d7ee523d..cf68f0b4cb7 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -768,13 +768,20 @@ public class Game { } else { p.revealFaceDownCards(); } + + for (Card c : cards) { + // CR 800.4d if card is controlled by opponent, LTB should trigger + if (c.getOwner().equals(p) && c.getController().equals(p)) { + c.getCurrentState().clearTriggers(); + } + } - for(Card c : cards) { + for (Card c : cards) { if (c.getController().equals(p) && (c.isPlane() || c.isPhenomenon())) { planarControllerLost = true; } - if(isMultiplayer) { + if (isMultiplayer) { // unattach all "Enchant Player" c.removeAttachedTo(p); if (c.getOwner().equals(p)) { @@ -784,6 +791,8 @@ public class Game { cc.removeRemembered(c); } c.ceaseToExist(false); + // CR 603.2f owner of trigger source lost game + triggerHandler.clearDelayedTrigger(c); } else { // return stolen permanents if (c.getController().equals(p) && c.isInZone(ZoneType.Battlefield)) { 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 03c17d5808d..2e590f74a3c 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6757,13 +6757,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public void ceaseToExist(boolean skipTrig) { - // CR 800.4d if card is controlled by opponent, LTB should trigger - if (skipTrig || getOwner().equals(getController())) { - getGame().getTriggerHandler().suppressMode(TriggerType.ChangesZone); + // CR 603.6c other players LTB triggers should work + if (skipTrig) { + getZone().remove(this); + setZone(getOwner().getZone(ZoneType.None)); } - game.getAction().moveTo(ZoneType.None, this, null); - if (skipTrig || getOwner().equals(getController())) { - getGame().getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + else { + game.getAction().moveTo(ZoneType.None, this, null); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 7ddf5b28cff..d990767b3ab 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -633,8 +633,8 @@ public class TriggerHandler { public void onPlayerLost(Player p) { List lost = new ArrayList<>(); for (Trigger t : delayedTriggers) { - // CR 603.2f owner of trigger source lost game || 800.4d trigger controller lost game - if (game.getCardState(t.getHostCard(), null) == null || t.getHostCard().getOwner().equals(p)) { + // CR 800.4d trigger controller lost game + if (t.getHostCard().getOwner().equals(p)) { lost.add(t); } }