diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
index 648a13651a5..2e4b980870a 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
@@ -1203,6 +1203,7 @@ public class NewTournamentDialog extends MageDialog {
tOptions.getLimitedOptions().setConstructionTime((Integer) this.spnConstructTime.getValue() * 60);
tOptions.getLimitedOptions().setIsRandom(tournamentType.isRandom());
tOptions.getLimitedOptions().setIsRichMan(tournamentType.isRichMan());
+ tOptions.getLimitedOptions().setIsJumpstart(tournamentType.isJumpstart());
if (tournamentType.isCubeBooster()) {
tOptions.getLimitedOptions().setDraftCubeName(this.cbDraftCube.getSelectedItem().toString());
if (!(cubeFromDeckFilename.isEmpty())) {
diff --git a/Mage.Common/src/main/java/mage/view/TournamentTypeView.java b/Mage.Common/src/main/java/mage/view/TournamentTypeView.java
index 8bd4d8c3ccb..22d7ecf9bca 100644
--- a/Mage.Common/src/main/java/mage/view/TournamentTypeView.java
+++ b/Mage.Common/src/main/java/mage/view/TournamentTypeView.java
@@ -22,6 +22,7 @@ public class TournamentTypeView implements Serializable {
private final boolean elimination;
private final boolean random;
private final boolean richMan;
+ private final boolean jumpstart;
public TournamentTypeView(TournamentType tournamentType) {
this.name = tournamentType.getName();
@@ -34,6 +35,7 @@ public class TournamentTypeView implements Serializable {
this.elimination = tournamentType.isElimination();
this.random = tournamentType.isRandom();
this.richMan = tournamentType.isRichMan();
+ this.jumpstart = tournamentType.isJumpstart();
}
@Override
@@ -80,4 +82,9 @@ public class TournamentTypeView implements Serializable {
public boolean isRichMan() {
return richMan;
}
+
+ public boolean isJumpstart() {
+ return jumpstart;
+ }
+
}
diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournament.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournament.java
new file mode 100644
index 00000000000..d65634936af
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournament.java
@@ -0,0 +1,44 @@
+
+
+package mage.tournament;
+
+import mage.game.tournament.TournamentOptions;
+import mage.game.tournament.TournamentSingleElimination;
+
+public class JumpstartEliminationTournament extends TournamentSingleElimination {
+
+ protected enum TournamentStep {
+ START, OPEN_BOOSTERS, CONSTRUCT, COMPETE, WINNERS
+ }
+
+ protected TournamentStep currentStep;
+
+ public JumpstartEliminationTournament(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;
+ }
+ }
+
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournamentType.java
new file mode 100644
index 00000000000..858588e4415
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournamentType.java
@@ -0,0 +1,19 @@
+
+
+package mage.tournament;
+
+import mage.game.tournament.TournamentType;
+
+public class JumpstartEliminationTournamentType extends TournamentType {
+
+ public JumpstartEliminationTournamentType() {
+ this.name = "Jumpstart Elimination";
+ this.maxPlayers = 16;
+ this.minPlayers = 2;
+ this.numBoosters = 0;
+ this.isJumpstart = true;
+ this.elimination = true;
+ this.limited = true;
+ }
+
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournament.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournament.java
new file mode 100644
index 00000000000..f0e7f34bc9f
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournament.java
@@ -0,0 +1,44 @@
+
+
+package mage.tournament;
+
+import mage.game.tournament.TournamentOptions;
+import mage.game.tournament.TournamentSwiss;
+
+public class JumpstartSwissTournament extends TournamentSwiss {
+
+ protected enum TournamentStep {
+ START, OPEN_BOOSTERS, CONSTRUCT, COMPETE, WINNERS
+ }
+
+ protected TournamentStep currentStep;
+
+ public JumpstartSwissTournament(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;
+ }
+ }
+
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournamentType.java b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournamentType.java
new file mode 100644
index 00000000000..bf5328ed52d
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournamentType.java
@@ -0,0 +1,18 @@
+
+
+package mage.tournament;
+
+import mage.game.tournament.TournamentType;
+
+public class JumpstartSwissTournamentType extends TournamentType {
+
+ public JumpstartSwissTournamentType() {
+ this.name = "Jumpstart Swiss";
+ this.maxPlayers = 16;
+ this.minPlayers = 2;
+ this.numBoosters = 0;
+ this.isJumpstart = true;
+ this.limited = true;
+ }
+
+}
diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml
index 28ffc64abfc..6ee2e095469 100644
--- a/Mage.Server/config/config.xml
+++ b/Mage.Server/config/config.xml
@@ -104,6 +104,8 @@
+
+
diff --git a/Mage/src/main/java/mage/game/jumpstart/JumpstartPoolGenerator.java b/Mage/src/main/java/mage/game/jumpstart/JumpstartPoolGenerator.java
new file mode 100644
index 00000000000..476f2b7337d
--- /dev/null
+++ b/Mage/src/main/java/mage/game/jumpstart/JumpstartPoolGenerator.java
@@ -0,0 +1,84 @@
+package mage.game.jumpstart;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.CharSource;
+import com.google.common.io.Files;
+import com.google.common.io.Resources;
+
+import mage.cards.Card;
+import mage.cards.decks.Deck;
+import mage.cards.decks.DeckCardInfo;
+import mage.cards.decks.DeckCardLists;
+import mage.game.GameException;
+
+public class JumpstartPoolGenerator {
+
+ private static final String RESOURCE_NAME = "mage/game/jumpstart/jumpstart.txt";
+ private static final List JUMPSTART_PACKS;
+
+ static {
+ try {
+ CharSource source = Resources.asCharSource(Resources.getResource(RESOURCE_NAME), Charsets.UTF_8);
+ List packs = new ArrayList<>();
+ JumpstartPack pack = new JumpstartPack();
+ for (String line : source.readLines()) {
+ if (line.isEmpty()) {
+ if (!pack.isEmpty()) {
+ packs.add(pack);
+ pack = new JumpstartPack();
+ }
+ } else if (line.startsWith("#")) {
+ // skip comment
+ } else {
+ String[] ls = line.split(" ", 3);
+ pack.add(new DeckCardInfo(ls[2], ls[1], ls[0]));
+ }
+ }
+ JUMPSTART_PACKS = Collections.unmodifiableList(packs);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+ }
+
+ public static Set generatePool() {
+ try {
+ 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).getCards();
+ } catch (GameException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static class JumpstartPack {
+
+ private final List cards = new ArrayList<>();
+
+ public void add(DeckCardInfo card) {
+ cards.add(card);
+ }
+
+ public boolean isEmpty() {
+ return cards.isEmpty();
+ }
+
+ public List getCards() {
+ return Collections.unmodifiableList(cards);
+ }
+
+ }
+
+}
diff --git a/Mage/src/main/java/mage/game/jumpstart/jumpstart.txt b/Mage/src/main/java/mage/game/jumpstart/jumpstart.txt
new file mode 100644
index 00000000000..cd0f7fad668
--- /dev/null
+++ b/Mage/src/main/java/mage/game/jumpstart/jumpstart.txt
@@ -0,0 +1,15 @@
+# setCode cardNum cardName
+IKO 105 Whisper Squad
+IKO 105 Whisper Squad
+IKO 105 Whisper Squad
+IKO 105 Whisper Squad
+
+IKO 113 Drannith Stinger
+IKO 113 Drannith Stinger
+IKO 113 Drannith Stinger
+IKO 113 Drannith Stinger
+
+IKO 149 Essence Symbiote
+IKO 149 Essence Symbiote
+IKO 149 Essence Symbiote
+IKO 149 Essence Symbiote
diff --git a/Mage/src/main/java/mage/game/tournament/LimitedOptions.java b/Mage/src/main/java/mage/game/tournament/LimitedOptions.java
index 0151beed800..9628b5c33af 100644
--- a/Mage/src/main/java/mage/game/tournament/LimitedOptions.java
+++ b/Mage/src/main/java/mage/game/tournament/LimitedOptions.java
@@ -19,7 +19,8 @@ public class LimitedOptions implements Serializable {
protected int numberBoosters;
protected boolean isRandom;
protected boolean isRichMan;
- protected Deck cubeFromDeck = null;
+ protected Deck cubeFromDeck;
+ protected boolean isJumpstart;
public List getSetCodes() {
return sets;
@@ -80,4 +81,13 @@ public class LimitedOptions implements Serializable {
public void setIsRichMan(boolean isRichMan) {
this.isRichMan = isRichMan;
}
+
+ public void setIsJumpstart(boolean isJumpstart) {
+ this.isJumpstart = isJumpstart;
+ }
+
+ public boolean getIsJumpstart() {
+ return this.isJumpstart;
+ }
+
}
diff --git a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java
index 016ca73dd6e..cd3729b844b 100644
--- a/Mage/src/main/java/mage/game/tournament/TournamentImpl.java
+++ b/Mage/src/main/java/mage/game/tournament/TournamentImpl.java
@@ -1,15 +1,32 @@
package mage.game.tournament;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.log4j.Logger;
+
import mage.cards.ExpansionSet;
import mage.cards.decks.Deck;
import mage.constants.TournamentPlayerState;
import mage.game.draft.Draft;
import mage.game.draft.DraftCube;
-import mage.game.events.*;
+import mage.game.events.Listener;
+import mage.game.events.PlayerQueryEvent;
+import mage.game.events.PlayerQueryEventSource;
+import mage.game.events.TableEvent;
import mage.game.events.TableEvent.EventType;
+import mage.game.events.TableEventSource;
+import mage.game.jumpstart.JumpstartPoolGenerator;
import mage.game.match.Match;
import mage.game.match.MatchPlayer;
import mage.game.result.ResultProtos.MatchPlayerProto;
@@ -20,7 +37,6 @@ import mage.game.result.ResultProtos.TourneyRoundProto;
import mage.players.Player;
import mage.players.PlayerType;
import mage.util.RandomUtil;
-import org.apache.log4j.Logger;
/**
*
@@ -394,6 +410,8 @@ public abstract class TournamentImpl implements Tournament {
for (int i = 0; i < options.getLimitedOptions().getNumberBoosters(); i++) {
player.getDeck().getSideboard().addAll(cube.createBooster());
}
+ } else if (options.getLimitedOptions().getIsJumpstart()) {
+ player.getDeck().getSideboard().addAll(JumpstartPoolGenerator.generatePool());
} else {
for (ExpansionSet set : sets) {
player.getDeck().getSideboard().addAll(set.createBooster());
diff --git a/Mage/src/main/java/mage/game/tournament/TournamentType.java b/Mage/src/main/java/mage/game/tournament/TournamentType.java
index 5b227ed3d1a..f11bd7e38ec 100644
--- a/Mage/src/main/java/mage/game/tournament/TournamentType.java
+++ b/Mage/src/main/java/mage/game/tournament/TournamentType.java
@@ -18,7 +18,8 @@ public class TournamentType implements Serializable {
protected boolean limited; // or construced
protected boolean elimination; // or Swiss
protected boolean isRandom;
- protected boolean isRichMan = false; // or Rich Man Draft
+ protected boolean isRichMan; // or Rich Man Draft
+ protected boolean isJumpstart;
protected TournamentType() {
}
@@ -68,4 +69,8 @@ public class TournamentType implements Serializable {
return this.isRichMan;
}
+ public boolean isJumpstart() {
+ return this.isJumpstart;
+ }
+
}