From bbfad0a7d41620c2351c0aa7de2696450dcfde79 Mon Sep 17 00:00:00 2001 From: MostCromulent <201167372+MostCromulent@users.noreply.github.com> Date: Tue, 31 Mar 2026 19:29:43 +1030 Subject: [PATCH 1/2] Remove Chaos mode option from Realm of Legends new game screen Chaos mode generates random 60-card preconstructed decks, which is incompatible with Realm of Legends' 98-card minimum deck size requirement. Add an allowChaos config flag (default true) so individual adventures can opt out. Set it to false for Realm of Legends. Co-Authored-By: Claude Opus 4.6 (1M context) --- forge-gui-mobile/src/forge/adventure/data/ConfigData.java | 1 + .../src/forge/adventure/scene/NewGameScene.java | 8 +++++--- forge-gui/res/adventure/Realm of Legends/config.json | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/data/ConfigData.java b/forge-gui-mobile/src/forge/adventure/data/ConfigData.java index 7ef3ecb16ca..c9abd79db76 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ConfigData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ConfigData.java @@ -32,6 +32,7 @@ public class ConfigData { public String[] allowedJumpstart; public String defaultBasicLandSet = "JMP"; public boolean enableGeneticAI = true; + public boolean allowChaos = true; public boolean usePriceListPrices = true; } diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index 872692bcab7..0d55a3ebb54 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -135,9 +135,11 @@ private NewGameScene() { AdventureModes.CommanderPrecon.setModes(Config.instance().filterCommanderPreconDecks(0)); } - modes.add(AdventureModes.Chaos); - AdventureModes.Chaos.setSelectionName(deckLabel); - AdventureModes.Chaos.setModes(new Array<>(new String[]{Forge.getLocalizer().getMessage("lblRandomDeck")})); + if (Config.instance().getConfigData().allowChaos) { + modes.add(AdventureModes.Chaos); + AdventureModes.Chaos.setSelectionName(deckLabel); + AdventureModes.Chaos.setModes(new Array<>(new String[]{Forge.getLocalizer().getMessage("lblRandomDeck")})); + } for (DeckProxy deckProxy : DeckProxy.getAllCustomStarterDecks()) custom.add(deckProxy.getName()); if (!custom.isEmpty()) { diff --git a/forge-gui/res/adventure/Realm of Legends/config.json b/forge-gui/res/adventure/Realm of Legends/config.json index f37814739ea..be2dd79005a 100644 --- a/forge-gui/res/adventure/Realm of Legends/config.json +++ b/forge-gui/res/adventure/Realm of Legends/config.json @@ -158,6 +158,7 @@ "CN2" ], "usePriceListPrices": false, + "allowChaos": false, "difficulties": [ { "name": "Easy", From 4bbed2827c10352ba794e2361271eb6fb1723c23 Mon Sep 17 00:00:00 2001 From: MostCromulent <201167372+MostCromulent@users.noreply.github.com> Date: Wed, 1 Apr 2026 07:18:18 +1030 Subject: [PATCH 2/2] Generate valid Commander decks for Chaos mode instead of disabling it Replace allowChaos toggle with chaosDeckFormat config field. When set to "Commander", player and enemy decks use DeckgenUtil.generateCommanderDeck() to produce valid 100-card singleton decks, fixing ROL's 98-card minimum incompatibility. Adventures without the field keep default precon behavior. Chaos is also treated as commander-like for the deck editor when configured. Co-Authored-By: Claude Opus 4.6 (1M context) --- forge-gui-mobile/src/forge/adventure/data/ConfigData.java | 2 +- .../src/forge/adventure/scene/NewGameScene.java | 8 +++----- .../src/forge/adventure/util/AdventureModes.java | 3 ++- forge-gui-mobile/src/forge/adventure/util/CardUtil.java | 4 ++++ forge-gui-mobile/src/forge/adventure/util/Config.java | 4 ++++ forge-gui/res/adventure/Realm of Legends/config.json | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/data/ConfigData.java b/forge-gui-mobile/src/forge/adventure/data/ConfigData.java index c9abd79db76..adec0a1f0b5 100644 --- a/forge-gui-mobile/src/forge/adventure/data/ConfigData.java +++ b/forge-gui-mobile/src/forge/adventure/data/ConfigData.java @@ -32,7 +32,7 @@ public class ConfigData { public String[] allowedJumpstart; public String defaultBasicLandSet = "JMP"; public boolean enableGeneticAI = true; - public boolean allowChaos = true; + public String chaosDeckFormat; public boolean usePriceListPrices = true; } diff --git a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java index 0d55a3ebb54..872692bcab7 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/NewGameScene.java @@ -135,11 +135,9 @@ private NewGameScene() { AdventureModes.CommanderPrecon.setModes(Config.instance().filterCommanderPreconDecks(0)); } - if (Config.instance().getConfigData().allowChaos) { - modes.add(AdventureModes.Chaos); - AdventureModes.Chaos.setSelectionName(deckLabel); - AdventureModes.Chaos.setModes(new Array<>(new String[]{Forge.getLocalizer().getMessage("lblRandomDeck")})); - } + modes.add(AdventureModes.Chaos); + AdventureModes.Chaos.setSelectionName(deckLabel); + AdventureModes.Chaos.setModes(new Array<>(new String[]{Forge.getLocalizer().getMessage("lblRandomDeck")})); for (DeckProxy deckProxy : DeckProxy.getAllCustomStarterDecks()) custom.add(deckProxy.getName()); if (!custom.isEmpty()) { diff --git a/forge-gui-mobile/src/forge/adventure/util/AdventureModes.java b/forge-gui-mobile/src/forge/adventure/util/AdventureModes.java index 6c6dbefb381..e4c31ed9d5e 100644 --- a/forge-gui-mobile/src/forge/adventure/util/AdventureModes.java +++ b/forge-gui-mobile/src/forge/adventure/util/AdventureModes.java @@ -42,7 +42,8 @@ public Array getModes() { } public boolean isCommanderLike() { - return this == Commander || this == CommanderPrecon; + if (this == Commander || this == CommanderPrecon) return true; + return this == Chaos && "Commander".equalsIgnoreCase(Config.instance().getConfigData().chaosDeckFormat); } public boolean usesFolderDeckPicker() { diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java index a4ddb45d20b..dbeb9d83ad3 100644 --- a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java +++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java @@ -17,6 +17,7 @@ import forge.deck.DeckgenUtil; import forge.deck.io.DeckSerializer; import forge.game.GameFormat; +import forge.game.GameType; import forge.item.BoosterPack; import forge.item.PaperCard; import forge.item.PaperCardPredicates; @@ -750,6 +751,9 @@ public static Deck getDeck(String path, boolean forAI, boolean isFantasyMode, St } if (forAI && (isFantasyMode || useGeneticAI)) { + if (isFantasyMode && "Commander".equalsIgnoreCase(Config.instance().getConfigData().chaosDeckFormat)) { + return DeckgenUtil.generateCommanderDeck(true, GameType.Commander); + } return DeckgenUtil.getRandomOrPreconOrThemeDeck(colors, forAI, isTheme, useGeneticAI); } diff --git a/forge-gui-mobile/src/forge/adventure/util/Config.java b/forge-gui-mobile/src/forge/adventure/util/Config.java index b45d55500a6..01464a40c8a 100644 --- a/forge-gui-mobile/src/forge/adventure/util/Config.java +++ b/forge-gui-mobile/src/forge/adventure/util/Config.java @@ -15,6 +15,7 @@ import forge.deck.Deck; import forge.deck.DeckProxy; import forge.deck.DeckgenUtil; +import forge.game.GameType; import forge.gui.GuiBase; import forge.item.PaperCard; import forge.localinstance.properties.ForgeConstants; @@ -257,6 +258,9 @@ public Deck starterDeck(ColorSet color, DifficultyData difficultyData, Adventure } } case Chaos: + if ("Commander".equalsIgnoreCase(configData.chaosDeckFormat)) { + return DeckgenUtil.generateCommanderDeck(false, GameType.Commander); + } return DeckgenUtil.getRandomOrPreconOrThemeDeck("", false, false, false, configData.allowedEditions); case Custom: return DeckProxy.getAllCustomStarterDecks().get(index).getDeck(); diff --git a/forge-gui/res/adventure/Realm of Legends/config.json b/forge-gui/res/adventure/Realm of Legends/config.json index be2dd79005a..73640ef28b6 100644 --- a/forge-gui/res/adventure/Realm of Legends/config.json +++ b/forge-gui/res/adventure/Realm of Legends/config.json @@ -158,7 +158,7 @@ "CN2" ], "usePriceListPrices": false, - "allowChaos": false, + "chaosDeckFormat": "Commander", "difficulties": [ { "name": "Easy",