From 1695e6767da013d144ba50a85dc9819d1bd6226c Mon Sep 17 00:00:00 2001 From: John Hitchings Date: Thu, 18 Jun 2020 23:45:02 -0700 Subject: [PATCH] add jumpstart swiss and elimiation tournament formats. --- .../client/dialog/NewTournamentDialog.java | 1 + .../java/mage/view/TournamentTypeView.java | 7 ++ .../JumpstartEliminationTournament.java | 44 ++++++++++ .../JumpstartEliminationTournamentType.java | 19 +++++ .../tournament/JumpstartSwissTournament.java | 44 ++++++++++ .../JumpstartSwissTournamentType.java | 18 ++++ Mage.Server/config/config.xml | 2 + .../jumpstart/JumpstartPoolGenerator.java | 84 +++++++++++++++++++ .../java/mage/game/jumpstart/jumpstart.txt | 15 ++++ .../mage/game/tournament/LimitedOptions.java | 12 ++- .../mage/game/tournament/TournamentImpl.java | 24 +++++- .../mage/game/tournament/TournamentType.java | 7 +- 12 files changed, 272 insertions(+), 5 deletions(-) create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournament.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartEliminationTournamentType.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournament.java create mode 100644 Mage.Server.Plugins/Mage.Tournament.Sealed/src/mage/tournament/JumpstartSwissTournamentType.java create mode 100644 Mage/src/main/java/mage/game/jumpstart/JumpstartPoolGenerator.java create mode 100644 Mage/src/main/java/mage/game/jumpstart/jumpstart.txt 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; + } + }