From 4ed06fae87a077d35038d11075d4e4e71f4596d7 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sat, 27 Sep 2025 08:08:53 +0800 Subject: [PATCH] add breadcrumb to GameAction moveTo --- .../src/main/java/forge/game/GameAction.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index b759be95564..dd35bf5ad53 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -57,6 +57,8 @@ import forge.item.PaperCard; import forge.util.*; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; +import io.sentry.Breadcrumb; +import io.sentry.Sentry; import org.apache.commons.lang3.tuple.ImmutablePair; import org.jgrapht.alg.cycle.SzwarcfiterLauerSimpleCycles; import org.jgrapht.graph.DefaultDirectedGraph; @@ -749,26 +751,29 @@ public class GameAction { public final Card moveTo(final ZoneType name, final Card c, final int libPosition, SpellAbility cause, Map params) { // Call specific functions to set PlayerZone, then move onto moveTo - switch(name) { - case Hand: return moveToHand(c, cause, params); - case Library: return moveToLibrary(c, libPosition, cause, params); - case Battlefield: return moveToPlay(c, c.getController(), cause, params); - case Graveyard: return moveToGraveyard(c, cause, params); - case Exile: - if (!c.canExiledBy(cause, true)) { - return null; - } - return exile(c, cause, params); - case Stack: return moveToStack(c, cause, params); - case PlanarDeck: - case SchemeDeck: - case AttractionDeck: - case ContraptionDeck: - return moveToVariantDeck(c, name, libPosition, cause, params); - case Junkyard: - return moveToJunkyard(c, cause, params); - default: // sideboard will also get there - return moveTo(c.getOwner().getZone(name), c, cause); + try { + return switch (name) { + case Hand -> moveToHand(c, cause, params); + case Library -> moveToLibrary(c, libPosition, cause, params); + case Battlefield -> moveToPlay(c, c.getController(), cause, params); + case Graveyard -> moveToGraveyard(c, cause, params); + case Exile -> !c.canExiledBy(cause, true) ? null : exile(c, cause, params); + case Stack -> moveToStack(c, cause, params); + case PlanarDeck, SchemeDeck, AttractionDeck, ContraptionDeck -> moveToVariantDeck(c, name, libPosition, cause, params); + case Junkyard -> moveToJunkyard(c, cause, params); + default -> moveTo(c.getOwner().getZone(name), c, cause); // sideboard will also get there + }; + } catch (Exception e) { + String msg = "GameAction:moveTo: Exception occured"; + + Breadcrumb bread = new Breadcrumb(msg); + bread.setData("Card", c.getName()); + bread.setData("SA", cause.toString()); + bread.setData("ZoneType", name.name()); + bread.setData("Player", c.getOwner()); + Sentry.addBreadcrumb(bread); + + throw new RuntimeException("Error in GameAction moveTo " + c.getName() + " to Player Zone " + name.name(), e); } }