diff --git a/src/main/java/forge/error/BugReporter.java b/src/main/java/forge/error/BugReporter.java index f9fbd39adbf..589a7752a8b 100644 --- a/src/main/java/forge/error/BugReporter.java +++ b/src/main/java/forge/error/BugReporter.java @@ -63,6 +63,8 @@ import forge.model.BuildInfo; * @version V1.0 02.08.2009 */ public class BugReporter { + private static final int _STACK_OVERFLOW_MAX_MESSAGE_LEN = 16 * 1024; + /** * Shows exception information in a format ready to post to the forum as a crash report. Uses the exception's message * as the reason if message is null. @@ -88,7 +90,17 @@ public class BugReporter { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); - sb.append(sw.toString()); + + String swStr = sw.toString(); + if (ex instanceof StackOverflowError && + _STACK_OVERFLOW_MAX_MESSAGE_LEN <= swStr.length()) { + // most likely a cycle. only take first portion so the message + // doesn't grow too large to post + sb.append(swStr, 0, _STACK_OVERFLOW_MAX_MESSAGE_LEN); + sb.append("\n... (truncated)"); + } else { + sb.append(swStr); + } _buildSpoilerFooter(sb); diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index be7de510a92..47459cc5de2 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -151,8 +151,10 @@ public class GameNew { if (rAICards.size() > 0) { String message = buildFourColumnList("AI deck contains the following cards that it can't play or may be buggy:", rAICards); - if (GameType.Quest == game.getType()) { - // log, but do not visually warn. quest decks are supposedly already vetted by the quest creator + if (GameType.Quest == game.getType() || GameType.Sealed == game.getType() || GameType.Draft == game.getType()) { + // log, but do not visually warn. quest decks are supposedly already vetted by the quest creator, + // sealed and draft decks do not get any AI-unplayable picks but may contain several + // received/picked but unplayable cards in the sideboard. System.err.println(message); } else { JOptionPane.showMessageDialog(null, message, "", JOptionPane.INFORMATION_MESSAGE); diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index eda9cb5b9c9..52ce93b6645 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -145,7 +145,8 @@ public class PlayerControllerHuman extends PlayerController { JOptionPane.showMessageDialog(null, errMsg, "Invalid deck", JOptionPane.ERROR_MESSAGE); } - newMain = GuiChoose.sideboard(sideboard.toFlatList(), main.toFlatList()); + boolean isLimited = (gameType == GameType.Draft || gameType == GameType.Sealed); + newMain = GuiChoose.sideboard(sideboard.toFlatList(), main.toFlatList(), isLimited); } newSb.clear(); diff --git a/src/main/java/forge/gui/GuiChoose.java b/src/main/java/forge/gui/GuiChoose.java index cb9784894da..bdfe19f9dec 100644 --- a/src/main/java/forge/gui/GuiChoose.java +++ b/src/main/java/forge/gui/GuiChoose.java @@ -149,10 +149,10 @@ public class GuiChoose { return order(title, top, remainingObjects, sourceChoices, destChoices, referenceCard, false); } - public static > List sideboard(List sideboard, List deck) { + public static > List sideboard(List sideboard, List deck, boolean isLimitedMode) { Collections.sort(deck); Collections.sort(sideboard); - return order("Sideboard", "Main Deck", sideboard.size(), sideboard, deck, null, true); + return order("Sideboard", "Main Deck", isLimitedMode ? -1 : sideboard.size(), sideboard, deck, null, true); } @@ -161,7 +161,6 @@ public class GuiChoose { // An input box for handling the order of choices. final JFrame frame = new JFrame(); DualListBox dual = new DualListBox(remainingObjects, sourceChoices, destChoices); - dual.setSideboardMode(sideboardingMode); dual.setSecondColumnLabelText(top); frame.setLayout(new BorderLayout()); @@ -170,6 +169,8 @@ public class GuiChoose { frame.setTitle(title); frame.setVisible(false); + dual.setSideboardMode(sideboardingMode); + final JDialog dialog = new JDialog(frame, true); dialog.setTitle(title); dialog.setContentPane(dual);