mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 20:28:00 +00:00
Enforce quest- and world's rules before starting a duel.
E.g. no Vintage cards allowed in player's deck while in Random Standard world.
This commit is contained in:
@@ -245,27 +245,65 @@ public class GameFormat implements Comparable<GameFormat> {
|
||||
}
|
||||
|
||||
private boolean isPoolLegal(final CardPool allCards) {
|
||||
for (Entry<PaperCard, Integer> poolEntry : allCards) {
|
||||
if (!filterRules.apply(poolEntry.getKey())) {
|
||||
return false; //all cards in deck must pass card predicate to pass deck predicate
|
||||
}
|
||||
}
|
||||
|
||||
if(!restrictedCardNames_ro.isEmpty() || restrictedLegendary ) {
|
||||
for (Entry<PaperCard, Integer> poolEntry : allCards) {
|
||||
if( poolEntry.getValue().intValue() > 1 && (restrictedCardNames_ro.contains(poolEntry.getKey().getName())
|
||||
|| (poolEntry.getKey().getRules().getType().isLegendary()
|
||||
&& !poolEntry.getKey().getRules().getType().isPlaneswalker() && restrictedLegendary)))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return getPoolLegalityProblem(allCards) == null;
|
||||
}
|
||||
|
||||
public boolean isDeckLegal(final Deck deck) {
|
||||
return isPoolLegal(deck.getAllCardsInASinglePool());
|
||||
}
|
||||
|
||||
private String getPoolLegalityProblem(final CardPool allCards) {
|
||||
// Check filter rules
|
||||
{
|
||||
final List<PaperCard> erroneousCI = new ArrayList<>();
|
||||
for (Entry<PaperCard, Integer> poolEntry : allCards) {
|
||||
if (!filterRules.apply(poolEntry.getKey())) {
|
||||
erroneousCI.add(poolEntry.getKey());
|
||||
}
|
||||
}
|
||||
if (erroneousCI.size() > 0) {
|
||||
final StringBuilder sb = new StringBuilder("contains the following illegal cards:\n");
|
||||
for (final PaperCard cp : erroneousCI) {
|
||||
sb.append("\n").append(cp.getName());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
// Check number of restricted and legendary-restricted cards
|
||||
if(!restrictedCardNames_ro.isEmpty() || restrictedLegendary ) {
|
||||
final List<PaperCard> erroneousRestricted = new ArrayList<>();
|
||||
for (Entry<PaperCard, Integer> poolEntry : allCards) {
|
||||
boolean isRestricted = restrictedCardNames_ro.contains(poolEntry.getKey().getName());
|
||||
boolean isLegendaryNonPlaneswalker = poolEntry.getKey().getRules().getType().isLegendary()
|
||||
&& !poolEntry.getKey().getRules().getType().isPlaneswalker() && restrictedLegendary;
|
||||
if( poolEntry.getValue() > 1 && (isRestricted || isLegendaryNonPlaneswalker)) {
|
||||
erroneousRestricted.add(poolEntry.getKey());
|
||||
}
|
||||
}
|
||||
if (erroneousRestricted.size() > 0) {
|
||||
final StringBuilder sb = new StringBuilder("contains more than one copy of the following restricted cards:\n");
|
||||
for (final PaperCard cp : erroneousRestricted) {
|
||||
sb.append("\n").append(cp.getName());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the conformance of a deck in this GameFormat.
|
||||
* Will check each card's set legality, and ensure no banned and max one of each restricted card exists.
|
||||
* @param deck The deck to analyse
|
||||
* @return An error string describing the errors and associated cards, or null if no errors
|
||||
*/
|
||||
public String getDeckConformanceProblem(final Deck deck) {
|
||||
if (deck == null) {
|
||||
return "is not selected";
|
||||
}
|
||||
return getPoolLegalityProblem(deck.getAllCardsInASinglePool());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name;
|
||||
|
||||
@@ -664,7 +664,7 @@ public class QuestUtil {
|
||||
}
|
||||
|
||||
if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) {
|
||||
final String errorMessage = getDeckConformanceProblems(deck);
|
||||
final String errorMessage = getDeckConformanceProblemsBeforeGame(deck);
|
||||
if (null != errorMessage) {
|
||||
SOptionPane.showErrorDialog(localizer.getMessage("lblInvalidDeckDesc").replace("%n",errorMessage), "Invalid Deck");
|
||||
return false;
|
||||
@@ -674,9 +674,15 @@ public class QuestUtil {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static String getDeckConformanceProblems(Deck deck){
|
||||
public static String getDeckConformanceProblemsBeforeGame(Deck deck){
|
||||
// Challenges with fixed decks override conformance settings
|
||||
if(event instanceof QuestEventChallenge && ((QuestEventChallenge) event).getHumanDeck() != null)
|
||||
return null;
|
||||
|
||||
//Check quest mode's generic deck construction rules: minimum cards in deck, sideboard etc
|
||||
String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);
|
||||
|
||||
//Check the quest mode's generic deck construction rules: minimum cards in deck, sideboard etc
|
||||
if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements
|
||||
|
||||
//Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum
|
||||
@@ -685,6 +691,11 @@ public class QuestUtil {
|
||||
errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck);
|
||||
break;
|
||||
}
|
||||
if(errorMessage != null) return errorMessage;
|
||||
|
||||
//Check for this quest- and World's deck construction rules: allowed sets, banned/restricted cards etc
|
||||
if(FModel.getQuest().getFormat() != null)
|
||||
errorMessage = FModel.getQuest().getFormat().getDeckConformanceProblem(deck);
|
||||
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user