From 74d4ea8a7874f2330a4316154337c60b8f29f8fe Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 14 Jun 2025 11:02:54 -0400 Subject: [PATCH] Replace each card in a slot individually instead of replacing the whole slot at once. (Fixes higher rates of replacements) (#7854) --- .../item/generation/BoosterGenerator.java | 76 ++++++++++++------- forge-gui/res/editions/Final Fantasy.txt | 1 - 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java index 0b36a5b27b2..c5821436714 100644 --- a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java +++ b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java @@ -401,46 +401,68 @@ public class BoosterGenerator { System.out.println(numCards + " of type " + slotType); // For cards that end in '+', attempt to convert this card to foil. - boolean convertCardFoil = slotType.endsWith("+"); - if (convertCardFoil) { + boolean convertAllToFoil = slotType.endsWith("+"); + if (convertAllToFoil) { slotType = slotType.substring(0, slotType.length() - 1); } - // Unpack Base BoosterSlot boosterSlot = boosterSlots.get(slotType); - String determineSheet = boosterSlot.replaceSlot(); + Map slotReplacementCount = bulkSlotReplacement(boosterSlot, numCards); - if (determineSheet.endsWith("+")) { - determineSheet = determineSheet.substring(0, determineSheet.length() - 1); - convertCardFoil = true; - } + List paperCards = Lists.newArrayList(); + for(Map.Entry entry : slotReplacementCount.entrySet()) { + String determineSheet = entry.getKey(); + int numCardsToGenerate = entry.getValue(); - String setCode = template.getEdition(); - - // Ok, so we have a sheet now. Most should be standard sheets, but some named edition sheets - List paperCards; - PrintSheet ps; - try { - // Apply the edition to the sheet name by default. We'll try again if thats not a real sheet - ps = getPrintSheet(determineSheet + " " + setCode); - } catch(Exception e) { - ps = getPrintSheet(determineSheet); - } - if (convertCardFoil) { - paperCards = Lists.newArrayList(); - for(PaperCard pc : ps.random(numCards, true)) { - paperCards.add(pc.getFoiled()); + if (determineSheet == null || determineSheet.isEmpty() || numCardsToGenerate == 0) { + continue; } - } else { - paperCards = ps.random(numCards, true); - } - result.addAll(paperCards); + // If the sheet ends with a '+', convert all cards in replacement section to foil + boolean convertThisToFoil = false; + if (determineSheet.endsWith("+")) { + determineSheet = determineSheet.substring(0, determineSheet.length() - 1); + convertThisToFoil = true; + } + + String setCode = template.getEdition(); + PrintSheet ps; + try { + // Apply the edition to the sheet name by default. We'll try again if thats not a real sheet + ps = getPrintSheet(determineSheet + " " + setCode); + } catch (Exception e) { + ps = getPrintSheet(determineSheet); + } + if (convertAllToFoil || convertThisToFoil) { + for (PaperCard pc : ps.random(numCardsToGenerate, true)) { + paperCards.add(pc.getFoiled()); + } + } else { + paperCards.addAll(ps.random(numCardsToGenerate, true)); + } + + result.addAll(paperCards); + } } return result; } + private static Map bulkSlotReplacement(BoosterSlot boosterSlot, int numCards) { + Map slotReplacementCount = new HashMap<>(); + + for(int i = 0; i < numCards; i++) { + String determineSheet = boosterSlot.replaceSlot(); + if (slotReplacementCount.containsKey(determineSheet)) { + slotReplacementCount.put(determineSheet, slotReplacementCount.get(determineSheet) + 1); + } else { + slotReplacementCount.put(determineSheet, 1); + } + } + + return slotReplacementCount; + } + private static void ensureGuaranteedCardInBooster(List result, SealedTemplate template, String boosterMustContain) { // First, see if there's already a card of the given type String[] types = TextUtil.split(boosterMustContain, ' '); diff --git a/forge-gui/res/editions/Final Fantasy.txt b/forge-gui/res/editions/Final Fantasy.txt index 8f0b5cc10c9..799d10f2ece 100644 --- a/forge-gui/res/editions/Final Fantasy.txt +++ b/forge-gui/res/editions/Final Fantasy.txt @@ -59,7 +59,6 @@ Replace=.0007F Mythic:fromSheet("FIN alternate art") Replace=.0000625F :name("Cid, Timeless Artificer"):!fromSheet("FIN alternate art") Replace=.0009375F :name("Cid, Timeless Artificer"):fromSheet("FIN alternate art") - [AnyLand] Base=fromSheet("FIN dual lands") Replace=.22F :fromSheet("FIN dual lands")+