Merge branch 'quest-pool-nonpromo' into 'master'

Exclude promos from Quest Mode starting pool and random reward pool

See merge request core-developers/forge!4196
This commit is contained in:
Michael Kamensky
2021-03-15 03:37:26 +00:00
13 changed files with 66 additions and 20 deletions

View File

@@ -18,18 +18,12 @@
package forge.card;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimaps;
import com.google.common.collect.*;
import forge.card.CardEdition.CardInSet;
import forge.card.CardEdition.Type;
import forge.deck.generation.IDeckGenPool;
import forge.item.PaperCard;
import forge.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
@@ -547,6 +541,15 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
return roAllCards;
}
public Collection<PaperCard> getAllNonPromoCards() {
return Lists.newArrayList(Iterables.filter(this.roAllCards, new Predicate<PaperCard>() {
@Override
public boolean apply(final PaperCard paperCard) {
return editions.getEditionByCodeOrThrow(paperCard.getEdition()).getType() != Type.PROMOS;
}
}));
}
public String getName(final String cardName) {
if (alternateName.containsKey(cardName)) {
return alternateName.get(cardName);

View File

@@ -221,6 +221,8 @@ public enum VSubmenuQuestPrefs implements IVSubmenu<CSubmenuQuestPrefs> {
pnlRewards.add(new PrefInput(QPref.REWARDS_TURN1, QuestPreferencesErrType.REWARDS), fieldConstraints);
pnlRewards.add(new FLabel.Builder().text(localizer.getMessage("lblMaxLifeDiffBonus")).fontAlign(SwingConstants.RIGHT).build(), labelConstraints);
pnlRewards.add(new PrefInput(QPref.REWARDS_HEALTH_DIFF_MAX, QuestPreferencesErrType.REWARDS), fieldConstraints);
pnlRewards.add(new FLabel.Builder().text(localizer.getMessage("lblExcludePromosFromRewardPool")).fontAlign(SwingConstants.RIGHT).build(), labelConstraints);
pnlRewards.add(new PrefInput(QPref.EXCLUDE_PROMOS_FROM_POOL, QuestPreferencesErrType.REWARDS), fieldConstraints);
}
private void populateDifficulty() {
pnlDifficulty.setOpaque(false);

View File

@@ -70,6 +70,7 @@ public class QuestPrefsScreen extends FScreen {
scroller.add(new PrefsOption(localizer.getMessage("lblWinbyTurn10"), QPref.REWARDS_TURN10, PrefsGroup.REWARDS));
scroller.add(new PrefsOption(localizer.getMessage("lblWinbyTurn5"), QPref.REWARDS_TURN5, PrefsGroup.REWARDS));
scroller.add(new PrefsOption(localizer.getMessage("lblFirstTurnWin"), QPref.REWARDS_TURN1, PrefsGroup.REWARDS));
scroller.add(new PrefsOption(localizer.getMessage("lblExcludePromosFromRewardPool"), QPref.EXCLUDE_PROMOS_FROM_POOL, PrefsGroup.REWARDS));
//Booster Pack Ratios
scroller.add(new PrefsHeader(localizer.getMessage("lblBoosterPackRatios"), FSkinImage.QUEST_BOOK, PrefsGroup.BOOSTER));

View File

@@ -2,4 +2,5 @@
Get in the discord if you aren't yet.
Planar Conquest now has a new plane accessible - Ikoria.
In Planar Conquest, it's now possible to collect C19 cards on Eldraine and ZNE/ZNC cards on Zendikar.
In Planar Conquest, the Eldraine plane now holds a little secret that's rather unhinged. It may be difficult to find though.
In Planar Conquest, the Eldraine plane now holds a little secret that's rather unhinged. It may be difficult to find though.
Quest Mode now has a preference option to enable or disable promos in random reward pool.

View File

@@ -701,6 +701,7 @@ lblWinbyTurn10=Sieg bis Zug 10
lblWinbyTurn5=Sieg bis Zug 5
lblFirstTurnWin=Sieg im ersten Zug
lblMaxLifeDiffBonus=Max. Lebensdifferenzbonus
lblExcludePromosFromRewardPool=Exclude Promos
lblEasy=Einfach
lblMedium=Mittel
lblHard=Hart

View File

@@ -701,6 +701,7 @@ lblWinbyTurn10=Win by Turn 10
lblWinbyTurn5=Win by Turn 5
lblFirstTurnWin=First Turn Win
lblMaxLifeDiffBonus=Max Life Diff. Bonus
lblExcludePromosFromRewardPool=Exclude Promos
lblEasy=Easy
lblMedium=Medium
lblHard=Hard

View File

@@ -701,6 +701,7 @@ lblWinbyTurn10=Victoria en el turno 10
lblWinbyTurn5=Victoria en el turno 5
lblFirstTurnWin=Victoria en el primer turno
lblMaxLifeDiffBonus=Bonus por máxima diferencia en vidas
lblExcludePromosFromRewardPool=Exclude Promos
lblEasy=Fácil
lblMedium=Medio
lblHard=Difícil

View File

@@ -701,6 +701,7 @@ lblWinbyTurn10=Vinci al turno 10
lblWinbyTurn5=Vinci al turno 5
lblFirstTurnWin=Primo turno Vinci
lblMaxLifeDiffBonus=Max Life Diff. indennità
lblExcludePromosFromRewardPool=Exclude Promos
lblEasy=Facile
lblMedium=medio
lblHard=Difficile

View File

@@ -701,6 +701,7 @@ lblWinbyTurn10=10ターン以内に勝利
lblWinbyTurn5=5ターン以内に勝利
lblFirstTurnWin=1ターン目に勝利
lblMaxLifeDiffBonus=ノーダメージ報酬
lblExcludePromosFromRewardPool=Exclude Promos
lblEasy=簡単
lblMedium=普通
lblHard=難しい

View File

@@ -701,6 +701,7 @@ lblWinbyTurn10=10回合内胜利
lblWinbyTurn5=5回合内胜利
lblFirstTurnWin=第一回合胜利
lblMaxLifeDiffBonus=最大生命值差。奖金
lblExcludePromosFromRewardPool=Exclude Promos
lblEasy=简单
lblMedium=中等
lblHard=

View File

@@ -115,7 +115,7 @@ public final class BoosterUtils {
filter = formatStartingPool.getFilterPrinted();
}
final List<PaperCard> cardPool = Lists.newArrayList(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), filter));
final List<PaperCard> cardPool = Lists.newArrayList(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllNonPromoCards(), filter));
if (userPrefs != null && userPrefs.grantCompleteSet()) {
for (PaperCard card : cardPool) {
@@ -478,7 +478,7 @@ public final class BoosterUtils {
PrintSheet ps = new PrintSheet("Quest rewards");
Predicate<PaperCard> predicate = preds.size() == 1 ? preds.get(0) : Predicates.and(preds);
ps.addAll(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), predicate));
ps.addAll(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllNonPromoCards(), predicate));
rewards.addAll(ps.random(qty, true));
} else if (temp.length == 2 && temp[0].equalsIgnoreCase("duplicate") && temp[1].equalsIgnoreCase("card")) {
// Type 2: a duplicate card of the players choice

View File

@@ -23,7 +23,10 @@ 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.card.CardEdition;
import forge.card.CardRarity;
import forge.card.ICardDatabase;
import forge.card.MagicColor;
import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.game.GameFormat;
@@ -44,7 +47,10 @@ import forge.util.ItemPool;
import forge.util.MyRandom;
import org.apache.commons.lang3.tuple.Pair;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
/**
@@ -215,10 +221,13 @@ public final class QuestUtilCards {
* @return the card printed
*/
public PaperCard addRandomRare() {
final boolean usePromos = questPreferences.getPrefInt(QPref.EXCLUDE_PROMOS_FROM_POOL) == 0;
final Collection<PaperCard> pool = usePromos ? FModel.getMagicDb().getCommonCards().getAllCards()
: FModel.getMagicDb().getCommonCards().getAllNonPromoCards();
final Predicate<PaperCard> myFilter = applyFormatFilter(QuestUtilCards.RARE_PREDICATE);
final PaperCard card = Aggregates.random(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), myFilter));
final PaperCard card = Aggregates.random(Iterables.filter(pool, myFilter));
addSingleCard(card, 1);
return card;
}
@@ -230,8 +239,12 @@ public final class QuestUtilCards {
* @return the list of cards added
*/
public List<PaperCard> addRandomCommon(final int n) {
final boolean usePromos = questPreferences.getPrefInt(QPref.EXCLUDE_PROMOS_FROM_POOL) == 0;
final Collection<PaperCard> pool = usePromos ? FModel.getMagicDb().getCommonCards().getAllCards()
: FModel.getMagicDb().getCommonCards().getAllNonPromoCards();
final Predicate<PaperCard> myFilter = applyFormatFilter(QuestUtilCards.COMMON_PREDICATE);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), myFilter), n);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(pool, myFilter), n);
addAllCards(newCards);
return newCards;
}
@@ -243,8 +256,12 @@ public final class QuestUtilCards {
* @return the list of cards added
*/
public List<PaperCard> addRandomUncommon(final int n) {
final boolean usePromos = questPreferences.getPrefInt(QPref.EXCLUDE_PROMOS_FROM_POOL) == 0;
final Collection<PaperCard> pool = usePromos ? FModel.getMagicDb().getCommonCards().getAllCards()
: FModel.getMagicDb().getCommonCards().getAllNonPromoCards();
final Predicate<PaperCard> myFilter = applyFormatFilter(QuestUtilCards.UNCOMMON_PREDICATE);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), myFilter), n);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(pool, myFilter), n);
addAllCards(newCards);
return newCards;
}
@@ -257,9 +274,13 @@ public final class QuestUtilCards {
* @return the list
*/
public List<PaperCard> addRandomRare(final int n) {
final boolean usePromos = questPreferences.getPrefInt(QPref.EXCLUDE_PROMOS_FROM_POOL) == 0;
final Collection<PaperCard> pool = usePromos ? FModel.getMagicDb().getCommonCards().getAllCards()
: FModel.getMagicDb().getCommonCards().getAllNonPromoCards();
final Predicate<PaperCard> myFilter = applyFormatFilter(QuestUtilCards.RARE_PREDICATE);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), myFilter), n);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(pool, myFilter), n);
addAllCards(newCards);
return newCards;
}
@@ -272,9 +293,13 @@ public final class QuestUtilCards {
* @return the list
*/
public List<PaperCard> addRandomRareNotMythic(final int n) {
final boolean usePromos = questPreferences.getPrefInt(QPref.EXCLUDE_PROMOS_FROM_POOL) == 0;
final Collection<PaperCard> pool = usePromos ? FModel.getMagicDb().getCommonCards().getAllCards()
: FModel.getMagicDb().getCommonCards().getAllNonPromoCards();
final Predicate<PaperCard> myFilter = applyFormatFilter(QuestUtilCards.ONLY_RARE_PREDICATE);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), myFilter), n);
final List<PaperCard> newCards = Aggregates.random(Iterables.filter(pool, myFilter), n);
addAllCards(newCards);
return newCards;
}
@@ -287,9 +312,13 @@ public final class QuestUtilCards {
* @return the list
*/
public List<PaperCard> addRandomMythicRare(final int n) {
final boolean usePromos = questPreferences.getPrefInt(QPref.EXCLUDE_PROMOS_FROM_POOL) == 0;
final Collection<PaperCard> pool = usePromos ? FModel.getMagicDb().getCommonCards().getAllCards()
: FModel.getMagicDb().getCommonCards().getAllNonPromoCards();
final Predicate<PaperCard> myFilter = applyFormatFilter(QuestUtilCards.MYTHIC_PREDICATE);
final Iterable<PaperCard> cardPool = Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), myFilter);
final Iterable<PaperCard> cardPool = Iterables.filter(pool, myFilter);
if (!cardPool.iterator().hasNext()) {
return null;

View File

@@ -177,7 +177,7 @@ public class QuestPreferences extends PreferencesStore<QuestPreferences.QPref> i
WILD_OPPONENTS_MULTIPLIER("2.0"),
WILD_OPPONENTS_NUMBER("0"),
//The number of cards to keep before selling
// The number of cards to keep before selling
PLAYSET_SIZE("4"),
PLAYSET_ANY_NUMBER_SIZE("500"),
PLAYSET_BASIC_LAND_SIZE("50"),
@@ -187,7 +187,10 @@ public class QuestPreferences extends PreferencesStore<QuestPreferences.QPref> i
SIMULATE_AI_VS_AI_RESULTS("0"),
DRAFT_ROTATION("0"),
FOIL_FILTER_DEFAULT("0"),
RATING_FILTER_DEFAULT("1");
RATING_FILTER_DEFAULT("1"),
// Exclude promos from the random reward pool
EXCLUDE_PROMOS_FROM_POOL("1");
private final String strDefaultVal;
@@ -295,6 +298,7 @@ public class QuestPreferences extends PreferencesStore<QuestPreferences.QPref> i
case FOIL_FILTER_DEFAULT:
case RATING_FILTER_DEFAULT:
case ITEM_LEVEL_RESTRICTION:
case EXCLUDE_PROMOS_FROM_POOL:
if (val != 0 && val != 1) {
return "Only values 0 or 1 are acceptable; 1 for enabled, 0 for disabled.";
}