Basic groundwork for extra decks (contraptions, attractions) (#10378)

* extra deck cards not counted in deck size

* extra deck handling in deckbuilder

* move responsibility for extraDeckCard boolean to CardImpl

* remove redundant field copy
This commit is contained in:
Artemis Kearney 2023-08-06 20:06:32 -05:00 committed by GitHub
parent 978ebfc873
commit 9ba0da00ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 97 additions and 47 deletions

View file

@ -186,11 +186,11 @@ public abstract class AbstractCommander extends Constructed {
valid = false;
}
if (companion != null && deck.getCards().size() + deck.getSideboard().size() != 101) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 101 + " cards (companion doesn't count for deck size): has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
if (companion != null && deck.getMaindeckCards().size() + deck.getSideboard().size() != 101) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 101 + " cards (companion doesn't count for deck size): has " + (deck.getMaindeckCards().size() + deck.getSideboard().size()) + " cards");
valid = false;
} else if (companion == null && deck.getCards().size() + deck.getSideboard().size() != 100) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 100 + " cards: has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
} else if (companion == null && deck.getMaindeckCards().size() + deck.getSideboard().size() != 100) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 100 + " cards: has " + (deck.getMaindeckCards().size() + deck.getSideboard().size()) + " cards");
valid = false;
}

View file

@ -103,8 +103,8 @@ public class AusHighlander extends Constructed {
boolean valid = true;
errorsList.clear();
if (deck.getCards().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " singleton cards: has " + (deck.getCards().size()) + " cards");
if (deck.getMaindeckCards().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " singleton cards: has " + (deck.getMaindeckCards().size()) + " cards");
valid = false;
}
if (deck.getSideboard().size() > 15) {

View file

@ -89,11 +89,11 @@ public class Brawl extends Constructed {
}
}
if (companion != null && deck.getCards().size() + deck.getSideboard().size() != getDeckMinSize() + 1) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + (getDeckMinSize() + 1) + " cards (companion doesn't count in deck size requirement): has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
if (companion != null && deck.getMaindeckCards().size() + deck.getSideboard().size() != getDeckMinSize() + 1) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + (getDeckMinSize() + 1) + " cards (companion doesn't count in deck size requirement): has " + (deck.getMaindeckCards().size() + deck.getSideboard().size()) + " cards");
valid = false;
} else if (companion == null && deck.getCards().size() + deck.getSideboard().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " cards: has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
} else if (companion == null && deck.getMaindeckCards().size() + deck.getSideboard().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " cards: has " + (deck.getMaindeckCards().size() + deck.getSideboard().size()) + " cards");
valid = false;
}

View file

@ -73,8 +73,8 @@ public class CanadianHighlander extends Constructed {
boolean valid = true;
errorsList.clear();
if (deck.getCards().size() < 100) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain 100 or more singleton cards: has " + (deck.getCards().size()) + " cards");
if (deck.getMaindeckCards().size() < 100) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain 100 or more singleton cards: has " + (deck.getMaindeckCards().size()) + " cards");
valid = false;
}

View file

@ -78,8 +78,8 @@ public class EuropeanHighlander extends Constructed {
// Parent class checks the banned list
boolean valid = super.validate(deck);
if (deck.getCards().size() < 100) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain 100 or more singleton cards: has " + (deck.getCards().size()) + " cards");
if (deck.getMaindeckCards().size() < 100) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain 100 or more singleton cards: has " + (deck.getMaindeckCards().size()) + " cards");
valid = false;
}

View file

@ -32,8 +32,8 @@ public class Freeform extends DeckValidator {
boolean valid = true;
errorsList.clear();
// http://magic.wizards.com/en/gameinfo/gameplay/formats/freeform
if (deck.getCards().size() < getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain at least " + getDeckMinSize() + " cards: has only " + deck.getCards().size() + " cards");
if (deck.getMaindeckCards().size() < getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain at least " + getDeckMinSize() + " cards: has only " + deck.getMaindeckCards().size() + " cards");
valid = false;
}
return valid;

View file

@ -33,8 +33,8 @@ public class Momir extends DeckValidator {
boolean valid = true;
errorsList.clear();
if (deck.getCards().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " cards: has " + deck.getCards().size() + " cards");
if (deck.getMaindeckCards().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " cards: has " + deck.getMaindeckCards().size() + " cards");
valid = false;
}

View file

@ -84,8 +84,8 @@ public class Oathbreaker extends Constructed {
boolean valid = true;
errorsList.clear();
if (deck.getCards().size() + deck.getSideboard().size() != 60) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 60 + " cards: has " + (deck.getCards().size() + deck.getSideboard().size()) + " cards");
if (deck.getMaindeckCards().size() + deck.getSideboard().size() != 60) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + 60 + " cards: has " + (deck.getMaindeckCards().size() + deck.getSideboard().size()) + " cards");
valid = false;
}

View file

@ -105,8 +105,8 @@ public class TinyLeaders extends Constructed {
boolean valid = true;
errorsList.clear();
if (deck.getCards().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " cards: has " + deck.getCards().size() + " cards");
if (deck.getMaindeckCards().size() != getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain " + getDeckMinSize() + " cards: has " + deck.getMaindeckCards().size() + " cards");
valid = false;
}

View file

@ -31,8 +31,8 @@ public class Limited extends DeckValidator {
boolean valid = true;
errorsList.clear();
//20091005 - 100.2b
if (deck.getCards().size() < getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain at least " + getDeckMinSize() + " cards: has only " + deck.getCards().size() + " cards");
if (deck.getMaindeckCards().size() < getDeckMinSize()) {
addError(DeckValidatorErrorType.DECK_SIZE, "Deck", "Must contain at least " + getDeckMinSize() + " cards: has only " + deck.getMaindeckCards().size() + " cards");
valid = false;
}
Map<String, Integer> counts = new HashMap<>();

View file

@ -2257,7 +2257,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
List<Card> sortedCards = new ArrayList<>(cardPool);
if (!sortedCards.isEmpty()) {
while (deck.getCards().size() < DECK_SIZE) {
while (deck.getMaindeckCards().size() < DECK_SIZE) {
deck.getCards().add(sortedCards.get(RandomUtil.nextInt(sortedCards.size())));
}
return deck;
@ -2287,7 +2287,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
// get top cards
int cardNum = 0;
while (deck.getCards().size() < DECK_CARDS_COUNT && sortedCards.size() > cardNum) {
while (deck.getMaindeckCards().size() < DECK_CARDS_COUNT && sortedCards.size() > cardNum) {
Card card = sortedCards.get(cardNum);
if (!card.isBasic()) {
deck.getCards().add(card);
@ -2349,7 +2349,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
}
// adds remaining lands (most popular name)
addBasicLands(deck, mostLandName, DECK_SIZE - deck.getCards().size());
addBasicLands(deck, mostLandName, DECK_SIZE - deck.getMaindeckCards().size());
return deck;
}
@ -2359,7 +2359,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
DeckValidator deckValidator = DeckValidatorFactory.instance.createDeckValidator(tournament.getOptions().getMatchOptions().getDeckType());
int deckMinSize = deckValidator != null ? deckValidator.getDeckMinSize() : 0;
if (deck != null && deck.getCards().size() < deckMinSize && !deck.getSideboard().isEmpty()) {
if (deck != null && deck.getMaindeckCards().size() < deckMinSize && !deck.getSideboard().isEmpty()) {
if (chosenColors == null) {
for (Card card : deck.getSideboard()) {
rememberPick(card, RateCard.rateCard(card, null));