Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions forge-core/src/main/java/forge/card/CardEdition.java
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,23 @@ public enum FoilType {
MODERN // 8th Edition and newer
}

/** The draft-mode variant for this edition (e.g. Normal limited or Commander draft). */
public enum DraftType {
Normal,
Commander;

public static DraftType fromString(String value) {
if (value == null || value.isEmpty()) {
return Normal;
}
try {
return DraftType.valueOf(value);
} catch (IllegalArgumentException e) {
return Normal;
}
}
}

public enum BorderColor {
WHITE,
BLACK,
Expand Down Expand Up @@ -301,6 +318,7 @@ public String getFunctionalVariantName() {

// Draft options
private DraftOptions draftOptions = null;
private DraftType draftType = DraftType.Normal;
private String[] chaosDraftThemes = new String[0];

private final ListMultimap<String, EditionEntry> cardMap;
Expand Down Expand Up @@ -388,6 +406,7 @@ private static Date parseDate(String date) {
public String getSheetReplaceCardFromSheet() { return sheetReplaceCardFromSheet; }
public String getSheetReplaceCardFromSheet2() { return sheetReplaceCardFromSheet2; }
public String[] getChaosDraftThemes() { return chaosDraftThemes; }
public DraftType getDraftType() { return draftType; }

public List<EditionEntry> getCards() { return cardMap.get(EditionSectionWithCollectorNumbers.CARDS.getName()); }
public List<EditionEntry> getRebalancedCards() { return cardMap.get(EditionSectionWithCollectorNumbers.REBALANCED.getName()); }
Expand Down Expand Up @@ -840,6 +859,9 @@ protected CardEdition read(File file) {
res.borderColor = BorderColor.valueOf(metadata.get("border", "Black").toUpperCase(Locale.ENGLISH));
res.prerelease = metadata.get("Prerelease", null);

// DraftType: governs the deck-building mode for this edition's draft (e.g. Normal or Commander)
res.draftType = DraftType.fromString(metadata.get("DraftType", "Normal"));

// Draft options
String doublePick = metadata.get("DoublePick", "Never");
int maxPodSize = metadata.getInt("MaxPodSize", 8);
Expand Down
14 changes: 14 additions & 0 deletions forge-core/src/main/java/forge/card/CardRules.java
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,20 @@ public boolean canBeCommander() {
return false;
}

public boolean canBePartnerCommanders(CardRules b, boolean commanderDraft) {
if (commanderDraft) {
if (!canBeBackground() && !canBeCommander()) {
return false;
}

if (this.getColorIdentity().countColors() <= 1 && b.getColorIdentity().countColors() <= 1) {
return true;
}
}

return canBePartnerCommanders(b);
}

public boolean canBePartnerCommanders(CardRules b) {
if (!(canBePartnerCommander() && b.canBePartnerCommander())) {
return false;
Expand Down
3 changes: 2 additions & 1 deletion forge-core/src/main/java/forge/deck/DeckFormat.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public int getExtraSectionMaxCopies(DeckSection section) {
Commander ( Range.is(99), Range.of(0, 10), 1, null,
card -> StaticData.instance().getCommanderPredicate().test(card)
),
CommanderDraft ( Range.of(59, 99), Range.of(0, 15), 4),
Oathbreaker ( Range.is(58), Range.of(0, 10), 1, null,
card -> StaticData.instance().getOathbreakerPredicate().test(card)
),
Expand Down Expand Up @@ -157,7 +158,7 @@ public boolean allowCustomCards() {
}

public boolean hasCommander() {
return this == Commander || this == Oathbreaker || this == TinyLeaders || this == Brawl;
return this == Commander || this == CommanderDraft || this == Oathbreaker || this == TinyLeaders || this == Brawl;
}

public boolean hasSignatureSpell() {
Expand Down
3 changes: 2 additions & 1 deletion forge-game/src/main/java/forge/game/GameType.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public enum GameType {

Sealed (DeckFormat.Limited, true, true, true, "lblSealed", ""),
Draft (DeckFormat.Limited, true, true, true, "lblDraft", ""),
CommanderDraft (DeckFormat.CommanderDraft, true, true, true, "lblCommanderDraft", "lblCommanderDraftDesc"),
Winston (DeckFormat.Limited, true, true, true, "lblWinston", ""),
Gauntlet (DeckFormat.Constructed, false, true, true, "lblGauntlet", ""),
Tournament (DeckFormat.Constructed, false, true, true, "lblTournament", ""),
Expand Down Expand Up @@ -70,7 +71,7 @@ public enum GameType {
return deck;
});

private static final EnumSet<GameType> DRAFT_FORMATS = EnumSet.of(Draft, QuestDraft, AdventureEvent);
private static final EnumSet<GameType> DRAFT_FORMATS = EnumSet.of(Draft, CommanderDraft, QuestDraft, AdventureEvent);

private final DeckFormat deckFormat;
private final boolean isCardPoolLimited, canSideboard, addWonCardsMidGame;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@
import forge.model.FModel;
import forge.screens.deckeditor.CDeckEditorUI;
import forge.screens.deckeditor.SEditorIO;
import forge.deck.DeckSection;
import forge.screens.deckeditor.controllers.ACEditorBase;
import forge.screens.deckeditor.controllers.CEditorCommanderDraftLimited;
import forge.screens.deckeditor.controllers.CEditorConstructed;
import forge.screens.deckeditor.controllers.CEditorLimited;
import forge.screens.deckeditor.controllers.CEditorQuest;
Expand Down Expand Up @@ -366,7 +368,13 @@ public void editDeck(final DeckProxy deck) {
break;
case Draft:
screen = FScreen.DECK_EDITOR_DRAFT;
editorCtrl = new CEditorLimited<>(FModel.getDecks().getDraft(), DeckGroup::new, screen, getCDetailPicture());
if (deck != null && (deck.getDeck().getTags().contains("CommanderDraft")
|| deck.getDeck().has(DeckSection.Commander))) {
editorCtrl = new CEditorCommanderDraftLimited(FModel.getDecks().getDraft(),
screen, getCDetailPicture(), null);
} else {
editorCtrl = new CEditorLimited<>(FModel.getDecks().getDraft(), DeckGroup::new, screen, getCDetailPicture());
}
break;
case Winston:
screen = FScreen.DECK_EDITOR_DRAFT;
Expand Down
Loading
Loading