diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index 6509ede118c..3dbc93602be 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -1,9 +1,5 @@ package forge; -import java.io.File; -import java.util.Map; -import java.util.TreeMap; - import forge.card.CardDb; import forge.card.CardEdition; import forge.card.CardRules; @@ -14,10 +10,14 @@ import forge.item.SealedProduct; import forge.util.storage.IStorage; import forge.util.storage.StorageBase; +import java.io.File; +import java.util.Map; +import java.util.TreeMap; + /** * The class holding game invariants, such as cards, editions, game formats. All that data, which is not supposed to be changed by player - * + * * @author Max */ public class StaticData { @@ -37,8 +37,8 @@ public class StaticData { this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder))); lastInstance = this; - final Map regularCards = new TreeMap(String.CASE_INSENSITIVE_ORDER); - final Map variantsCards = new TreeMap(String.CASE_INSENSITIVE_ORDER); + final Map regularCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + final Map variantsCards = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); for (CardRules card : reader.loadCards()) { if (null == card) continue; @@ -59,15 +59,15 @@ public class StaticData { commonCards.initialize(false, false); variantCards.initialize(false, false); - this.boosters = new StorageBase("Boosters", editions.getBoosterGenerator()); - this.specialBoosters = new StorageBase("Special boosters", new SealedProduct.Template.Reader(new File(blockDataFolder, "boosters-special.txt"))); - this.tournaments = new StorageBase("Starter sets", new SealedProduct.Template.Reader(new File(blockDataFolder, "starters.txt"))); - this.fatPacks = new StorageBase("Fat packs", new FatPack.Template.Reader(blockDataFolder + "fatpacks.txt")); - this.boosterBoxes = new StorageBase("Booster boxes", new BoosterBox.Template.Reader(blockDataFolder + "boosterboxes.txt")); - this.printSheets = new StorageBase("Special print runs", new PrintSheet.Reader(new File(blockDataFolder, "printsheets.txt"))); + this.boosters = new StorageBase<>("Boosters", editions.getBoosterGenerator()); + this.specialBoosters = new StorageBase<>("Special boosters", new SealedProduct.Template.Reader(new File(blockDataFolder, "boosters-special.txt"))); + this.tournaments = new StorageBase<>("Starter sets", new SealedProduct.Template.Reader(new File(blockDataFolder, "starters.txt"))); + this.fatPacks = new StorageBase<>("Fat packs", new FatPack.Template.Reader(blockDataFolder + "fatpacks.txt")); + this.boosterBoxes = new StorageBase<>("Booster boxes", new BoosterBox.Template.Reader(blockDataFolder + "boosterboxes.txt")); + this.printSheets = new StorageBase<>("Special print runs", new PrintSheet.Reader(new File(blockDataFolder, "printsheets.txt"))); } - public final static StaticData instance() { + public static StaticData instance() { return lastInstance; } @@ -75,21 +75,21 @@ public class StaticData { return this.editions; } - /** @return {@link forge.util.storage.IStorageView}<{@link forge.item.FatPackTemplate}> */ + /** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */ public IStorage getFatPacks() { return fatPacks; } - + public IStorage getBoosterBoxes() { return boosterBoxes; } - /** @return {@link forge.util.storage.IStorageView}<{@link forge.card.BoosterTemplate}> */ + /** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */ public final IStorage getTournamentPacks() { return tournaments; } - /** @return {@link forge.util.storage.IStorageView}<{@link forge.card.BoosterTemplate}> */ + /** @return {@link forge.util.storage.IStorage}<{@link forge.item.SealedProduct.Template}> */ public final IStorage getBoosters() { return boosters; } diff --git a/forge-core/src/main/java/forge/card/UnOpenedProduct.java b/forge-core/src/main/java/forge/card/UnOpenedProduct.java index 7b16b3f6835..036e134860f 100644 --- a/forge-core/src/main/java/forge/card/UnOpenedProduct.java +++ b/forge-core/src/main/java/forge/card/UnOpenedProduct.java @@ -18,7 +18,7 @@ public class UnOpenedProduct implements IUnOpenedProduct { private final SealedProduct.Template tpl; private final Map sheets; - private boolean poolLimited = false; // if true after successful generation cards are removed from printsheets. + private boolean poolLimited = false; // if true after successful generation cards are removed from printsheets. public final boolean isPoolLimited() { return poolLimited; @@ -27,7 +27,7 @@ public class UnOpenedProduct implements IUnOpenedProduct { public final void setLimitedPool(boolean considerNumbersInPool) { this.poolLimited = considerNumbersInPool; // TODO: Add 0 to parameter's name. } - + // Means to select from all unique cards (from base game, ie. no schemes or avatars) public UnOpenedProduct(SealedProduct.Template template) { @@ -42,7 +42,7 @@ public class UnOpenedProduct implements IUnOpenedProduct { public UnOpenedProduct(SealedProduct.Template template, Iterable cards) { tpl = template; - sheets = new TreeMap(); + sheets = new TreeMap<>(); prebuildSheets(cards); } @@ -62,15 +62,15 @@ public class UnOpenedProduct implements IUnOpenedProduct { } // If they request cards from an arbitrary pool, there's no use to cache printsheets. - private final List getBoosterPack() { - List result = new ArrayList(); + private List getBoosterPack() { + List result = new ArrayList<>(); for(Pair slot : tpl.getSlots()) { PrintSheet ps = sheets.get(slot.getLeft()); if(ps.isEmpty() && poolLimited ) { throw new IllegalStateException("The cardpool has been depleted and has no more cards for slot " + slot.getKey()); } - List foundCards = ps.random(slot.getRight().intValue(), true); + List foundCards = ps.random(slot.getRight(), true); if(poolLimited) ps.removeAll(foundCards); result.addAll(foundCards); @@ -79,4 +79,3 @@ public class UnOpenedProduct implements IUnOpenedProduct { } } - \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 94775e5fbc8..79b19ca1a86 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -1,14 +1,9 @@ package forge.quest; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map.Entry; - -import org.apache.commons.lang3.StringUtils; - +import com.google.common.collect.ImmutableList; import forge.LobbyPlayer; import forge.assets.FSkinProp; +import forge.card.BoosterSlots; import forge.card.CardEdition; import forge.card.IUnOpenedProduct; import forge.card.UnOpenedProduct; @@ -22,11 +17,8 @@ import forge.game.player.PlayerStatistics; import forge.game.player.PlayerView; import forge.interfaces.IButton; import forge.interfaces.IWinLoseView; -import forge.item.BoosterPack; -import forge.item.InventoryItem; -import forge.item.PaperCard; -import forge.item.SealedProduct; -import forge.item.TournamentPack; +import forge.item.*; +import forge.item.IPaperCard.Predicates; import forge.model.FModel; import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences.FPref; @@ -36,6 +28,13 @@ import forge.quest.data.QuestPreferences.DifficultyPrefs; import forge.quest.data.QuestPreferences.QPref; import forge.util.MyRandom; import forge.util.gui.SGuiChoose; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map.Entry; public class QuestWinLoseController { private final GameView lastGame; @@ -212,11 +211,11 @@ public class QuestWinLoseController { // TODO use q.qdPrefs to write bonus credits in prefs file final StringBuilder sb = new StringBuilder(); - int credTotal = 0; - int credBase = 0; + int credTotal; + int credBase; int credGameplay = 0; int credUndefeated = 0; - int credEstates = 0; + int credEstates; // Basic win bonus final int base = FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_BASE); @@ -391,7 +390,7 @@ public class QuestWinLoseController { */ private void awardRandomRare(final String message) { final PaperCard c = qData.getCards().addRandomRare(); - final List cardsWon = new ArrayList(); + final List cardsWon = new ArrayList<>(); cardsWon.add(c); view.showCards(message, cardsWon); @@ -409,7 +408,7 @@ public class QuestWinLoseController { final List cardsWon = new ArrayList<>(); List cardsToAdd; - String typeWon = ""; + String typeWon; boolean addDraftToken = false; switch (currentStreak) { @@ -466,7 +465,7 @@ public class QuestWinLoseController { qData.getAchievements().addDraftToken(); } - if (cardsWon.size() > 0) { + if (!cardsWon.isEmpty()) { view.showCards("You have achieved a " + (currentStreak == 0 ? "50" : currentStreak) + " win streak and won " + cardsWon.size() + " " + typeWon + " card" + ((cardsWon.size() != 1) ? "s" : "") + "!", cardsWon); } } @@ -491,11 +490,12 @@ public class QuestWinLoseController { * */ private void awardBooster() { - List cardsWon = null; + List cardsWon; String title; if (qData.getFormat() == null) { - final List formats = new ArrayList(); + + final List formats = new ArrayList<>(); final String preferredFormat = FModel.getQuestPreferences().getPref(QPref.BOOSTER_FORMAT); GameFormat pref = null; @@ -515,9 +515,10 @@ public class QuestWinLoseController { qData.getCards().addAllCards(cardsWon); title = "Bonus booster pack from the \"" + selected.getName() + "\" format!"; - } - else { - final List sets = new ArrayList(); + + } else { + + final List sets = new ArrayList<>(); for (final SealedProduct.Template bd : FModel.getMagicDb().getBoosters()) { if (bd != null && qData.getFormat().isSetLegal(bd.getEdition())) { @@ -525,6 +526,19 @@ public class QuestWinLoseController { } } + boolean customBooster = false; + + //No boosters found for current quest settings + if (sets.isEmpty()) { + customBooster = true; + CardEdition.Collection editions = FModel.getMagicDb().getEditions(); + for (CardEdition edition : editions) { + if (qData.getFormat().isSetLegal(edition.getCode())) { + sets.add(edition.getCode()); + } + } + } + int maxChoices = 1; if (wonMatch) { maxChoices++; @@ -535,7 +549,7 @@ public class QuestWinLoseController { maxChoices += qData.getAssets().getItemLevel(QuestItemType.MEMBERSHIP_TOKEN); } - final List options = new ArrayList(); + final List options = new ArrayList<>(); while (!sets.isEmpty() && maxChoices > 0) { final int ix = MyRandom.getRandom().nextInt(sets.size()); @@ -547,10 +561,18 @@ public class QuestWinLoseController { final CardEdition chooseEd = SGuiChoose.one("Choose bonus booster set", options); - final IUnOpenedProduct product = new UnOpenedProduct(FModel.getMagicDb().getBoosters().get(chooseEd.getCode())); - cardsWon = product.get(); + if (customBooster) { + List cards = FModel.getMagicDb().getCommonCards().getAllCards(Predicates.printedInSet(chooseEd.getCode())); + final IUnOpenedProduct product = new UnOpenedProduct(getBoosterTemplate(), cards); + cardsWon = product.get(); + } else { + final IUnOpenedProduct product = new UnOpenedProduct(FModel.getMagicDb().getBoosters().get(chooseEd.getCode())); + cardsWon = product.get(); + } + qData.getCards().addAllCards(cardsWon); title = "Bonus " + chooseEd.getName() + " booster pack!"; + } if (cardsWon != null) { @@ -559,6 +581,14 @@ public class QuestWinLoseController { } } + private SealedProduct.Template getBoosterTemplate() { + return new SealedProduct.Template(ImmutableList.of( + Pair.of(BoosterSlots.COMMON, FModel.getQuestPreferences().getPrefInt(QPref.BOOSTER_COMMONS)), + Pair.of(BoosterSlots.UNCOMMON, FModel.getQuestPreferences().getPrefInt(QPref.BOOSTER_UNCOMMONS)), + Pair.of(BoosterSlots.RARE_MYTHIC, FModel.getQuestPreferences().getPrefInt(QPref.BOOSTER_RARES)) + )); + } + /** *

* awardChallengeWin. @@ -571,11 +601,11 @@ public class QuestWinLoseController { final StringBuilder sb = new StringBuilder(); sb.append("Challenge completed.\n\n"); - sb.append("Challenge bounty: " + questRewardCredits + " credits."); + sb.append("Challenge bounty: ").append(questRewardCredits).append(" credits."); qData.getAssets().addCredits(questRewardCredits); - view.showMessage(sb.toString(), "Challenge Rewards for \"" + ((QuestEventChallenge) qEvent).getTitle() + "\"", FSkinProp.ICO_QUEST_BOX); + view.showMessage(sb.toString(), "Challenge Rewards for \"" + qEvent.getTitle() + "\"", FSkinProp.ICO_QUEST_BOX); awardSpecialReward(null); } @@ -594,20 +624,19 @@ public class QuestWinLoseController { return; } - final List cardsWon = new ArrayList(); + final List cardsWon = new ArrayList<>(); for (final InventoryItem ii : itemsWon) { if (ii instanceof PaperCard) { cardsWon.add((PaperCard) ii); } else if (ii instanceof TournamentPack || ii instanceof BoosterPack) { - final List boosterCards = new ArrayList(); - SealedProduct booster = null; + final List boosterCards = new ArrayList<>(); + SealedProduct booster; if (ii instanceof BoosterPack) { booster = (BoosterPack) ((BoosterPack) ii).clone(); boosterCards.addAll(booster.getCards()); - } - else if (ii instanceof TournamentPack) { + } else { booster = (TournamentPack) ((TournamentPack) ii).clone(); boosterCards.addAll(booster.getCards()); } @@ -618,7 +647,7 @@ public class QuestWinLoseController { } else if (ii instanceof IQuestRewardCard) { final List cardChoices = ((IQuestRewardCard) ii).getChoices(); - final PaperCard chosenCard = (null == cardChoices ? null : SGuiChoose.one("Choose " + ((IQuestRewardCard) ii).getName(), cardChoices)); + final PaperCard chosenCard = (null == cardChoices ? null : SGuiChoose.one("Choose " + ii.getName(), cardChoices)); if (null != chosenCard) { cardsWon.add(chosenCard); }