mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Added new color-specific booster packs to quests.
This commit is contained in:
@@ -186,6 +186,13 @@ public class QuestSpellShop {
|
||||
SealedProduct booster = null;
|
||||
if (item instanceof BoosterPack) {
|
||||
booster = (BoosterPack) ((BoosterPack) item).clone();
|
||||
//Replace the booster here if it's a special colored booster
|
||||
//This is to ensure that the correct sets are included in the booster
|
||||
//When loading a quest save, the set information is not available to the booster loader
|
||||
if (SealedProduct.specialSets.contains(booster.getEdition()) || booster.getEdition().equals("?")) {
|
||||
String color = booster.getName().substring(0, booster.getName().indexOf(booster.getItemType()) - 1);
|
||||
booster = new BoosterPack(color, QuestUtilCards.getColoredBoosterTemplate(color));
|
||||
}
|
||||
}
|
||||
else if (item instanceof TournamentPack) {
|
||||
booster = (TournamentPack) ((TournamentPack) item).clone();
|
||||
|
||||
@@ -23,12 +23,12 @@ import com.google.common.base.Predicates;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import forge.card.*;
|
||||
import forge.deck.Deck;
|
||||
import forge.deck.DeckSection;
|
||||
import forge.game.GameFormat;
|
||||
import forge.item.*;
|
||||
import forge.item.SealedProduct.Template;
|
||||
import forge.model.FModel;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.quest.bazaar.QuestItemType;
|
||||
@@ -40,7 +40,6 @@ import forge.quest.data.QuestPreferences.QPref;
|
||||
import forge.util.Aggregates;
|
||||
import forge.util.ItemPool;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -538,6 +537,15 @@ public final class QuestUtilCards {
|
||||
}
|
||||
this.qa.getShopList().add(BoosterPack.FN_FROM_SET.apply(Aggregates.random(rightEditions)));
|
||||
}
|
||||
|
||||
if (qpref.getPrefInt(QPref.SPECIAL_BOOSTERS) == 1) {
|
||||
for (String color : SealedProduct.specialSets) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
this.qa.getShopList().add(new BoosterPack(color, getColoredBoosterTemplate(color)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -640,6 +648,37 @@ public final class QuestUtilCards {
|
||||
));
|
||||
}
|
||||
|
||||
public static SealedProduct.Template getColoredBoosterTemplate(final String color) {
|
||||
if (FModel.getQuest().getFormat() == null) {
|
||||
return new Template("?", ImmutableList.of(
|
||||
Pair.of(BoosterSlots.COMMON + ":color(\"" + color + "\"):!" + BoosterSlots.LAND, 11),
|
||||
Pair.of(BoosterSlots.UNCOMMON + ":color(\"" + color + "\"):!" + BoosterSlots.LAND, 3),
|
||||
Pair.of(BoosterSlots.RARE_MYTHIC + ":color(\"" + color + "\"):!" + BoosterSlots.LAND, 1),
|
||||
Pair.of(BoosterSlots.LAND + ":color(\"" + color + "\")", 1))
|
||||
);
|
||||
} else {
|
||||
String restrictions = "";
|
||||
List<String> allowedSetCodes = FModel.getQuest().getFormat().getAllowedSetCodes();
|
||||
if (allowedSetCodes.isEmpty()) {
|
||||
for (String restrictedCard : FModel.getQuest().getFormat().getRestrictedCards()) {
|
||||
restrictions += ":!name(\"" + restrictedCard + "\")";
|
||||
}
|
||||
} else {
|
||||
restrictions += ":fromSets(\"";
|
||||
for (String set : allowedSetCodes) {
|
||||
restrictions += set + ",";
|
||||
}
|
||||
restrictions += ")";
|
||||
}
|
||||
return new Template("?", ImmutableList.of(
|
||||
Pair.of(BoosterSlots.COMMON + ":color(\"" + color + "\"):!" + BoosterSlots.LAND + restrictions, 11),
|
||||
Pair.of(BoosterSlots.UNCOMMON + ":color(\"" + color + "\"):!" + BoosterSlots.LAND + restrictions, 3),
|
||||
Pair.of(BoosterSlots.RARE_MYTHIC + ":color(\"" + color + "\"):!" + BoosterSlots.LAND + restrictions, 1),
|
||||
Pair.of(BoosterSlots.LAND + ":color(\"" + color + "\")" + restrictions, 1))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate cards in shop.
|
||||
*/
|
||||
@@ -755,6 +794,17 @@ public final class QuestUtilCards {
|
||||
}
|
||||
|
||||
public int getCompletionPercent(String edition) {
|
||||
|
||||
for (String color : SealedProduct.specialSets) {
|
||||
if (color.equals(edition)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (edition.equals("?")) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// get all cards in the specified edition
|
||||
Predicate<PaperCard> filter = IPaperCard.Predicates.printedInSet(edition);
|
||||
Iterable<PaperCard> editionCards = Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), filter);
|
||||
|
||||
@@ -3,10 +3,7 @@ package forge.quest;
|
||||
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;
|
||||
import forge.card.*;
|
||||
import forge.game.GameEndReason;
|
||||
import forge.game.GameFormat;
|
||||
import forge.game.GameOutcome;
|
||||
@@ -495,12 +492,13 @@ public class QuestWinLoseController {
|
||||
String title;
|
||||
if (qData.getFormat() == null) {
|
||||
|
||||
final List<GameFormat> formats = new ArrayList<>();
|
||||
//final List<GameFormat> formats = new ArrayList<>();
|
||||
final List<String> formats = new ArrayList<>();
|
||||
final String preferredFormat = FModel.getQuestPreferences().getPref(QPref.BOOSTER_FORMAT);
|
||||
|
||||
GameFormat pref = null;
|
||||
for (final GameFormat f : FModel.getFormats().getOrderedList()) {
|
||||
formats.add(f);
|
||||
formats.add(f.toString());
|
||||
if (f.toString().equals(preferredFormat)) {
|
||||
pref = f;
|
||||
}
|
||||
@@ -508,14 +506,40 @@ public class QuestWinLoseController {
|
||||
|
||||
Collections.sort(formats);
|
||||
|
||||
final GameFormat selected = SGuiChoose.getChoices("Choose bonus booster format", 1, 1, formats, pref, null).get(0);
|
||||
FModel.getQuestPreferences().setPref(QPref.BOOSTER_FORMAT, selected.toString());
|
||||
formats.addAll(SealedProduct.specialSets);
|
||||
|
||||
String preferredSelection = null;
|
||||
if (pref != null) {
|
||||
preferredSelection = pref.toString();
|
||||
}
|
||||
final String selected = SGuiChoose.getChoices("Choose bonus booster format", 1, 1, formats, preferredSelection, null).get(0);
|
||||
|
||||
if (SealedProduct.specialSets.contains(selected)) {
|
||||
|
||||
BoosterPack boosterPack = BoosterPack.FN_FROM_COLOR.apply(selected);
|
||||
assert boosterPack != null;
|
||||
cardsWon = boosterPack.getCards();
|
||||
title = "Bonus " + selected + " Booster Pack!";
|
||||
|
||||
} else {
|
||||
|
||||
GameFormat selectedFormat = null;
|
||||
for (final GameFormat f : FModel.getFormats().getOrderedList()) {
|
||||
if (f.toString().equals(selected)) {
|
||||
selectedFormat = f;
|
||||
}
|
||||
}
|
||||
|
||||
assert selectedFormat != null;
|
||||
FModel.getQuestPreferences().setPref(QPref.BOOSTER_FORMAT, selected);
|
||||
|
||||
cardsWon = qData.getCards().generateQuestBooster(selectedFormat.getFilterPrinted());
|
||||
title = "Bonus booster pack from the \"" + selectedFormat.getName() + "\" format!";
|
||||
|
||||
}
|
||||
|
||||
cardsWon = qData.getCards().generateQuestBooster(selected.getFilterPrinted());
|
||||
qData.getCards().addAllCards(cardsWon);
|
||||
|
||||
title = "Bonus booster pack from the \"" + selected.getName() + "\" format!";
|
||||
|
||||
} else {
|
||||
|
||||
final List<String> sets = new ArrayList<>();
|
||||
@@ -549,29 +573,43 @@ public class QuestWinLoseController {
|
||||
maxChoices += qData.getAssets().getItemLevel(QuestItemType.MEMBERSHIP_TOKEN);
|
||||
}
|
||||
|
||||
final List<CardEdition> options = new ArrayList<>();
|
||||
final List<String> options = new ArrayList<>();
|
||||
|
||||
while (!sets.isEmpty() && maxChoices > 0) {
|
||||
final int ix = MyRandom.getRandom().nextInt(sets.size());
|
||||
final String set = sets.get(ix);
|
||||
sets.remove(ix);
|
||||
options.add(FModel.getMagicDb().getEditions().get(set));
|
||||
if (SealedProduct.specialSets.contains(set)) {
|
||||
options.add(set);
|
||||
} else {
|
||||
options.add(FModel.getMagicDb().getEditions().get(set).toString());
|
||||
}
|
||||
if (FModel.getQuestPreferences().getPrefInt(QPref.SPECIAL_BOOSTERS) == 1) {
|
||||
if (Math.random() > 0.85 - (double) (maxChoices) / 10.0) {
|
||||
options.add(SealedProduct.specialSets.get((int) (Math.random() * SealedProduct.specialSets.size())));
|
||||
}
|
||||
}
|
||||
maxChoices--;
|
||||
}
|
||||
|
||||
final CardEdition chooseEd = SGuiChoose.one("Choose bonus booster set", options);
|
||||
String chooseEd = SGuiChoose.one("Choose bonus booster set", options);
|
||||
|
||||
if (customBooster) {
|
||||
List<PaperCard> cards = FModel.getMagicDb().getCommonCards().getAllCards(Predicates.printedInSet(chooseEd.getCode()));
|
||||
if (SealedProduct.specialSets.contains(chooseEd)) {
|
||||
final IUnOpenedProduct product = new UnOpenedProduct(QuestUtilCards.getColoredBoosterTemplate(chooseEd));
|
||||
cardsWon = product.get();
|
||||
} else if (customBooster) {
|
||||
List<PaperCard> cards = FModel.getMagicDb().getCommonCards().getAllCards(Predicates.printedInSet(FModel.getMagicDb().getEditions().get(chooseEd).getCode()));
|
||||
final IUnOpenedProduct product = new UnOpenedProduct(getBoosterTemplate(), cards);
|
||||
cardsWon = product.get();
|
||||
} else {
|
||||
final IUnOpenedProduct product = new UnOpenedProduct(FModel.getMagicDb().getBoosters().get(chooseEd.getCode()));
|
||||
String chosenEdition = chooseEd.substring(chooseEd.lastIndexOf("(") + 1, chooseEd.lastIndexOf(")"));
|
||||
chooseEd = chooseEd.substring(0, chooseEd.lastIndexOf("(")).trim();
|
||||
final IUnOpenedProduct product = new UnOpenedProduct(FModel.getMagicDb().getBoosters().get(chosenEdition));
|
||||
cardsWon = product.get();
|
||||
}
|
||||
|
||||
qData.getCards().addAllCards(cardsWon);
|
||||
title = "Bonus " + chooseEd.getName() + " booster pack!";
|
||||
title = "Bonus " + chooseEd + " Booster Pack!";
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,8 @@ public class QuestPreferences extends PreferencesStore<QuestPreferences.QPref> i
|
||||
// The preferred format of the won booster pack
|
||||
BOOSTER_FORMAT("Standard"),
|
||||
|
||||
SPECIAL_BOOSTERS("1"),
|
||||
|
||||
// How many credits are lost for losing a match
|
||||
PENALTY_LOSS("15"),
|
||||
|
||||
@@ -263,6 +265,7 @@ public class QuestPreferences extends PreferencesStore<QuestPreferences.QPref> i
|
||||
}
|
||||
break;
|
||||
|
||||
case SPECIAL_BOOSTERS:
|
||||
case ITEM_LEVEL_RESTRICTION:
|
||||
if (val != 0 && val != 1) {
|
||||
return "Only values 0 or 1 are acceptable; 1 for enabled, 0 for disabled.";
|
||||
|
||||
@@ -743,7 +743,11 @@ public class QuestDataIO {
|
||||
|
||||
protected void write(final BoosterPack booster, final Integer count, final HierarchicalStreamWriter writer) {
|
||||
writer.startNode("booster");
|
||||
writer.addAttribute("s", booster.getEdition());
|
||||
if (booster.getEdition().equals("?")) {
|
||||
writer.addAttribute("s", booster.getName().substring(0, booster.getName().indexOf(booster.getItemType()) - 1));
|
||||
} else {
|
||||
writer.addAttribute("s", booster.getEdition());
|
||||
}
|
||||
writer.addAttribute("n", count.toString());
|
||||
writer.endNode();
|
||||
}
|
||||
@@ -841,8 +845,13 @@ public class QuestDataIO {
|
||||
}
|
||||
|
||||
protected BoosterPack readBooster(final HierarchicalStreamReader reader) {
|
||||
final CardEdition ed = FModel.getMagicDb().getEditions().get(reader.getAttribute("s"));
|
||||
return BoosterPack.FN_FROM_SET.apply(ed);
|
||||
String s = reader.getAttribute("s");
|
||||
if (SealedProduct.specialSets.contains(s) || s.equals("?")) {
|
||||
return BoosterPack.FN_FROM_COLOR.apply(s);
|
||||
} else {
|
||||
final CardEdition ed = FModel.getMagicDb().getEditions().get(s);
|
||||
return BoosterPack.FN_FROM_SET.apply(ed);
|
||||
}
|
||||
}
|
||||
|
||||
protected TournamentPack readTournamentPack(final HierarchicalStreamReader reader) {
|
||||
|
||||
@@ -17,18 +17,17 @@
|
||||
*/
|
||||
package forge.quest.io;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import com.esotericsoftware.minlog.Log;
|
||||
|
||||
import forge.card.MagicColor;
|
||||
import forge.properties.ForgeConstants;
|
||||
import forge.util.FileUtil;
|
||||
import forge.util.MyRandom;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* ReadPriceList class.
|
||||
@@ -73,12 +72,13 @@ public class ReadPriceList {
|
||||
* @return a {@link java.util.HashMap} object.
|
||||
*/
|
||||
private Map<String, Integer> readFile(final String file) {
|
||||
final Map<String, Integer> map = new HashMap<String, Integer>();
|
||||
|
||||
final Map<String, Integer> map = new HashMap<>();
|
||||
final Random r = MyRandom.getRandom();
|
||||
|
||||
final List<String> lines = FileUtil.readFile(file);
|
||||
for (final String line : lines) {
|
||||
if (line.trim().length() == 0) {
|
||||
if (line.trim().isEmpty()) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -95,8 +95,8 @@ public class ReadPriceList {
|
||||
try {
|
||||
int val = Integer.parseInt(price.trim());
|
||||
|
||||
if (!(MagicColor.Constant.BASIC_LANDS.contains(name) || MagicColor.Constant.SNOW_LANDS.contains(name))) {
|
||||
float ff = 0;
|
||||
if (!(MagicColor.Constant.BASIC_LANDS.contains(name) || MagicColor.Constant.SNOW_LANDS.contains(name)) && !ForgeConstants.PRICES_BOOSTER_FILE.equals(file)) {
|
||||
float ff;
|
||||
if (r.nextInt(100) < 90) {
|
||||
ff = r.nextInt(10) * (float) .01;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user