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:
Robbatog
2022-11-03 15:20:51 +01:00
parent 53d6facd65
commit da2e66b624
2 changed files with 66 additions and 17 deletions

View File

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

View File

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