diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index f13b9eeca13..ab835c7f762 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -173,6 +173,11 @@ public final class CardDb implements ICardDatabase { ? ( fromLastSet ? this.uniqueCardsByName.get(splitName.get(0)) : tryGetCard(splitName.get(0), Aggregates.random(this.allCardsByName.get(splitName.get(0))).getEdition(), -1)) : tryGetCard(splitName.get(0), splitName.get(1), Integer.parseInt(splitName.get(2))); + if (fromLastSet && null != res) { + final PaperCard res_randart = tryGetCard(res.getName(), res.getEdition(), Integer.parseInt(splitName.get(2))); + return null != res_randart && isFoil ? getFoiled(res_randart) : res_randart; + } + return null != res && isFoil ? getFoiled(res) : res; } diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 18ac67cf5a3..6293e7bc9af 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -57,8 +57,21 @@ public class CardPool extends ItemPool { if ( cp == null ) cp = StaticData.instance().getVariantCards().tryGetCard(cardName, setCode, artIndex); - if ( cp != null) - this.add(cp, amount); + if ( cp != null) { + if (artIndex >= 0) { + this.add(cp, amount); + } else { + // random art index specified, we have to add cards one by one to randomize art for each of them + // TODO: somehow optimize this algorithm?... + for (int i = 0; i < amount; i++) { + PaperCard cp_random = StaticData.instance().getCommonCards().tryGetCard(cardName, setCode, -1); + if (cp_random == null) { + cp_random = StaticData.instance().getVariantCards().tryGetCard(cardName, setCode, -1); + } + this.add(cp_random); + } + } + } else throw new RuntimeException(String.format("Card %s from %s is not supported by Forge, as it's neither a known common card nor one of casual variants' card.", cardName, setCode )); } @@ -81,14 +94,18 @@ public class CardPool extends ItemPool { * @param cardName the card name */ public void add(final String cardName, int cnt) { - PaperCard cp = StaticData.instance().getCommonCards().tryGetCard(cardName); - if ( cp == null ) - cp = StaticData.instance().getVariantCards().tryGetCard(cardName); - - if ( cp != null) - this.add(cp, cnt); - else - throw new NoSuchElementException(String.format("Card %s is not supported by Forge, as it's neither a known common card nor one of casual variants' card.", cardName)); + // in order to account for art index randomization we have to add cards one by one instead of in a batch + // TODO: somehow optimize this algorithm?... + for (int i = 0; i < cnt; i++) { + PaperCard cp = StaticData.instance().getCommonCards().tryGetCard(cardName); + if ( cp == null ) + cp = StaticData.instance().getVariantCards().tryGetCard(cardName); + + if ( cp != null) + this.add(cp); + else + throw new NoSuchElementException(String.format("Card %s is not supported by Forge, as it's neither a known common card nor one of casual variants' card.", cardName)); + } } /** diff --git a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java index e55a0c97b30..713bdb149fc 100644 --- a/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java +++ b/forge-gui/src/main/java/forge/gui/deckeditor/controllers/CEditorDraftingProcess.java @@ -157,9 +157,7 @@ public class CEditorDraftingProcess extends ACEditorBase { final CardEdition landSet = IBoosterDraft.LAND_SET_CODE[0]; final int landsCount = 20; for(String landName : MagicColor.Constant.BASIC_LANDS) { - for (int i = 0; i < landsCount; i++) { - deck.get(DeckSection.Sideboard).add(landName, landSet.getCode(), -1, 1); - } + deck.get(DeckSection.Sideboard).add(landName, landSet.getCode(), -1, landsCount); } return deck; diff --git a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java index f9c8daede66..e6539fedccd 100644 --- a/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java +++ b/forge-gui/src/main/java/forge/gui/home/sanctioned/CSubmenuSealed.java @@ -172,9 +172,7 @@ public enum CSubmenuSealed implements ICDoc { deck.getOrCreate(DeckSection.Sideboard).addAll(humanPool); for (final String element : MagicColor.Constant.BASIC_LANDS) { - for (int i = 0; i < 18; i++) { - deck.get(DeckSection.Sideboard).add(element, sd.getLandSetCode(), -1, 1); - } + deck.get(DeckSection.Sideboard).add(element, sd.getLandSetCode(), -1, 18); } final IStorage sealedDecks = Singletons.getModel().getDecks().getSealed(); diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index 36717ddb69f..f2131c6004b 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -126,6 +126,8 @@ public final class QuestUtilCards { for (String landName : MagicColor.Constant.BASIC_LANDS) { for (int i=0; i can't handle art index + // randomization internally when adding cards in a batch (all cards end up with the same art) pool.add(db.getCard(landName, landCode, -1), 1); } }