mirror of
https://github.com/correl/mage.git
synced 2024-12-25 11:11:16 +00:00
Merge pull request #7499 from spjspj/master
Adding in Jumpstart Elimination Custom Tournament option. Creator of the table will be able to upload a Jumpstart Pack text file that uses the same format as here: https://github.com/magefree/mage/blob/master/Mage/src/main/resources/jumpstart/jumpstart.txt
This commit is contained in:
commit
7d267061d9
9 changed files with 238 additions and 86 deletions
|
@ -1,5 +1,13 @@
|
||||||
package mage.client.dialog;
|
package mage.client.dialog;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import javax.swing.*;
|
||||||
import mage.cards.decks.Deck;
|
import mage.cards.decks.Deck;
|
||||||
import mage.cards.decks.DeckFileFilter;
|
import mage.cards.decks.DeckFileFilter;
|
||||||
import mage.cards.decks.importer.DeckImporter;
|
import mage.cards.decks.importer.DeckImporter;
|
||||||
|
@ -26,13 +34,6 @@ import mage.view.TableView;
|
||||||
import mage.view.TournamentTypeView;
|
import mage.view.TournamentTypeView;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import javax.swing.*;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* App GUI: create new TOURNEY
|
* App GUI: create new TOURNEY
|
||||||
*
|
*
|
||||||
|
@ -55,6 +56,7 @@ public class NewTournamentDialog extends MageDialog {
|
||||||
private boolean isRandom = false;
|
private boolean isRandom = false;
|
||||||
private boolean isRichMan = false;
|
private boolean isRichMan = false;
|
||||||
private String cubeFromDeckFilename = "";
|
private String cubeFromDeckFilename = "";
|
||||||
|
private String jumpstartPacksFilename = "";
|
||||||
private boolean automaticChange = false;
|
private boolean automaticChange = false;
|
||||||
|
|
||||||
public NewTournamentDialog() {
|
public NewTournamentDialog() {
|
||||||
|
@ -659,6 +661,12 @@ public class NewTournamentDialog extends MageDialog {
|
||||||
|
|
||||||
private void cbTournamentTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbTournamentTypeActionPerformed
|
private void cbTournamentTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbTournamentTypeActionPerformed
|
||||||
prepareTourneyView((Integer) this.spnNumPlayers.getValue());
|
prepareTourneyView((Integer) this.spnNumPlayers.getValue());
|
||||||
|
|
||||||
|
jumpstartPacksFilename = "";
|
||||||
|
if (cbTournamentType.getSelectedItem().toString().matches(".*Jumpstart.*Custom.*")) {
|
||||||
|
jumpstartPacksFilename = playerLoadJumpstartPacks();
|
||||||
|
}
|
||||||
|
|
||||||
}//GEN-LAST:event_cbTournamentTypeActionPerformed
|
}//GEN-LAST:event_cbTournamentTypeActionPerformed
|
||||||
|
|
||||||
private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed
|
private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed
|
||||||
|
@ -777,6 +785,26 @@ public class NewTournamentDialog extends MageDialog {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private JFileChooser fcJumpstartSelectDeck = null;
|
||||||
|
|
||||||
|
protected String playerLoadJumpstartPacks() {
|
||||||
|
if (fcJumpstartSelectDeck == null) {
|
||||||
|
fcJumpstartSelectDeck = new JFileChooser();
|
||||||
|
fcJumpstartSelectDeck.setAcceptAllFileFilterUsed(false);
|
||||||
|
fcJumpstartSelectDeck.addChoosableFileFilter(new DeckFileFilter("txt", "Jumpstart Packs (*.txt)"));
|
||||||
|
}
|
||||||
|
String lastFolder = MageFrame.getPreferences().get("lastDeckFolder", "");
|
||||||
|
if (!lastFolder.isEmpty()) {
|
||||||
|
fcJumpstartSelectDeck.setCurrentDirectory(new File(lastFolder));
|
||||||
|
}
|
||||||
|
int ret = fcJumpstartSelectDeck.showDialog(this, "Select Jumpstart Packs file");
|
||||||
|
if (ret == JFileChooser.APPROVE_OPTION) {
|
||||||
|
File file = fcJumpstartSelectDeck.getSelectedFile();
|
||||||
|
return (file.getPath());
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
private void cbDraftCubeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDraftCubeActionPerformed
|
private void cbDraftCubeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbDraftCubeActionPerformed
|
||||||
cubeFromDeckFilename = "";
|
cubeFromDeckFilename = "";
|
||||||
if (cbDraftCube.getSelectedItem().toString().equals("Cube From Deck")) {
|
if (cbDraftCube.getSelectedItem().toString().equals("Cube From Deck")) {
|
||||||
|
@ -951,7 +979,7 @@ public class NewTournamentDialog extends MageDialog {
|
||||||
|
|
||||||
private void loadRandomPacks(int version) {
|
private void loadRandomPacks(int version) {
|
||||||
String versionStr = prepareVersionStr(version, false);
|
String versionStr = prepareVersionStr(version, false);
|
||||||
List<String> packList;
|
java.util.List<String> packList;
|
||||||
String packNames;
|
String packNames;
|
||||||
String randomPrefs = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_RANDOM_DRAFT + versionStr, "");
|
String randomPrefs = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_RANDOM_DRAFT + versionStr, "");
|
||||||
if (!randomPrefs.isEmpty()) {
|
if (!randomPrefs.isEmpty()) {
|
||||||
|
@ -1202,6 +1230,22 @@ public class NewTournamentDialog extends MageDialog {
|
||||||
tOptions.getLimitedOptions().setIsRandom(tournamentType.isRandom());
|
tOptions.getLimitedOptions().setIsRandom(tournamentType.isRandom());
|
||||||
tOptions.getLimitedOptions().setIsRichMan(tournamentType.isRichMan());
|
tOptions.getLimitedOptions().setIsRichMan(tournamentType.isRichMan());
|
||||||
tOptions.getLimitedOptions().setIsJumpstart(tournamentType.isJumpstart());
|
tOptions.getLimitedOptions().setIsJumpstart(tournamentType.isJumpstart());
|
||||||
|
|
||||||
|
if (tournamentType.isJumpstart()) {
|
||||||
|
if (!(jumpstartPacksFilename.isEmpty())) {
|
||||||
|
String jumpstartPacksData = "";
|
||||||
|
try {
|
||||||
|
jumpstartPacksData = new String(Files.readAllBytes(Paths.get(jumpstartPacksFilename)));
|
||||||
|
if (jumpstartPacksData.length() > 300000) {
|
||||||
|
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Chosen file too big", "Jumpstart Packs data is too long. Please trim or choose another file.", JOptionPane.ERROR_MESSAGE);
|
||||||
|
jumpstartPacksData = "";
|
||||||
|
}
|
||||||
|
} catch (IOException e2) {
|
||||||
|
JOptionPane.showMessageDialog(MageFrame.getDesktop(), e2.getMessage(), "Error loading Jumpstart Packs data", JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
tOptions.getLimitedOptions().setJumpstartPacks(jumpstartPacksData);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (tournamentType.isCubeBooster()) {
|
if (tournamentType.isCubeBooster()) {
|
||||||
tOptions.getLimitedOptions().setDraftCubeName(this.cbDraftCube.getSelectedItem().toString());
|
tOptions.getLimitedOptions().setDraftCubeName(this.cbDraftCube.getSelectedItem().toString());
|
||||||
if (!(cubeFromDeckFilename.isEmpty())) {
|
if (!(cubeFromDeckFilename.isEmpty())) {
|
||||||
|
@ -1220,7 +1264,7 @@ public class NewTournamentDialog extends MageDialog {
|
||||||
this.isRandom = tournamentType.isRandom();
|
this.isRandom = tournamentType.isRandom();
|
||||||
this.isRichMan = tournamentType.isRichMan();
|
this.isRichMan = tournamentType.isRichMan();
|
||||||
tOptions.getLimitedOptions().getSetCodes().clear();
|
tOptions.getLimitedOptions().getSetCodes().clear();
|
||||||
List<String> selected = randomPackSelector.getSelectedPacks();
|
java.util.List<String> selected = randomPackSelector.getSelectedPacks();
|
||||||
Collections.shuffle(selected);
|
Collections.shuffle(selected);
|
||||||
int maxPacks = 3 * (players.size() + 1);
|
int maxPacks = 3 * (players.size() + 1);
|
||||||
if (tournamentType.isRichMan()) {
|
if (tournamentType.isRichMan()) {
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
|
||||||
|
package mage.tournament;
|
||||||
|
|
||||||
|
import mage.game.tournament.TournamentOptions;
|
||||||
|
import mage.game.tournament.TournamentSingleElimination;
|
||||||
|
|
||||||
|
public class JumpstartCustomEliminationTournament extends TournamentSingleElimination {
|
||||||
|
|
||||||
|
protected enum TournamentStep {
|
||||||
|
START, OPEN_BOOSTERS, CONSTRUCT, COMPETE, WINNERS
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TournamentStep currentStep;
|
||||||
|
|
||||||
|
public JumpstartCustomEliminationTournament(TournamentOptions options) {
|
||||||
|
super(options);
|
||||||
|
currentStep = TournamentStep.START;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void nextStep() {
|
||||||
|
switch (currentStep) {
|
||||||
|
case START:
|
||||||
|
currentStep = TournamentStep.OPEN_BOOSTERS;
|
||||||
|
openBoosters();
|
||||||
|
break;
|
||||||
|
case OPEN_BOOSTERS:
|
||||||
|
currentStep = TournamentStep.CONSTRUCT;
|
||||||
|
construct();
|
||||||
|
break;
|
||||||
|
case CONSTRUCT:
|
||||||
|
currentStep = TournamentStep.COMPETE;
|
||||||
|
runTournament();
|
||||||
|
break;
|
||||||
|
case COMPETE:
|
||||||
|
currentStep = TournamentStep.WINNERS;
|
||||||
|
winners();
|
||||||
|
end();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
|
||||||
|
package mage.tournament;
|
||||||
|
|
||||||
|
import mage.game.tournament.TournamentType;
|
||||||
|
|
||||||
|
public class JumpstartCustomEliminationTournamentType extends TournamentType {
|
||||||
|
|
||||||
|
public JumpstartCustomEliminationTournamentType() {
|
||||||
|
this.name = "Jumpstart Elimination (Custom)";
|
||||||
|
this.maxPlayers = 16;
|
||||||
|
this.minPlayers = 2;
|
||||||
|
this.numBoosters = 0;
|
||||||
|
this.isJumpstart = true;
|
||||||
|
this.elimination = true;
|
||||||
|
this.limited = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -95,7 +95,9 @@
|
||||||
<tournamentType name="Booster Draft Elimination" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftEliminationTournament" typeName="mage.tournament.BoosterDraftEliminationTournamentType"/>
|
<tournamentType name="Booster Draft Elimination" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftEliminationTournament" typeName="mage.tournament.BoosterDraftEliminationTournamentType"/>
|
||||||
<tournamentType name="Booster Draft Elimination (Cube)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftEliminationTournament" typeName="mage.tournament.BoosterDraftEliminationCubeTournamentType"/>
|
<tournamentType name="Booster Draft Elimination (Cube)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftEliminationTournament" typeName="mage.tournament.BoosterDraftEliminationCubeTournamentType"/>
|
||||||
<tournamentType name="Booster Draft Elimination (Random)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.RandomBoosterDraftEliminationTournament" typeName="mage.tournament.RandomBoosterDraftEliminationTournamentType"/>
|
<tournamentType name="Booster Draft Elimination (Random)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.RandomBoosterDraftEliminationTournament" typeName="mage.tournament.RandomBoosterDraftEliminationTournamentType"/>
|
||||||
|
|
||||||
<tournamentType name="Booster Draft Elimination (Rich Man)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.RichManDraftEliminationTournament" typeName="mage.tournament.RichManDraftEliminationTournamentType"/>
|
<tournamentType name="Booster Draft Elimination (Rich Man)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.RichManDraftEliminationTournament" typeName="mage.tournament.RichManDraftEliminationTournamentType"/>
|
||||||
|
|
||||||
<tournamentType name="Booster Draft Elimination (Rich Man Cube)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.RichManCubeDraftEliminationTournament" typeName="mage.tournament.RichManCubeDraftEliminationTournamentType"/>
|
<tournamentType name="Booster Draft Elimination (Rich Man Cube)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.RichManCubeDraftEliminationTournament" typeName="mage.tournament.RichManCubeDraftEliminationTournamentType"/>
|
||||||
<tournamentType name="Booster Draft Swiss" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftSwissTournament" typeName="mage.tournament.BoosterDraftSwissTournamentType"/>
|
<tournamentType name="Booster Draft Swiss" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftSwissTournament" typeName="mage.tournament.BoosterDraftSwissTournamentType"/>
|
||||||
<tournamentType name="Booster Draft Swiss (Cube)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftSwissTournament" typeName="mage.tournament.BoosterDraftSwissCubeTournamentType"/>
|
<tournamentType name="Booster Draft Swiss (Cube)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.BoosterDraftSwissTournament" typeName="mage.tournament.BoosterDraftSwissCubeTournamentType"/>
|
||||||
|
@ -106,6 +108,7 @@
|
||||||
<tournamentType name="Sealed Swiss (Cube)" jar="mage-tournament-sealed.jar" className="mage.tournament.SealedSwissTournament" typeName="mage.tournament.SealedSwissCubeTournamentType"/>
|
<tournamentType name="Sealed Swiss (Cube)" jar="mage-tournament-sealed.jar" className="mage.tournament.SealedSwissTournament" typeName="mage.tournament.SealedSwissCubeTournamentType"/>
|
||||||
<tournamentType name="Jumpstart Elimination" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartEliminationTournament" typeName="mage.tournament.JumpstartEliminationTournamentType"/>
|
<tournamentType name="Jumpstart Elimination" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartEliminationTournament" typeName="mage.tournament.JumpstartEliminationTournamentType"/>
|
||||||
<tournamentType name="Jumpstart Swiss" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartSwissTournament" typeName="mage.tournament.JumpstartSwissTournamentType"/>
|
<tournamentType name="Jumpstart Swiss" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartSwissTournament" typeName="mage.tournament.JumpstartSwissTournamentType"/>
|
||||||
|
<tournamentType name="Jumpstart Elimination (Custom)" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartCustomEliminationTournament" typeName="mage.tournament.JumpstartCustomEliminationTournamentType"/>
|
||||||
</tournamentTypes>
|
</tournamentTypes>
|
||||||
<draftCubes>
|
<draftCubes>
|
||||||
<draftCube name="Adam Styborski's Pauper Cube" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.AdamStyborskisPauperCube"/>
|
<draftCube name="Adam Styborski's Pauper Cube" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.AdamStyborskisPauperCube"/>
|
||||||
|
@ -206,4 +209,4 @@
|
||||||
<deckType name="Block Constructed Custom - Star Wars" jar="mage-deck-constructed.jar" className="mage.deck.StarWarsBlock"/>
|
<deckType name="Block Constructed Custom - Star Wars" jar="mage-deck-constructed.jar" className="mage.deck.StarWarsBlock"/>
|
||||||
<deckType name="Limited" jar="mage-deck-limited.jar" className="mage.deck.Limited"/>
|
<deckType name="Limited" jar="mage-deck-limited.jar" className="mage.deck.Limited"/>
|
||||||
</deckTypes>
|
</deckTypes>
|
||||||
</config>
|
</config>
|
||||||
|
|
|
@ -100,6 +100,7 @@
|
||||||
<tournamentType name="Sealed Swiss (Cube)" jar="mage-tournament-sealed-${project.version}.jar" className="mage.tournament.SealedSwissTournament" typeName="mage.tournament.SealedSwissCubeTournamentType"/>
|
<tournamentType name="Sealed Swiss (Cube)" jar="mage-tournament-sealed-${project.version}.jar" className="mage.tournament.SealedSwissTournament" typeName="mage.tournament.SealedSwissCubeTournamentType"/>
|
||||||
<tournamentType name="Jumpstart Elimination" jar="mage-tournament-sealed-${project.version}.jar" className="mage.tournament.JumpstartEliminationTournament" typeName="mage.tournament.JumpstartEliminationTournamentType"/>
|
<tournamentType name="Jumpstart Elimination" jar="mage-tournament-sealed-${project.version}.jar" className="mage.tournament.JumpstartEliminationTournament" typeName="mage.tournament.JumpstartEliminationTournamentType"/>
|
||||||
<tournamentType name="Jumpstart Swiss" jar="mage-tournament-sealed-${project.version}.jar" className="mage.tournament.JumpstartSwissTournament" typeName="mage.tournament.JumpstartSwissTournamentType"/>
|
<tournamentType name="Jumpstart Swiss" jar="mage-tournament-sealed-${project.version}.jar" className="mage.tournament.JumpstartSwissTournament" typeName="mage.tournament.JumpstartSwissTournamentType"/>
|
||||||
|
<tournamentType name="Jumpstart Elimination (Custom)" jar="mage-tournament-sealed-${project.version}.jar" className="mage.tournament.JumpstartEliminationCustomTournament" typeName="mage.tournament.JumpstartEliminationCustomTournamentType"/>
|
||||||
</tournamentTypes>
|
</tournamentTypes>
|
||||||
<draftCubes>
|
<draftCubes>
|
||||||
<draftCube name="Adam Styborski's Pauper Cube" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.AdamStyborskisPauperCube"/>
|
<draftCube name="Adam Styborski's Pauper Cube" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.AdamStyborskisPauperCube"/>
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
<tournamentType name="Sealed Swiss (Cube)" jar="mage-tournament-sealed.jar" className="mage.tournament.SealedSwissTournament" typeName="mage.tournament.SealedSwissCubeTournamentType"/>
|
<tournamentType name="Sealed Swiss (Cube)" jar="mage-tournament-sealed.jar" className="mage.tournament.SealedSwissTournament" typeName="mage.tournament.SealedSwissCubeTournamentType"/>
|
||||||
<tournamentType name="Jumpstart Elimination" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartEliminationTournament" typeName="mage.tournament.JumpstartEliminationTournamentType"/>
|
<tournamentType name="Jumpstart Elimination" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartEliminationTournament" typeName="mage.tournament.JumpstartEliminationTournamentType"/>
|
||||||
<tournamentType name="Jumpstart Swiss" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartSwissTournament" typeName="mage.tournament.JumpstartSwissTournamentType"/>
|
<tournamentType name="Jumpstart Swiss" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartSwissTournament" typeName="mage.tournament.JumpstartSwissTournamentType"/>
|
||||||
|
<tournamentType name="Jumpstart Elimination (Custom)" jar="mage-tournament-sealed.jar" className="mage.tournament.JumpstartCustomEliminationTournament" typeName="mage.tournament.JumpstartCustomEliminationTournamentType"/>
|
||||||
</tournamentTypes>
|
</tournamentTypes>
|
||||||
<draftCubes>
|
<draftCubes>
|
||||||
<draftCube name="Adam Styborski's Pauper Cube" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.AdamStyborskisPauperCube"/>
|
<draftCube name="Adam Styborski's Pauper Cube" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.AdamStyborskisPauperCube"/>
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package mage.game.jumpstart;
|
package mage.game.jumpstart;
|
||||||
|
|
||||||
|
import com.google.common.base.Charsets;
|
||||||
|
import com.google.common.io.CharSource;
|
||||||
|
import com.google.common.io.Resources;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UncheckedIOException;
|
import java.io.UncheckedIOException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
|
@ -7,11 +10,6 @@ import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.google.common.base.Charsets;
|
|
||||||
import com.google.common.io.CharSource;
|
|
||||||
import com.google.common.io.Resources;
|
|
||||||
|
|
||||||
import mage.cards.Card;
|
import mage.cards.Card;
|
||||||
import mage.cards.decks.Deck;
|
import mage.cards.decks.Deck;
|
||||||
import mage.cards.decks.DeckCardInfo;
|
import mage.cards.decks.DeckCardInfo;
|
||||||
|
@ -20,7 +18,7 @@ import mage.game.GameException;
|
||||||
|
|
||||||
public class JumpstartPoolGenerator {
|
public class JumpstartPoolGenerator {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "Jumpstart is a new way to play Magic that mashes together themes from throughout the history of the game and
|
* "Jumpstart is a new way to play Magic that mashes together themes from throughout the history of the game and
|
||||||
* lets you skip the deckbuilding part. Grab two boosters, shuffle them into a 40-card deck, and start playing.
|
* lets you skip the deckbuilding part. Grab two boosters, shuffle them into a 40-card deck, and start playing.
|
||||||
* The set contains almost 500 reprints but also introduces 37 new cards that were designed to help fill out some
|
* The set contains almost 500 reprints but also introduces 37 new cards that were designed to help fill out some
|
||||||
|
@ -30,7 +28,7 @@ public class JumpstartPoolGenerator {
|
||||||
* symbol, while new cards and other reprints will have the Jumpstart symbol. Reprints have a Post-M15 card frame.
|
* symbol, while new cards and other reprints will have the Jumpstart symbol. Reprints have a Post-M15 card frame.
|
||||||
* The new cards and cards with new art are numbered #1/78 to #78/78 (40 basic lands, TBA common, TBA uncommon,
|
* The new cards and cards with new art are numbered #1/78 to #78/78 (40 basic lands, TBA common, TBA uncommon,
|
||||||
* TBA rare, and TBA mythic rare). The other reprints with the Jumpstart expansion symbol are numbered #79 to 495."
|
* TBA rare, and TBA mythic rare). The other reprints with the Jumpstart expansion symbol are numbered #79 to 495."
|
||||||
*
|
*
|
||||||
* "Jumpstart is sold in 20-card boosters, and booster boxes contain 24 boosters.[9] All 20 cards in a booster fit a
|
* "Jumpstart is sold in 20-card boosters, and booster boxes contain 24 boosters.[9] All 20 cards in a booster fit a
|
||||||
* theme, and most themes are mono-color and have multiple variations of cards included in the pack, totaling 121
|
* theme, and most themes are mono-color and have multiple variations of cards included in the pack, totaling 121
|
||||||
* different possible pack contents. Special "Mythic Rare" packs don't have variations at all, but just one possible
|
* different possible pack contents. Special "Mythic Rare" packs don't have variations at all, but just one possible
|
||||||
|
@ -42,46 +40,69 @@ public class JumpstartPoolGenerator {
|
||||||
* themed land art created for the set. The booster pack is wrapped like a regular pack, but the set of cards is
|
* themed land art created for the set. The booster pack is wrapped like a regular pack, but the set of cards is
|
||||||
* packed in an additional plastic wrap, with a face card (the "Pack Summary card") that indicates the theme and
|
* packed in an additional plastic wrap, with a face card (the "Pack Summary card") that indicates the theme and
|
||||||
* the color of the half-deck."
|
* the color of the half-deck."
|
||||||
*
|
*
|
||||||
* Source: https://mtg.gamepedia.com/Jumpstart
|
* Source: https://mtg.gamepedia.com/Jumpstart
|
||||||
*
|
*
|
||||||
* Announcement: https://magic.wizards.com/en/articles/archive/news/introducing-jumpstart-new-way-play-magic-2020-02-20
|
* Announcement: https://magic.wizards.com/en/articles/archive/news/introducing-jumpstart-new-way-play-magic-2020-02-20
|
||||||
* Card Pool: https://magic.wizards.com/en/articles/archive/card-image-gallery/jumpstart
|
* Card Pool: https://magic.wizards.com/en/articles/archive/card-image-gallery/jumpstart
|
||||||
* Deck Lists: https://magic.wizards.com/en/articles/archive/feature/jumpstart-decklists-2020-06-18
|
* Deck Lists: https://magic.wizards.com/en/articles/archive/feature/jumpstart-decklists-2020-06-18
|
||||||
*/
|
*/
|
||||||
|
private static final String RESOURCE_NAME = "jumpstart/jumpstart.txt";
|
||||||
|
private static final List<JumpstartPack> JUMPSTART_PACKS;
|
||||||
|
|
||||||
private static final String RESOURCE_NAME = "jumpstart/jumpstart.txt";
|
static {
|
||||||
private static final List<JumpstartPack> JUMPSTART_PACKS;
|
List<JumpstartPack> packs = getPacks ("", true);
|
||||||
|
JUMPSTART_PACKS = Collections.unmodifiableList(packs);
|
||||||
static {
|
|
||||||
try {
|
|
||||||
CharSource source = Resources.asCharSource(Resources.getResource(RESOURCE_NAME), Charsets.UTF_8);
|
|
||||||
List<JumpstartPack> packs = new ArrayList<>();
|
|
||||||
JumpstartPack pack = new JumpstartPack();
|
|
||||||
packs.add(pack);
|
|
||||||
for (String line : source.readLines()) {
|
|
||||||
if (line.isEmpty()) {
|
|
||||||
if (!pack.isEmpty()) {
|
|
||||||
pack = new JumpstartPack();
|
|
||||||
packs.add(pack);
|
|
||||||
}
|
|
||||||
} else if (line.startsWith("#")) {
|
|
||||||
// skip comment
|
|
||||||
} else {
|
|
||||||
String[] ls = line.split(" ", 4);
|
|
||||||
int quantity = Integer.parseInt(ls[0]);
|
|
||||||
for (int i = 0; i < quantity; i++) {
|
|
||||||
pack.add(new DeckCardInfo(ls[3], ls[2], ls[1]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
JUMPSTART_PACKS = Collections.unmodifiableList(packs);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new UncheckedIOException(e);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Notes
|
private static List<JumpstartPack> getPacks(String jumpstartPacks, boolean useDefault) {
|
||||||
|
try {
|
||||||
|
CharSource source;
|
||||||
|
if (useDefault) {
|
||||||
|
source = Resources.asCharSource(Resources.getResource(RESOURCE_NAME), Charsets.UTF_8);
|
||||||
|
} else {
|
||||||
|
source = CharSource.wrap(jumpstartPacks);
|
||||||
|
}
|
||||||
|
List<JumpstartPack> packs = new ArrayList<>();
|
||||||
|
JumpstartPack pack = new JumpstartPack();
|
||||||
|
packs.add(pack);
|
||||||
|
for (String line : source.readLines()) {
|
||||||
|
if (line.isEmpty()) {
|
||||||
|
if (!pack.isEmpty()) {
|
||||||
|
pack = new JumpstartPack();
|
||||||
|
packs.add(pack);
|
||||||
|
}
|
||||||
|
} else if (line.startsWith("#")) {
|
||||||
|
// skip comment
|
||||||
|
} else {
|
||||||
|
String[] ls = line.split(" ", 4);
|
||||||
|
int quantity = Integer.parseInt(ls[0]);
|
||||||
|
for (int i = 0; i < quantity; i++) {
|
||||||
|
pack.add(new DeckCardInfo(ls[3], ls[2], ls[1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return packs;
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new UncheckedIOException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Set<Card> doGeneratePool(List<JumpstartPack> packs) {
|
||||||
|
try {
|
||||||
|
DeckCardLists list = new DeckCardLists();
|
||||||
|
SecureRandom random = new SecureRandom();
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
int index = random.nextInt(packs.size());
|
||||||
|
list.getCards().addAll(packs.get(index).getCards());
|
||||||
|
}
|
||||||
|
return Deck.load(list, false, false).getCards();
|
||||||
|
} catch (GameException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Notes
|
||||||
*
|
*
|
||||||
* 1) the pools generated by this method are for how the prerelease will be played (see https://mtg.gamepedia.com/Jumpstart#Events)
|
* 1) the pools generated by this method are for how the prerelease will be played (see https://mtg.gamepedia.com/Jumpstart#Events)
|
||||||
* In order to support the 4 pack version, xmage would need to support editing multiple decks and some Duo format
|
* In order to support the 4 pack version, xmage would need to support editing multiple decks and some Duo format
|
||||||
|
@ -93,37 +114,35 @@ public class JumpstartPoolGenerator {
|
||||||
*
|
*
|
||||||
* 3) this does not attempt to add an additional rare 1/3 of the time as described here:
|
* 3) this does not attempt to add an additional rare 1/3 of the time as described here:
|
||||||
* https://mtg.gamepedia.com/Jumpstart#Marketing
|
* https://mtg.gamepedia.com/Jumpstart#Marketing
|
||||||
*/
|
*/
|
||||||
public static Set<Card> generatePool() {
|
public static Set<Card> generatePool() {
|
||||||
try {
|
return doGeneratePool(JUMPSTART_PACKS);
|
||||||
DeckCardLists list = new DeckCardLists();
|
|
||||||
SecureRandom random = new SecureRandom();
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
int index = random.nextInt(JUMPSTART_PACKS.size());
|
|
||||||
list.getCards().addAll(JUMPSTART_PACKS.get(index).getCards());
|
|
||||||
}
|
|
||||||
return Deck.load(list, false, false).getCards();
|
|
||||||
} catch (GameException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class JumpstartPack {
|
|
||||||
|
|
||||||
private final List<DeckCardInfo> cards = new ArrayList<>();
|
|
||||||
|
|
||||||
public void add(DeckCardInfo card) {
|
|
||||||
cards.add(card);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public static Set<Card> generatePool(String userJumpstartPacks) {
|
||||||
return cards.isEmpty();
|
if (userJumpstartPacks == null || userJumpstartPacks.length() > 300000) {
|
||||||
|
return generatePool();
|
||||||
|
}
|
||||||
|
List<JumpstartPack> packs = getPacks(userJumpstartPacks, false);
|
||||||
|
return doGeneratePool(packs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<DeckCardInfo> getCards() {
|
public static class JumpstartPack {
|
||||||
return Collections.unmodifiableList(cards);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
private final List<DeckCardInfo> cards = new ArrayList<>();
|
||||||
|
|
||||||
|
public void add(DeckCardInfo card) {
|
||||||
|
cards.add(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return cards.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DeckCardInfo> getCards() {
|
||||||
|
return Collections.unmodifiableList(cards);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
package mage.game.tournament;
|
package mage.game.tournament;
|
||||||
|
|
||||||
import mage.cards.decks.Deck;
|
|
||||||
import mage.game.draft.DraftCube;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import mage.cards.decks.Deck;
|
||||||
|
import mage.game.draft.DraftCube;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author BetaSteward_at_googlemail.com
|
* @author BetaSteward_at_googlemail.com
|
||||||
|
@ -20,6 +19,20 @@ public class LimitedOptions implements Serializable {
|
||||||
protected boolean isRandom;
|
protected boolean isRandom;
|
||||||
protected boolean isRichMan;
|
protected boolean isRichMan;
|
||||||
protected Deck cubeFromDeck;
|
protected Deck cubeFromDeck;
|
||||||
|
|
||||||
|
protected String jumpstartPacks;
|
||||||
|
// Eg of jumpstartPacks - uploaded by user
|
||||||
|
/*
|
||||||
|
# Minions
|
||||||
|
1 JMP 236 Ghoulcaller Gisa
|
||||||
|
1 JMP 226 Dutiful Attendant
|
||||||
|
1 M21 126 Village Rites
|
||||||
|
|
||||||
|
# Phyrexian
|
||||||
|
1 JMP 278 Sheoldred, Whispering One
|
||||||
|
1 JMP 227 Entomber Exarch
|
||||||
|
1 JMP 265 Phyrexian Gargantua
|
||||||
|
*/
|
||||||
protected boolean isJumpstart;
|
protected boolean isJumpstart;
|
||||||
|
|
||||||
public List<String> getSetCodes() {
|
public List<String> getSetCodes() {
|
||||||
|
@ -50,6 +63,14 @@ public class LimitedOptions implements Serializable {
|
||||||
return cubeFromDeck;
|
return cubeFromDeck;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setJumpstartPacks(String jumpstartPacks) {
|
||||||
|
this.jumpstartPacks = jumpstartPacks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJumpstartPacks() {
|
||||||
|
return jumpstartPacks;
|
||||||
|
}
|
||||||
|
|
||||||
public DraftCube getDraftCube() {
|
public DraftCube getDraftCube() {
|
||||||
return draftCube;
|
return draftCube;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
package mage.game.tournament;
|
package mage.game.tournament;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -12,9 +11,6 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import mage.cards.ExpansionSet;
|
import mage.cards.ExpansionSet;
|
||||||
import mage.cards.decks.Deck;
|
import mage.cards.decks.Deck;
|
||||||
import mage.constants.TournamentPlayerState;
|
import mage.constants.TournamentPlayerState;
|
||||||
|
@ -37,6 +33,7 @@ import mage.game.result.ResultProtos.TourneyRoundProto;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.players.PlayerType;
|
import mage.players.PlayerType;
|
||||||
import mage.util.RandomUtil;
|
import mage.util.RandomUtil;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -411,7 +408,11 @@ public abstract class TournamentImpl implements Tournament {
|
||||||
player.getDeck().getSideboard().addAll(cube.createBooster());
|
player.getDeck().getSideboard().addAll(cube.createBooster());
|
||||||
}
|
}
|
||||||
} else if (options.getLimitedOptions().getIsJumpstart()) {
|
} else if (options.getLimitedOptions().getIsJumpstart()) {
|
||||||
player.getDeck().getCards().addAll(JumpstartPoolGenerator.generatePool());
|
if (options.getLimitedOptions().jumpstartPacks == null) {
|
||||||
|
player.getDeck().getCards().addAll(JumpstartPoolGenerator.generatePool());
|
||||||
|
} else {
|
||||||
|
player.getDeck().getCards().addAll(JumpstartPoolGenerator.generatePool(options.getLimitedOptions().jumpstartPacks));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (ExpansionSet set : sets) {
|
for (ExpansionSet set : sets) {
|
||||||
player.getDeck().getSideboard().addAll(set.createBooster());
|
player.getDeck().getSideboard().addAll(set.createBooster());
|
||||||
|
|
Loading…
Reference in a new issue