Added new color-specific booster packs to quests.

This commit is contained in:
Krazy
2015-06-13 02:23:02 +00:00
parent 00158ff984
commit 63a73df35f
18 changed files with 477 additions and 231 deletions

View File

@@ -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();

View File

@@ -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);

View File

@@ -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!";
}

View File

@@ -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.";

View File

@@ -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) {

View File

@@ -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;
}