mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Added experimental 'limited Quest mode'. If selected, it will impose format-based restrictions on the available cards during the game. Current exceptions: theme decks in spell stores (deliberate). enemy decks (more in-format enemy decks would be needed first).
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -12592,6 +12592,7 @@ src/main/java/forge/error/ExceptionHandler.java svneol=native#text/plain
|
||||
src/main/java/forge/error/package-info.java svneol=native#text/plain
|
||||
src/main/java/forge/game/GameEndReason.java -text
|
||||
src/main/java/forge/game/GameFormat.java -text
|
||||
src/main/java/forge/game/GameFormatQuest.java -text
|
||||
src/main/java/forge/game/GameLossReason.java -text
|
||||
src/main/java/forge/game/GameNew.java -text
|
||||
src/main/java/forge/game/GamePlayerRating.java -text
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.google.common.base.Predicate;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.game.GameFormat;
|
||||
import forge.game.GameFormatQuest;
|
||||
import forge.util.FileSection;
|
||||
import forge.util.StorageReaderFile;
|
||||
|
||||
@@ -223,6 +224,29 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
|
||||
return this.format.isSetLegal(subject.getCode());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is legal in quest format.
|
||||
*
|
||||
* @param qFormat the format
|
||||
* @return the predicate
|
||||
*/
|
||||
public static final Predicate<CardEdition> isLegalInFormatQuest(final GameFormatQuest qFormat) {
|
||||
return new LegalInFormatQuest(qFormat);
|
||||
}
|
||||
|
||||
private static class LegalInFormatQuest implements Predicate<CardEdition> {
|
||||
private final GameFormatQuest qFormat;
|
||||
|
||||
public LegalInFormatQuest(final GameFormatQuest fmt) {
|
||||
this.qFormat = fmt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(final CardEdition subject) {
|
||||
return this.qFormat.isSetLegal(subject.getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Reader extends StorageReaderFile<CardEdition> {
|
||||
|
||||
@@ -83,6 +83,24 @@ public final class GameFormat {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the set list (for GameFormatQuest).
|
||||
*
|
||||
* @return list of allowed set codes
|
||||
*/
|
||||
public List<String> getAllowedSetCodes() {
|
||||
return this.allowedSetCodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the banned cards (for GameFormatQuest).
|
||||
*
|
||||
* @return list of banned card names
|
||||
*/
|
||||
public List<String> getBannedCardNames() {
|
||||
return this.bannedCardNames;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the filter rules.
|
||||
*
|
||||
|
||||
221
src/main/java/forge/game/GameFormatQuest.java
Normal file
221
src/main/java/forge/game/GameFormatQuest.java
Normal file
@@ -0,0 +1,221 @@
|
||||
/*
|
||||
* Forge: Play Magic: the Gathering.
|
||||
* Copyright (C) 2011 Forge Team
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package forge.game;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Predicates;
|
||||
|
||||
import forge.card.CardRulesPredicates;
|
||||
import forge.item.CardPrinted;
|
||||
|
||||
|
||||
/**
|
||||
* This is an alternate game format type, the main difference is that this
|
||||
* is not immutable. This class is necessary because we may wish to update
|
||||
* its contents in certain circumstances, and it was safer to create a new
|
||||
* class than to make the preset game formats modifiable.
|
||||
*/
|
||||
public final class GameFormatQuest {
|
||||
|
||||
private final String name;
|
||||
// contains allowed sets, when empty allows all sets
|
||||
private List<String> allowedSetCodes;
|
||||
private List<String> bannedCardNames;
|
||||
|
||||
private Predicate<CardPrinted> filterRules;
|
||||
private Predicate<CardPrinted> filterPrinted;
|
||||
|
||||
/**
|
||||
* Instantiates a new game format based on an existing format.
|
||||
*
|
||||
* @param toCopy
|
||||
* an existing format
|
||||
*/
|
||||
public GameFormatQuest(final GameFormat toCopy) {
|
||||
this.name = new String(toCopy.getName());
|
||||
|
||||
this.allowedSetCodes = new ArrayList<String>();
|
||||
allowedSetCodes.addAll(toCopy.getAllowedSetCodes());
|
||||
|
||||
this.bannedCardNames = new ArrayList<String>();
|
||||
bannedCardNames.addAll(toCopy.getBannedCardNames());
|
||||
|
||||
this.filterRules = this.buildFilterRules();
|
||||
this.filterPrinted = this.buildFilterPrinted();
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates an empty new game format.
|
||||
*
|
||||
* @param newName
|
||||
* String, the name
|
||||
*/
|
||||
public GameFormatQuest(final String newName) {
|
||||
this.name = new String(newName);
|
||||
|
||||
this.allowedSetCodes = new ArrayList<String>();
|
||||
this.bannedCardNames = new ArrayList<String>();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Instantiates a new game format based on two lists.
|
||||
*
|
||||
* @param newName
|
||||
* String, the name
|
||||
* @param setsToAllow
|
||||
* List<String>, these are the allowed sets
|
||||
* @param cardsToBan
|
||||
* List<String>, these will be the banned cards
|
||||
*/
|
||||
public GameFormatQuest(final String newName, final List<String> setsToAllow, final List<String> cardsToBan) {
|
||||
this.name = new String(newName);
|
||||
|
||||
this.allowedSetCodes = new ArrayList<String>();
|
||||
allowedSetCodes.addAll(setsToAllow);
|
||||
|
||||
this.bannedCardNames = new ArrayList<String>();
|
||||
bannedCardNames.addAll(cardsToBan);
|
||||
|
||||
this.filterRules = this.buildFilterRules();
|
||||
this.filterPrinted = this.buildFilterPrinted();
|
||||
}
|
||||
|
||||
private Predicate<CardPrinted> buildFilterPrinted() {
|
||||
final Predicate<CardPrinted> banNames = CardPrinted.Predicates.namesExcept(this.bannedCardNames);
|
||||
if (this.allowedSetCodes == null || this.allowedSetCodes.isEmpty()) {
|
||||
return banNames;
|
||||
}
|
||||
return Predicates.and(banNames, CardPrinted.Predicates.printedInSets(this.allowedSetCodes, true));
|
||||
}
|
||||
|
||||
private Predicate<CardPrinted> buildFilterRules() {
|
||||
final Predicate<CardPrinted> banNames = CardPrinted.Predicates.namesExcept(this.bannedCardNames);
|
||||
if (this.allowedSetCodes == null || this.allowedSetCodes.isEmpty()) {
|
||||
return banNames;
|
||||
}
|
||||
return Predicates.and(banNames, Predicates.compose(CardRulesPredicates.wasPrintedInSets(this.allowedSetCodes), CardPrinted.FN_GET_RULES));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Updates the filters based on the current list data.
|
||||
*/
|
||||
public void updateFilters() {
|
||||
this.filterRules = this.buildFilterRules();
|
||||
this.filterPrinted = this.buildFilterPrinted();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param setCode
|
||||
* the set code to add
|
||||
*/
|
||||
public void addAllowedSet(final String setCode) {
|
||||
if (!allowedSetCodes.contains(setCode)) {
|
||||
allowedSetCodes.add(setCode);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param banCard
|
||||
* the card to ban
|
||||
*/
|
||||
public void addBannedCard(final String banCard) {
|
||||
if (!bannedCardNames.contains(banCard)) {
|
||||
bannedCardNames.add(banCard);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the name.
|
||||
*
|
||||
* @return the name
|
||||
*/
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the filter rules.
|
||||
*
|
||||
* @return the filter rules
|
||||
*/
|
||||
public Predicate<CardPrinted> getFilterRules() {
|
||||
return this.filterRules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the filter printed.
|
||||
*
|
||||
* @return the filter printed
|
||||
*/
|
||||
public Predicate<CardPrinted> getFilterPrinted() {
|
||||
return this.filterPrinted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the set list.
|
||||
*
|
||||
* @return list of allowed set codes
|
||||
*/
|
||||
public List<String> getAllowedSetCodes() {
|
||||
return this.allowedSetCodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the banned cards.
|
||||
*
|
||||
* @return list of banned card names
|
||||
*/
|
||||
public List<String> getBannedCardNames() {
|
||||
return this.bannedCardNames;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is sets the legal.
|
||||
*
|
||||
* @param setCode
|
||||
* the set code
|
||||
* @return true, if is sets the legal
|
||||
*/
|
||||
public boolean isSetLegal(final String setCode) {
|
||||
return this.allowedSetCodes.isEmpty() || this.allowedSetCodes.contains(setCode);
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name + " (format)";
|
||||
}
|
||||
|
||||
public static final Function<GameFormat, String> FN_GET_NAME = new Function<GameFormat, String>() {
|
||||
@Override
|
||||
public String apply(GameFormat arg1) {
|
||||
return arg1.getName();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
@@ -158,7 +158,7 @@ public enum CSubmenuQuestData implements ICDoc {
|
||||
}
|
||||
|
||||
// Give the user a few cards to build a deck
|
||||
AllZone.getQuest().newGame(questName, difficulty, mode, startPool, rotatingFormat, startPrecon);
|
||||
AllZone.getQuest().newGame(questName, difficulty, mode, startPool, rotatingFormat, startPrecon, view.getBoxPersist().isSelected());
|
||||
AllZone.getQuest().save();
|
||||
|
||||
// Save in preferences.
|
||||
|
||||
@@ -61,6 +61,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
private final JRadioButton radExpert = new FRadioButton("Expert");
|
||||
|
||||
private final JCheckBox boxFantasy = new FCheckBox("Fantasy Mode");
|
||||
private final JCheckBox boxFormatPersist = new FCheckBox("Enforce format during quest");
|
||||
|
||||
private final JRadioButton radCompleteStart = new FRadioButton("Unrestricted Starting Pool");
|
||||
private final JRadioButton radRotatingStart = new FRadioButton("Format: ");
|
||||
@@ -113,6 +114,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
public void actionPerformed(ActionEvent actionEvent) {
|
||||
cbxPrecon.setEnabled(radPreconStart.isSelected());
|
||||
cbxFormat.setEnabled(radRotatingStart.isSelected());
|
||||
boxFormatPersist.setEnabled(radRotatingStart.isSelected());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -155,6 +157,8 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
radRotatingStart.addActionListener(preconListener);
|
||||
group3.add(radPreconStart);
|
||||
cbxFormat.setEnabled(false);
|
||||
boxFormatPersist.setSelected(true);
|
||||
boxFormatPersist.setEnabled(false);
|
||||
radPreconStart.addActionListener(preconListener);
|
||||
radCompleteStart.setSelected(true);
|
||||
cbxPrecon.setEnabled(false);
|
||||
@@ -177,9 +181,9 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
pnlOptions.add(radRotatingStart, constraints + ", wrap");
|
||||
pnlOptions.add(radExpert, constraints + ", gap 7.5% 2.5% 0 0 ");
|
||||
pnlOptions.add(cbxFormat, constraints + ", gap 20 0, w 30%!, wrap");
|
||||
pnlOptions.add(boxFormatPersist, constraints + ", wrap, skip");
|
||||
pnlOptions.add(radPreconStart, constraints + ", wrap, skip");
|
||||
pnlOptions.add(cbxPrecon, "gap 20 0, w 30%!, h 35px!, wrap, skip");
|
||||
|
||||
pnlOptions.add(btnEmbark, "w 40%!, h 30px!, gap 30% 0 20px 0, span 3 1");
|
||||
|
||||
// Final layout
|
||||
@@ -197,7 +201,7 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
pnlViewport.add(scr, "w 96%!, pushy, growy, gap 2% 0 0 30px");
|
||||
|
||||
pnlViewport.add(pnlTitleNew, "w 96%, h 36px!, gap 2% 0 0 10px");
|
||||
pnlViewport.add(pnlOptions, "w 96%!, h 250px!, gap 2% 0 0 20px");
|
||||
pnlViewport.add(pnlOptions, "w 96%!, h 280px!, gap 2% 0 0 20px");
|
||||
|
||||
scrContent.setBorder(null);
|
||||
}
|
||||
@@ -277,6 +281,13 @@ public enum VSubmenuQuestData implements IVSubmenu {
|
||||
return boxFantasy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link javax.swing.JCheckBox}
|
||||
*/
|
||||
public JCheckBox getBoxPersist() {
|
||||
return boxFormatPersist;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link javax.swing.JRadioButton}
|
||||
*/
|
||||
|
||||
@@ -553,21 +553,9 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
*/
|
||||
private void awardBooster() {
|
||||
|
||||
// Do not enable booster selection in this way...
|
||||
final boolean allowSetSelection = false;
|
||||
|
||||
final List<String> boosterTypes = new ArrayList<String>();
|
||||
boosterTypes.add("Format");
|
||||
boosterTypes.add("Set");
|
||||
|
||||
final String prompt = "Choose bonus booster type:";
|
||||
Object o = null;
|
||||
if (allowSetSelection) {
|
||||
o = GuiChoose.one(prompt, boosterTypes);
|
||||
}
|
||||
List<CardPrinted> cardsWon = null;
|
||||
|
||||
if (o == null || o.toString().equals(boosterTypes.get(0))) {
|
||||
if (qData.getFormat() == null) {
|
||||
final List<GameFormat> formats = new ArrayList<GameFormat>();
|
||||
String prefferedFormat = Singletons.getModel().getQuestPreferences().getPreference(QPref.BOOSTER_FORMAT);
|
||||
|
||||
@@ -595,14 +583,59 @@ public class QuestWinLoseHandler extends ControlWinLose {
|
||||
final List<String> sets = new ArrayList<String>();
|
||||
|
||||
for (BoosterData bd : Singletons.getModel().getBoosters()) {
|
||||
sets.add(bd.getEdition());
|
||||
if (qData.getFormat().isSetLegal(bd.getEdition())) {
|
||||
sets.add(bd.getEdition());
|
||||
}
|
||||
}
|
||||
|
||||
List<String> chooseSets = new ArrayList<String>();
|
||||
|
||||
int maxChoices = 1;
|
||||
|
||||
if (this.wonMatch) {
|
||||
maxChoices++;
|
||||
final int wins = qData.getAchievements().getWin();
|
||||
if (wins > 0 && wins % 5 == 0) { maxChoices++; }
|
||||
if (wins > 0 && wins % 20 == 0) { maxChoices++; }
|
||||
if (wins > 0 && wins % 50 == 0) { maxChoices++; }
|
||||
}
|
||||
|
||||
if (sets.size() > maxChoices) {
|
||||
if (maxChoices > 1) {
|
||||
Boolean[] choices = new Boolean[sets.size()];
|
||||
for (int i = 0; i < sets.size(); i++) {
|
||||
choices[i] = false;
|
||||
}
|
||||
|
||||
int toEnable = maxChoices;
|
||||
|
||||
while (toEnable > 0) {
|
||||
int index = MyRandom.getRandom().nextInt(sets.size());
|
||||
if (!choices[index]) {
|
||||
choices[index] = true;
|
||||
toEnable--;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < sets.size(); i++) {
|
||||
if (choices[i]) {
|
||||
chooseSets.add(sets.get(i));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
chooseSets.add(sets.get(MyRandom.getRandom().nextInt(sets.size())));
|
||||
}
|
||||
|
||||
} else {
|
||||
chooseSets.addAll(sets);
|
||||
}
|
||||
|
||||
final String setPrompt = "Choose bonus booster set:";
|
||||
final String chSet = GuiChoose.one(setPrompt, sets);
|
||||
final String chSet = GuiChoose.one(setPrompt, chooseSets);
|
||||
|
||||
cardsWon = (new UnOpenedProduct(Singletons.getModel().getBoosters().get(chSet))).open();
|
||||
qData.getCards().addAllCards(cardsWon);
|
||||
this.lblTemp1 = new TitleLabel("Bonus booster pack from the \"" + chSet + "\" booster!");
|
||||
this.lblTemp1 = new TitleLabel("Bonus \"" + chSet + "\" booster pack!");
|
||||
}
|
||||
|
||||
if (cardsWon != null) {
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.google.common.base.Predicates;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.deck.Deck;
|
||||
import forge.game.GameFormatQuest;
|
||||
import forge.item.CardPrinted;
|
||||
import forge.item.PreconDeck;
|
||||
import forge.properties.ForgeProps;
|
||||
@@ -54,6 +55,8 @@ public class QuestController {
|
||||
// complex
|
||||
private QuestUtilCards myCards;
|
||||
|
||||
private GameFormatQuest questFormat;
|
||||
|
||||
private QuestEvent currentEvent;
|
||||
|
||||
/** The decks. */
|
||||
@@ -125,6 +128,15 @@ public class QuestController {
|
||||
return this.decks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current format if any.
|
||||
*
|
||||
* @return GameFormatQuest, the game format (if persistent).
|
||||
*/
|
||||
public GameFormatQuest getFormat() {
|
||||
return this.questFormat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current event.
|
||||
*
|
||||
@@ -162,8 +174,12 @@ public class QuestController {
|
||||
// These are helper classes that hold no data.
|
||||
this.decks = this.model == null ? null : this.model.getAssets().getDeckStorage();
|
||||
this.myCards = this.model == null ? null : new QuestUtilCards(this);
|
||||
this.questFormat = this.model == null ? null : this.model.getFormat();
|
||||
this.currentEvent = null;
|
||||
|
||||
// if (questFormat == null) { System.out.println("No quest."); }
|
||||
// else { System.out.println("Quest = " + questFormat.getName()); }
|
||||
|
||||
this.getChallengesManager().randomizeOpponents();
|
||||
this.getDuelsManager().randomizeOpponents();
|
||||
}
|
||||
@@ -195,11 +211,17 @@ public class QuestController {
|
||||
* @param startPool the start type
|
||||
* @param startFormat the format of starting pool
|
||||
* @param preconName the precon name
|
||||
* @param persist
|
||||
* enforce the format for the whole quest
|
||||
*/
|
||||
public void newGame(final String name, final int diff, final QuestMode mode, final QuestStartPool startPool,
|
||||
final String startFormat, final String preconName) {
|
||||
final String startFormat, final String preconName, final boolean persist) {
|
||||
|
||||
this.load(new QuestData(name, diff, mode));
|
||||
if (persist && startPool == QuestStartPool.Rotating) {
|
||||
this.load(new QuestData(name, diff, mode, startFormat));
|
||||
} else {
|
||||
this.load(new QuestData(name, diff, mode, null));
|
||||
}
|
||||
|
||||
final Predicate<CardPrinted> filter;
|
||||
switch (startPool) {
|
||||
|
||||
@@ -20,8 +20,11 @@ package forge.quest;
|
||||
import forge.Singletons;
|
||||
import forge.card.BoosterGenerator;
|
||||
import forge.card.CardEdition;
|
||||
import forge.card.CardRules;
|
||||
import forge.card.CardRulesPredicates;
|
||||
import forge.card.FormatCollection;
|
||||
import forge.deck.Deck;
|
||||
import forge.game.GameFormatQuest;
|
||||
import forge.item.*;
|
||||
import forge.quest.bazaar.QuestItemType;
|
||||
import forge.quest.data.QuestAssets;
|
||||
@@ -145,7 +148,12 @@ public final class QuestUtilCards {
|
||||
* @return the card printed
|
||||
*/
|
||||
public CardPrinted addRandomRare() {
|
||||
final CardPrinted card = Aggregates.random(Iterables.filter(CardDb.instance().getAllCards(), QuestUtilCards.RARE_PREDICATE));
|
||||
Predicate<CardPrinted> myFilter = QuestUtilCards.RARE_PREDICATE;
|
||||
|
||||
if (qc.getFormat() != null) {
|
||||
myFilter = Predicates.and(QuestUtilCards.RARE_PREDICATE, qc.getFormat().getFilterPrinted());
|
||||
}
|
||||
final CardPrinted card = Aggregates.random(Iterables.filter(CardDb.instance().getAllCards(), myFilter));
|
||||
this.addSingleCard(card);
|
||||
return card;
|
||||
}
|
||||
@@ -158,7 +166,13 @@ public final class QuestUtilCards {
|
||||
* @return the list
|
||||
*/
|
||||
public List<CardPrinted> addRandomRare(final int n) {
|
||||
final List<CardPrinted> newCards = Aggregates.random(Iterables.filter(CardDb.instance().getAllCards(), QuestUtilCards.RARE_PREDICATE), n);
|
||||
Predicate<CardPrinted> myFilter = QuestUtilCards.RARE_PREDICATE;
|
||||
|
||||
if (qc.getFormat() != null) {
|
||||
myFilter = Predicates.and(QuestUtilCards.RARE_PREDICATE, qc.getFormat().getFilterPrinted());
|
||||
}
|
||||
|
||||
final List<CardPrinted> newCards = Aggregates.random(Iterables.filter(CardDb.instance().getAllCards(), myFilter), n);
|
||||
this.addAllCards(newCards);
|
||||
return newCards;
|
||||
}
|
||||
@@ -338,6 +352,17 @@ public final class QuestUtilCards {
|
||||
private final Predicate<CardEdition> filterNotExt = Predicates.and(CardEdition.Predicates.CAN_MAKE_BOOSTER,
|
||||
Predicates.not(this.filterExt));
|
||||
|
||||
/**
|
||||
* Helper predicate for shops: is legal in quest format.
|
||||
*
|
||||
* @param qFormat
|
||||
* the quest format
|
||||
* @return the predicate
|
||||
*/
|
||||
public static Predicate<CardEdition> isLegalInQuestFormat(final GameFormatQuest qFormat) {
|
||||
return CardEdition.Predicates.isLegalInFormatQuest(qFormat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate boosters in shop.
|
||||
*
|
||||
@@ -347,8 +372,11 @@ public final class QuestUtilCards {
|
||||
public void generateBoostersInShop(final int count) {
|
||||
for (int i = 0; i < count; i++) {
|
||||
final int rollD100 = MyRandom.getRandom().nextInt(100);
|
||||
final Predicate<CardEdition> filter = rollD100 < 40 ? this.filterT2booster
|
||||
Predicate<CardEdition> filter = rollD100 < 40 ? this.filterT2booster
|
||||
: (rollD100 < 75 ? this.filterExtButT2 : this.filterNotExt);
|
||||
if (qc.getFormat() != null) {
|
||||
filter = isLegalInQuestFormat(qc.getFormat());
|
||||
}
|
||||
Iterable<CardEdition> rightEditions = Iterables.filter(Singletons.getModel().getEditions(), filter);
|
||||
this.qa.getShopList().add(BoosterPack.FN_FROM_SET.apply(Aggregates.random(rightEditions)));
|
||||
}
|
||||
@@ -361,12 +389,26 @@ public final class QuestUtilCards {
|
||||
* the count
|
||||
*/
|
||||
public void generateTournamentsInShop(final int count) {
|
||||
Iterable<CardEdition> rightEditions = Iterables.filter(Singletons.getModel().getEditions(), CardEdition.Predicates.HAS_TOURNAMENT_PACK);
|
||||
Predicate<CardEdition> formatFilter = CardEdition.Predicates.HAS_TOURNAMENT_PACK;
|
||||
if (qc.getFormat() != null) {
|
||||
formatFilter = Predicates.and(formatFilter, isLegalInQuestFormat(qc.getFormat()));
|
||||
}
|
||||
Iterable<CardEdition> rightEditions = Iterables.filter(Singletons.getModel().getEditions(), formatFilter);
|
||||
this.qa.getShopList().addAllFlat(Aggregates.random(Iterables.transform(rightEditions, TournamentPack.FN_FROM_SET), count));
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate precons in shop.
|
||||
*
|
||||
* @param count
|
||||
* the count
|
||||
*/
|
||||
public void generateFatPacksInShop(final int count) {
|
||||
Iterable<CardEdition> rightEditions = Iterables.filter(Singletons.getModel().getEditions(), CardEdition.Predicates.HAS_FAT_PACK);
|
||||
Predicate<CardEdition> formatFilter = CardEdition.Predicates.HAS_FAT_PACK;
|
||||
if (qc.getFormat() != null) {
|
||||
formatFilter = Predicates.and(formatFilter, isLegalInQuestFormat(qc.getFormat()));
|
||||
}
|
||||
Iterable<CardEdition> rightEditions = Iterables.filter(Singletons.getModel().getEditions(), formatFilter);
|
||||
this.qa.getShopList().addAllFlat(Aggregates.random(Iterables.transform(rightEditions, FatPack.FN_FROM_SET), count));
|
||||
}
|
||||
|
||||
@@ -390,7 +432,15 @@ public final class QuestUtilCards {
|
||||
* Generate cards in shop.
|
||||
*/
|
||||
public void generateCardsInShop() {
|
||||
final BoosterGenerator pack = new BoosterGenerator(CardDb.instance().getAllCards());
|
||||
|
||||
Iterable<CardPrinted> cardList = null;
|
||||
if (qc.getFormat() == null) {
|
||||
cardList = CardDb.instance().getAllCards(); }
|
||||
else {
|
||||
cardList = Iterables.filter(CardDb.instance().getAllCards(), qc.getFormat().getFilterPrinted());
|
||||
}
|
||||
|
||||
final BoosterGenerator pack = new BoosterGenerator(cardList);
|
||||
|
||||
int nLevel = this.qc.getAchievements().getLevel();
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
package forge.quest.data;
|
||||
|
||||
import forge.Singletons;
|
||||
import forge.game.GameFormatQuest;
|
||||
import forge.quest.QuestMode;
|
||||
import forge.quest.io.QuestDataIO;
|
||||
|
||||
@@ -43,6 +45,7 @@ public final class QuestData {
|
||||
/** The version number. */
|
||||
private int versionNumber = QuestData.CURRENT_VERSION_NUMBER;
|
||||
|
||||
private GameFormatQuest format;
|
||||
private final String name;
|
||||
|
||||
// Quest mode - there should be an enum :(
|
||||
@@ -58,12 +61,22 @@ public final class QuestData {
|
||||
/**
|
||||
* Instantiates a new quest data.
|
||||
* @param mode2
|
||||
* quest mode
|
||||
* @param diff
|
||||
* achievement diff
|
||||
* @param name2
|
||||
* quest name
|
||||
* @param formatString
|
||||
* String, persistent format for the quest (null if none).
|
||||
*/
|
||||
public QuestData(String name2, int diff, QuestMode mode2) {
|
||||
public QuestData(String name2, int diff, QuestMode mode2, final String formatString) {
|
||||
this.name = name2;
|
||||
|
||||
if (formatString == null) {
|
||||
format = null;
|
||||
} else {
|
||||
format = new GameFormatQuest(Singletons.getModel().getFormats().getFormat(formatString));
|
||||
}
|
||||
this.mode = mode2;
|
||||
this.achievements = new QuestAchievements(diff);
|
||||
this.assets = new QuestAssets();
|
||||
@@ -78,6 +91,15 @@ public final class QuestData {
|
||||
return this.mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the persistent format, null if not assigned.
|
||||
*
|
||||
* @return GameFormatQuest, the persistent format
|
||||
*/
|
||||
public GameFormatQuest getFormat() {
|
||||
return this.format;
|
||||
}
|
||||
|
||||
|
||||
// SERIALIZATION - related things
|
||||
// This must be called by XML-serializer via reflection
|
||||
|
||||
@@ -57,6 +57,7 @@ import forge.card.CardEdition;
|
||||
import forge.deck.DeckSection;
|
||||
import forge.error.ErrorViewer;
|
||||
import forge.game.GameType;
|
||||
import forge.game.GameFormatQuest;
|
||||
import forge.item.BoosterPack;
|
||||
import forge.item.CardDb;
|
||||
import forge.item.CardPrinted;
|
||||
@@ -98,6 +99,7 @@ public class QuestDataIO {
|
||||
xStream.registerConverter(new ItemPoolToXml());
|
||||
xStream.registerConverter(new DeckSectionToXml());
|
||||
xStream.registerConverter(new GameTypeToXml());
|
||||
xStream.registerConverter(new GameFormatQuestToXml());
|
||||
xStream.registerConverter(new QuestModeToXml());
|
||||
xStream.autodetectAnnotations(true);
|
||||
xStream.alias("CardPool", ItemPool.class);
|
||||
@@ -351,7 +353,7 @@ public class QuestDataIO {
|
||||
|
||||
final File f = new File(ForgeProps.getFile(NewConstants.Quest.DATA_DIR), qd.getName());
|
||||
QuestDataIO.savePacked(f + ".dat", xStream, qd);
|
||||
//QuestDataIO.saveUnpacked(f + ".xml", xStream, qd);
|
||||
// QuestDataIO.saveUnpacked(f + ".xml", xStream, qd);
|
||||
|
||||
} catch (final Exception ex) {
|
||||
ErrorViewer.showError(ex, "Error saving Quest Data.");
|
||||
@@ -375,6 +377,58 @@ public class QuestDataIO {
|
||||
boutUnp.close();
|
||||
}
|
||||
|
||||
private static class GameFormatQuestToXml implements Converter {
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public boolean canConvert(final Class clasz) {
|
||||
return clasz.equals(GameFormatQuest.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void marshal(final Object source, final HierarchicalStreamWriter writer, final MarshallingContext context) {
|
||||
|
||||
writer.startNode("format");
|
||||
GameFormatQuest format = (GameFormatQuest) source;
|
||||
writer.addAttribute("name", format.getName());
|
||||
writer.endNode();
|
||||
|
||||
for (String set : format.getAllowedSetCodes()) {
|
||||
writer.startNode("set");
|
||||
writer.addAttribute("s", set);
|
||||
writer.endNode();
|
||||
}
|
||||
for (String ban : format.getBannedCardNames()) {
|
||||
writer.startNode("ban");
|
||||
writer.addAttribute("s", ban);
|
||||
writer.endNode();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object unmarshal(final HierarchicalStreamReader reader, final UnmarshallingContext context) {
|
||||
reader.moveDown();
|
||||
GameFormatQuest format = new GameFormatQuest(reader.getAttribute("name"));
|
||||
reader.moveUp();
|
||||
while (reader.hasMoreChildren()) {
|
||||
reader.moveDown();
|
||||
final String nodename = reader.getNodeName();
|
||||
if (nodename.equals("ban")) {
|
||||
String toBan = reader.getAttribute("s");
|
||||
format.addBannedCard(toBan);
|
||||
// System.out.println("Added + " + toBan + " to banned cards");
|
||||
}
|
||||
else if (nodename.equals("set")) {
|
||||
String toSets = reader.getAttribute("s");
|
||||
format.addAllowedSet(toSets);
|
||||
// System.out.println("Added + " + toSets + " to legal sets");
|
||||
}
|
||||
reader.moveUp();
|
||||
}
|
||||
format.updateFilters();
|
||||
return format;
|
||||
}
|
||||
}
|
||||
|
||||
private static class GameTypeToXml implements Converter {
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user