Second simple attempt at planar conquest generation code and example

(cherry picked from commit 234db8d)
This commit is contained in:
austinio7116
2018-04-25 12:56:41 +01:00
committed by maustin
parent d96d1f2ee9
commit 7e3b9ccc2d
24 changed files with 595 additions and 245 deletions

View File

@@ -1,9 +1,12 @@
package forge.planarconquestgenerate;
import com.google.common.base.Function;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import forge.GuiBase;
import forge.GuiDesktop;
import forge.LobbyPlayer;
import forge.StaticData;
import forge.card.CardRulesPredicates;
import forge.deck.*;
import forge.deck.io.DeckStorage;
import forge.game.GameFormat;
@@ -26,6 +29,7 @@ import forge.util.TextUtil;
import forge.view.SimulateMatch;
import org.apache.commons.lang3.text.WordUtils;
import org.testng.annotations.Test;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.ArrayList;
@@ -63,16 +67,21 @@ public class PlanarConquestGeneratorTest {
DeckStorage storage = new DeckStorage(new File(ForgeConstants.DECK_CONSTRUCTED_DIR), ForgeConstants.DECK_BASE_DIR);
GameFormat planarConquestFormat = new GameFormat("conquest",sets,null);
DeckFormat deckFormat = DeckFormat.PlanarConquest;
for(PaperCard card: rankedList.subList(0,20)){
Iterable<PaperCard> filtered= Iterables.filter(rankedList, Predicates.and(
Predicates.compose(CardRulesPredicates.IS_KEPT_IN_AI_DECKS, PaperCard.FN_GET_RULES),
Predicates.compose(CardRulesPredicates.Presets.IS_NON_LAND, PaperCard.FN_GET_RULES),
planarConquestFormat.getFilterPrinted()));
List<PaperCard> filteredList = Lists.newArrayList(filtered);
for(PaperCard card: filteredList.subList(0,50)){
if(planarConquestFormat.getFilterPrinted().apply(card)) {
System.out.println(card.getName());
if(true) {
continue;
}
DeckGroup deckGroup = new DeckGroup("SimulatedTournament");
List<TournamentPlayer> players = new ArrayList<>();
int numPlayers=0;
for( int i=0; i<16;i++){
for( int i=0; i<32;i++){
Deck genDeck = DeckgenUtil.buildPlanarConquestDeck(card, planarConquestFormat, deckFormat);
Deck d = new Deck(genDeck,genDeck.getName()+"_"+i);
deckGroup.addAiDeck(d);
@@ -80,73 +89,8 @@ public class PlanarConquestGeneratorTest {
numPlayers++;
}
TournamentSwiss tourney = new TournamentSwiss(players, 2);
tourney.initializeTournament();
String lastWinner = "";
int curRound = 0;
System.out.println(TextUtil.concatNoSpace("Starting a tournament with ",
String.valueOf(numPlayers), " players over ",
String.valueOf(tourney.getTotalRounds()), " rounds"));
while(!tourney.isTournamentOver()) {
if (tourney.getActiveRound() != curRound) {
if (curRound != 0) {
System.out.println(TextUtil.concatNoSpace("End Round - ", String.valueOf(curRound)));
}
curRound = tourney.getActiveRound();
System.out.println("");
System.out.println(TextUtil.concatNoSpace("Round ", String.valueOf(curRound) ," Pairings:"));
for(TournamentPairing pairing : tourney.getActivePairings()) {
System.out.println(pairing.outputHeader());
}
System.out.println("");
}
TournamentPairing pairing = tourney.getNextPairing();
List<RegisteredPlayer> regPlayers = AbstractTournament.registerTournamentPlayers(pairing, deckGroup);
StringBuilder sb = new StringBuilder();
sb.append("Round ").append(tourney.getActiveRound()).append(" - ");
sb.append(pairing.outputHeader());
System.out.println(sb.toString());
if (!pairing.isBye()) {
Match mc = new Match(rules, regPlayers, "TourneyMatch");
int exceptions = 0;
int iGame = 0;
while (!mc.isMatchOver()) {
// play games until the match ends
try{
SimulateMatch.simulateSingleMatch(mc, iGame, false);
iGame++;
} catch(Exception e) {
exceptions++;
System.out.println(e.toString());
if (exceptions > 5) {
System.out.println("Exceeded number of exceptions thrown. Abandoning match...");
break;
} else {
System.out.println("Game threw exception. Abandoning game and continuing...");
}
}
}
LobbyPlayer winner = mc.getWinner().getPlayer();
for (TournamentPlayer tp : pairing.getPairedPlayers()) {
if (winner.equals(tp.getPlayer())) {
pairing.setWinner(tp);
lastWinner = winner.getName();
System.out.println(TextUtil.concatNoSpace("Match Winner - ", lastWinner, "!"));
System.out.println("");
break;
}
}
}
tourney.reportMatchCompletion(pairing);
}
tourney.outputTournamentResults();
tourney = runTournament(tourney, rules, numPlayers, deckGroup);
String deckName = tourney.getAllPlayers().get(0).getPlayer().getName();
Deck winningDeck;
for(Deck deck:deckGroup.getAiDecks()){
@@ -165,4 +109,149 @@ public class PlanarConquestGeneratorTest {
}
}
@Test
public void generatePlanarConquestCommanderDecks() {
GuiBase.setInterface(new GuiDesktop());
FModel.initialize(null, new Function<ForgePreferences, Void>() {
@Override
public Void apply(ForgePreferences preferences) {
preferences.setPref(ForgePreferences.FPref.LOAD_CARD_SCRIPTS_LAZILY, false);
return null;
}
});
GameFormat format = FModel.getFormats().getStandard();
GameRules rules = new GameRules(GameType.Constructed);
standardMap = CardRelationMatrixGenerator.cardPools.get(format.getName());
List<String> cardNames = new ArrayList<>(standardMap.keySet());
List<PaperCard> cards = new ArrayList<>();
for(String cardName:cardNames){
cards.add(StaticData.instance().getCommonCards().getUniqueByName(cardName));
}
List<PaperCard> rankedList = CardRanker.rankCardsInDeck(cards);
List<String> sets = new ArrayList<>();
sets.add("XLN");
sets.add("RIX");
DeckStorage storage = new DeckStorage(new File(ForgeConstants.DECK_CONSTRUCTED_DIR), ForgeConstants.DECK_BASE_DIR);
GameFormat planarConquestFormat = new GameFormat("conquest",sets,null);
DeckFormat deckFormat = DeckFormat.PlanarConquest;
Iterable<PaperCard> filtered= Iterables.filter(rankedList, Predicates.and(
Predicates.compose(CardRulesPredicates.IS_KEPT_IN_AI_DECKS, PaperCard.FN_GET_RULES),
Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard.FN_GET_RULES),
Predicates.compose(CardRulesPredicates.Presets.IS_LEGENDARY, PaperCard.FN_GET_RULES),
planarConquestFormat.getFilterPrinted()));
List<PaperCard> filteredList = Lists.newArrayList(filtered);
int maxListSize = 50;
if (maxListSize > filteredList.size()){
maxListSize = filteredList.size();
}
for(PaperCard card: filteredList.subList(0,maxListSize)){
if(planarConquestFormat.getFilterPrinted().apply(card)) {
System.out.println(card.getName());
DeckGroup deckGroup = new DeckGroup("SimulatedTournament");
List<TournamentPlayer> players = new ArrayList<>();
int numPlayers=0;
for( int i=0; i<2;i++){
Deck genDeck = DeckgenUtil.buildPlanarConquestCommanderDeck(card, planarConquestFormat, deckFormat);
Deck d = new Deck(genDeck,genDeck.getName()+"_"+i);
deckGroup.addAiDeck(d);
players.add(new TournamentPlayer(GamePlayerUtil.createAiPlayer(d.getName(), 0), numPlayers));
numPlayers++;
}
TournamentSwiss tourney = new TournamentSwiss(players, 2);
tourney = runTournament(tourney, rules, numPlayers, deckGroup);
String deckName = tourney.getAllPlayers().get(0).getPlayer().getName();
Deck winningDeck;
for(Deck deck:deckGroup.getAiDecks()){
if(deck.getName().equals(deckName)){
winningDeck=deck;
storage.save(winningDeck);
System.out.println(card.toString());
System.out.println(winningDeck.getName());
System.out.println(winningDeck.getAllCardsInASinglePool().toString());
break;
}
}
}
}
}
public TournamentSwiss runTournament(TournamentSwiss tourney, GameRules rules, int numPlayers, DeckGroup deckGroup){
tourney.initializeTournament();
String lastWinner = "";
int curRound = 0;
System.out.println(TextUtil.concatNoSpace("Starting a tournament with ",
String.valueOf(numPlayers), " players over ",
String.valueOf(tourney.getTotalRounds()), " rounds"));
while(!tourney.isTournamentOver()) {
if (tourney.getActiveRound() != curRound) {
if (curRound != 0) {
System.out.println(TextUtil.concatNoSpace("End Round - ", String.valueOf(curRound)));
}
curRound = tourney.getActiveRound();
System.out.println("");
System.out.println(TextUtil.concatNoSpace("Round ", String.valueOf(curRound) ," Pairings:"));
for(TournamentPairing pairing : tourney.getActivePairings()) {
System.out.println(pairing.outputHeader());
}
System.out.println("");
}
TournamentPairing pairing = tourney.getNextPairing();
List<RegisteredPlayer> regPlayers = AbstractTournament.registerTournamentPlayers(pairing, deckGroup);
StringBuilder sb = new StringBuilder();
sb.append("Round ").append(tourney.getActiveRound()).append(" - ");
sb.append(pairing.outputHeader());
System.out.println(sb.toString());
if (!pairing.isBye()) {
Match mc = new Match(rules, regPlayers, "TourneyMatch");
int exceptions = 0;
int iGame = 0;
while (!mc.isMatchOver()) {
// play games until the match ends
try{
SimulateMatch.simulateSingleMatch(mc, iGame, false);
iGame++;
} catch(Exception e) {
exceptions++;
System.out.println(e.toString());
if (exceptions > 5) {
System.out.println("Exceeded number of exceptions thrown. Abandoning match...");
break;
} else {
System.out.println("Game threw exception. Abandoning game and continuing...");
}
}
}
LobbyPlayer winner = mc.getWinner().getPlayer();
for (TournamentPlayer tp : pairing.getPairedPlayers()) {
if (winner.equals(tp.getPlayer())) {
pairing.setWinner(tp);
lastWinner = winner.getName();
System.out.println(TextUtil.concatNoSpace("Match Winner - ", lastWinner, "!"));
System.out.println("");
break;
}
}
}
tourney.reportMatchCompletion(pairing);
}
tourney.outputTournamentResults();
return tourney;
}
}

View File

@@ -0,0 +1,32 @@
[metadata]
Name=Champion of Dusk - Legion Lieutenant based deck_7
[Main]
1 Angrath's Ambusher|RIX
1 Call to the Feast|XLN
1 Champion of Dusk|RIX
1 Contract Killing|XLN
1 Dusk Legion Zealot|RIX
1 Duskborne Skymarcher|XLN
1 Everdawn Champion|RIX
1 Field of Ruin|XLN
1 Inspiring Cleric|XLN
1 Ixalan's Binding|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
9 Plains|RIX
1 Queen's Commission|XLN
1 Radiant Destiny|RIX
1 Sanctum Seeker|XLN
1 Sanguine Glorifier|RIX
1 Shadowed Caravel|XLN
1 Skymarcher Aspirant|RIX
6 Swamp|RIX
1 Trapjaw Tyrant|RIX
1 Unclaimed Territory|XLN
1 Vampire Champion|RIX
1 Vampire Revenant|RIX
1 Wakening Sun's Avatar|XLN
[Sideboard]

View File

@@ -1,32 +1,31 @@
[metadata]
Name=Mavren Fein, Dusk Apostle - Call to the Feast based deck_15
Name=Duskborne Skymarcher - Legion Lieutenant based deck_18
[Main]
1 Bishop of Binding|RIX
1 Bishop of the Bloodstained|XLN
1 Bright Reprisal|XLN
1 Call to the Feast|XLN
1 Champion of Dusk|RIX
1 Dusk Legion Zealot|RIX
1 Duskborne Skymarcher|XLN
1 Fell Flagship|XLN
1 Field of Ruin|XLN
1 Forerunner of the Coalition|RIX
1 Forerunner of the Legion|RIX
1 Huatli's Snubhorn|XLN
1 Ixalan's Binding|XLN
1 Kinjalli's Sunwing|XLN
1 Legion Conquistador|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Looming Altisaur|XLN
1 Lurking Chupacabra|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
9 Plains|RIX
10 Plains|RIX
1 Profane Procession|RIX
1 Queen's Commission|XLN
1 Radiant Destiny|RIX
1 Sanctum Seeker|XLN
1 Settle the Wreckage|XLN
1 Skulduggery|XLN
1 Skyblade of the Legion|XLN
1 Skymarcher Aspirant|RIX
6 Swamp|RIX
1 Temple Altisaur|RIX
1 Tetzimoc, Primal Death|RIX
1 Unclaimed Territory|XLN
1 Vicious Conquistador|XLN
[Sideboard]

View File

@@ -1,32 +1,32 @@
[metadata]
Name=Legion Lieutenant - Skymarcher Aspirant based deck_3
Name=Elenda, the Dusk Rose - Call to the Feast based deck_14
[Main]
1 Bishop of the Bloodstained|XLN
1 Call to the Feast|XLN
1 Champion of Dusk|RIX
1 Crashing Tide|RIX
1 Curious Obsession|RIX
1 Dire Fleet Ravager|XLN
1 Dowsing Dagger|XLN
1 Dusk Legion Zealot|RIX
1 Duskborne Skymarcher|XLN
1 Elenda, the Dusk Rose|RIX
1 Forerunner of the Legion|RIX
1 Hostage Taker|XLN
2 Island|RIX
1 Field of Ruin|XLN
1 Impale|RIX
1 Ixalan's Binding|XLN
1 Kinjalli's Sunwing|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
1 Pirate's Cutlass|XLN
7 Plains|RIX
1 Pride of Conquerors|RIX
8 Plains|RIX
1 Queen's Commission|XLN
1 Radiant Destiny|RIX
1 Rallying Roar|XLN
1 Sanctum Seeker|XLN
1 Skymarch Bloodletter|XLN
1 Skymarcher Aspirant|RIX
1 Slash of Talons|XLN
1 Snubhorn Sentry|RIX
7 Swamp|RIX
1 Temple Altisaur|RIX
1 Unclaimed Territory|XLN
1 Vraska's Contempt|XLN
1 Walk the Plank|XLN
1 Voracious Vampire|RIX
[Sideboard]

View File

@@ -1,30 +0,0 @@
[metadata]
Name=Elenda, the Dusk Rose - Legion Lieutenant based deck_4
[Main]
1 Bishop of the Bloodstained|XLN
1 Call to the Feast|XLN
1 Champion of Dusk|RIX
1 Dire Fleet Poisoner|RIX
1 Dusk Legion Zealot|RIX
1 Duskborne Skymarcher|XLN
1 Elenda, the Dusk Rose|RIX
1 Fathom Fleet Captain|XLN
1 Forerunner of the Coalition|RIX
1 Ixalan's Binding|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
1 Pirate's Cutlass|XLN
8 Plains|RIX
1 Queen's Commission|XLN
1 Radiant Destiny|RIX
1 Sadistic Skymarcher|RIX
1 Settle the Wreckage|XLN
1 Skymarcher Aspirant|RIX
9 Swamp|RIX
1 Tetzimoc, Primal Death|RIX
1 The Immortal Sun|RIX
1 Walk the Plank|XLN
[Sideboard]

View File

@@ -1,31 +1,31 @@
[metadata]
Name=Forerunner of the Legion - Radiant Destiny based deck_10
Name=Forerunner of the Legion - Legion Lieutenant based deck_30
[Main]
1 Bishop of Binding|RIX
1 Bishop of the Bloodstained|XLN
1 Call to the Feast|XLN
1 Champion of Dusk|RIX
1 Dinosaur Hunter|RIX
1 Dusk Legion Zealot|RIX
1 Duskborne Skymarcher|XLN
1 Elenda, the Dusk Rose|RIX
1 Fell Flagship|XLN
1 Forerunner of the Coalition|RIX
1 Forerunner of the Legion|RIX
1 Ixalan's Binding|XLN
1 Kinjalli's Caller|XLN
1 Legion Conquistador|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
8 Plains|RIX
10 Plains|RIX
1 Prying Blade|XLN
1 Queen's Commission|XLN
1 Radiant Destiny|RIX
1 Sadistic Skymarcher|RIX
1 Sanctum Seeker|XLN
1 Raptor Companion|RIX
1 Revel in Riches|XLN
1 Skulduggery|XLN
1 Skymarcher Aspirant|RIX
8 Swamp|RIX
1 The Immortal Sun|RIX
1 Twilight Prophet|RIX
1 Sleek Schooner|XLN
1 Steadfast Armasaur|XLN
6 Swamp|RIX
1 Unclaimed Territory|XLN
[Sideboard]

View File

@@ -1,32 +1,31 @@
[metadata]
Name=Champion of Dusk - Legion's Landing based deck_9
Name=Legion Lieutenant - Radiant Destiny based deck_5
[Main]
1 Bishop of Binding|RIX
1 Bishop of the Bloodstained|XLN
1 Awakened Amalgam|RIX
1 Boneyard Parley|XLN
1 Call to the Feast|XLN
1 Captain's Hook|RIX
1 Champion of Dusk|RIX
1 Desperate Castaways|XLN
1 Dusk Legion Zealot|RIX
1 Fathom Fleet Captain|XLN
1 Fell Flagship|XLN
1 Field of Ruin|XLN
1 Duskborne Skymarcher|XLN
1 Emissary of Sunrise|XLN
1 Forerunner of the Legion|RIX
1 Ixalan's Binding|XLN
1 Kitesail Freebooter|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
7 Plains|RIX
8 Plains|RIX
1 Queen's Commission|XLN
1 Radiant Destiny|RIX
1 Sadistic Skymarcher|RIX
1 Sanctum Seeker|XLN
1 Settle the Wreckage|XLN
1 Skymarcher Aspirant|RIX
1 Sun Sentinel|RIX
8 Swamp|RIX
1 The Immortal Sun|RIX
1 Twilight Prophet|RIX
1 Unclaimed Territory|XLN
1 Walk the Plank|XLN
1 Wanted Scoundrels|XLN
1 Vanquisher's Banner|XLN
1 Voracious Vampire|RIX
[Sideboard]

View File

@@ -0,0 +1,32 @@
[metadata]
Name=Mavren Fein, Dusk Apostle - Legion's Landing based deck_5
[Main]
1 Baffling End|RIX
1 Bishop of the Bloodstained|XLN
1 Call to the Feast|XLN
1 Desperate Castaways|XLN
1 Dire Fleet Interloper|XLN
1 Dusk Legion Zealot|RIX
1 Duskborne Skymarcher|XLN
1 Glacial Fortress|XLN
1 Hostage Taker|XLN
2 Island|RIX
1 Ixalan's Binding|XLN
1 Jace, Cunning Castaway|XLN
1 Legion Conquistador|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Looming Altisaur|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
10 Plains|RIX
1 Radiant Destiny|RIX
1 Sadistic Skymarcher|RIX
1 Skymarcher Aspirant|RIX
1 Sunrise Seeker|XLN
4 Swamp|RIX
1 Vanquisher's Banner|XLN
1 Wakening Sun's Avatar|XLN
1 Zetalpa, Primal Dawn|RIX
[Sideboard]

View File

@@ -1,31 +1,31 @@
[metadata]
Name=Duskborne Skymarcher - Radiant Destiny based deck_2
Name=Sadistic Skymarcher - Martyr of Dusk based deck_18
[Main]
1 Bishop of Binding|RIX
1 Bishop of the Bloodstained|XLN
1 Call to the Feast|XLN
1 Champion of Dusk|RIX
1 Dusk Legion Zealot|RIX
1 Duskborne Skymarcher|XLN
1 Elenda, the Dusk Rose|RIX
1 Forerunner of the Legion|RIX
1 Ixalan's Binding|XLN
1 Kitesail Freebooter|XLN
1 Legion Conquistador|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Looming Altisaur|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
1 Pirate's Cutlass|XLN
8 Plains|RIX
1 Paladin of Atonement|RIX
1 Paladin of the Bloodstained|XLN
9 Plains|RIX
1 Queen's Commission|XLN
1 Radiant Destiny|RIX
1 Sadistic Skymarcher|RIX
1 Sanctum Seeker|XLN
1 Skymarcher Aspirant|RIX
8 Swamp|RIX
1 Temple Altisaur|RIX
1 Tetzimoc, Primal Death|RIX
1 Spreading Rot|XLN
7 Swamp|RIX
1 Unclaimed Territory|XLN
1 Vanquish the Weak|XLN
1 Vicious Conquistador|XLN
1 Zetalpa, Primal Dawn|RIX
[Sideboard]

View File

@@ -1,15 +1,13 @@
[metadata]
Name=Crashing Tide - Jadelight Ranger based deck_12
Name=Crashing Tide - Merfolk Mistbinder based deck_10
[Main]
1 Carnage Tyrant|XLN
1 Champion of Dusk|RIX
1 Admiral's Order|RIX
1 Aggressive Urge|RIX
1 Crashing Tide|RIX
1 Deeproot Elite|RIX
1 Drover of the Mighty|XLN
1 Fell Flagship|XLN
1 Deeproot Waters|XLN
7 Forest|RIX
1 Hostage Taker|XLN
5 Island|RIX
9 Island|RIX
1 Jade Bearer|RIX
1 Jadelight Ranger|RIX
1 Jungleborn Pioneer|RIX
@@ -17,17 +15,17 @@ Name=Crashing Tide - Jadelight Ranger based deck_12
1 Kumena, Tyrant of Orazca|RIX
1 Merfolk Branchwalker|XLN
1 Merfolk Mistbinder|RIX
1 Mist-Cloaked Herald|RIX
1 One With the Wind|XLN
1 Prosperous Pirates|XLN
1 Ripjaw Raptor|XLN
1 Seafloor Oracle|RIX
1 Shapers of Nature|XLN
1 Silvergill Adept|RIX
1 Siren Lookout|XLN
1 Spell Pierce|XLN
3 Swamp|RIX
1 Swift Warden|RIX
1 Tempest Caller|XLN
1 Tendershoot Dryad|RIX
1 The Immortal Sun|RIX
1 Unclaimed Territory|XLN
1 Vraska's Contempt|XLN
1 Wanted Scoundrels|XLN
1 Watertrap Weaver|XLN
[Sideboard]

View File

@@ -0,0 +1,33 @@
[metadata]
Name=Jungleborn Pioneer - Kumena, Tyrant of Orazca based deck_20
[Main]
1 Castaway's Despair|XLN
1 Chart a Course|XLN
1 Deeproot Elite|RIX
1 Deeproot Waters|XLN
1 Dusk Legion Dreadnought|XLN
6 Forest|RIX
8 Island|RIX
1 Jade Bearer|RIX
1 Jadelight Ranger|RIX
1 Jungleborn Pioneer|RIX
1 Kumena's Speaker|XLN
1 Kumena, Tyrant of Orazca|RIX
1 Lookout's Dispersal|XLN
1 Merfolk Branchwalker|XLN
1 Merfolk Mistbinder|RIX
1 Mist-Cloaked Herald|RIX
1 Plains|RIX
1 Priest of the Wakening Sun|XLN
1 Seafloor Oracle|RIX
1 Silvergill Adept|RIX
1 Snapping Sailback|XLN
1 Snubhorn Sentry|RIX
1 Spell Pierce|XLN
1 Spike-Tailed Ceratops|XLN
1 Sunpetal Grove|XLN
1 Tempest Caller|XLN
1 Unclaimed Territory|XLN
1 Vanquisher's Banner|XLN
[Sideboard]

View File

@@ -1,31 +1,31 @@
[metadata]
Name=Merfolk Mistbinder - Kumena, Tyrant of Orazca based deck_11
Name=Kumena, Tyrant of Orazca - Silvergill Adept based deck_3
[Main]
1 Aquatic Incursion|RIX
1 Carnage Tyrant|XLN
1 Crested Herdcaller|RIX
1 Atzocan Archer|XLN
1 Deeproot Elite|RIX
1 Deeproot Waters|XLN
9 Forest|RIX
7 Island|RIX
7 Forest|RIX
9 Island|RIX
1 Jace's Sentinel|XLN
1 Jade Bearer|RIX
1 Jungle Delver|XLN
1 Jungleborn Pioneer|RIX
1 Kumena's Speaker|XLN
1 Kumena, Tyrant of Orazca|RIX
1 Merfolk Branchwalker|XLN
1 Merfolk Mistbinder|RIX
1 Mist-Cloaked Herald|RIX
1 Pirate's Cutlass|XLN
1 Ripjaw Raptor|XLN
1 Overflowing Insight|XLN
1 Ravenous Daggertooth|XLN
1 River's Rebuke|XLN
1 Savage Stomp|XLN
1 Run Aground|XLN
1 Seafloor Oracle|RIX
1 Shapers of Nature|XLN
1 Silvergill Adept|RIX
1 Siren Lookout|XLN
1 Spell Pierce|XLN
1 The Immortal Sun|RIX
1 Thrashing Brontodon|RIX
1 Spike-Tailed Ceratops|XLN
1 Tendershoot Dryad|RIX
1 Unclaimed Territory|XLN
1 Vanquisher's Banner|XLN
[Sideboard]

View File

@@ -1,31 +1,31 @@
[metadata]
Name=Swift Warden - Merfolk Mistbinder based deck_2
Name=Merfolk Mistbinder - Deeproot Elite based deck_28
[Main]
1 Cherished Hatchling|RIX
1 Arcane Adaptation|XLN
1 Deadeye Quartermaster|XLN
1 Deeproot Elite|RIX
1 Deeproot Waters|XLN
1 Fell Flagship|XLN
9 Forest|RIX
7 Island|RIX
6 Forest|RIX
1 Grasping Current|XLN
10 Island|RIX
1 Jace, Ingenious Mind-Mage|XLN
1 Jade Bearer|RIX
1 Jadelight Ranger|RIX
1 Jungleborn Pioneer|RIX
1 Kopala, Warden of Waves|XLN
1 Kumena's Speaker|XLN
1 Kumena, Tyrant of Orazca|RIX
1 Merfolk Branchwalker|XLN
1 Merfolk Mistbinder|RIX
1 Mist-Cloaked Herald|RIX
1 Nezahal, Primal Tide|RIX
1 Ripjaw Raptor|XLN
1 Seafloor Oracle|RIX
1 Silvergill Adept|RIX
1 Spell Pierce|XLN
1 Swift Warden|RIX
1 Storm Fleet Spy|XLN
1 Strider Harness|RIX
1 Tendershoot Dryad|RIX
1 The Immortal Sun|RIX
1 Timestream Navigator|RIX
1 Unclaimed Territory|XLN
1 Vanquisher's Banner|XLN
1 Warkite Marauder|RIX
1 Wind Strider|XLN
[Sideboard]

View File

@@ -1,31 +1,31 @@
[metadata]
Name=Kumena, Tyrant of Orazca - Kumena's Speaker based deck_11
Name=Seafloor Oracle - Kumena's Speaker based deck_7
[Main]
1 Air Elemental|XLN
1 Aquatic Incursion|RIX
1 Carnage Tyrant|XLN
1 Commune with Dinosaurs|XLN
1 Crashing Tide|RIX
1 Deadeye Quartermaster|XLN
1 Deeproot Elite|RIX
1 Deeproot Waters|XLN
8 Forest|RIX
8 Island|RIX
1 Drover of the Mighty|XLN
1 Fleet Swallower|XLN
1 Flood of Recollection|RIX
7 Forest|RIX
1 Grasping Current|XLN
9 Island|RIX
1 Jade Bearer|RIX
1 Jadecraft Artisan|RIX
1 Jadelight Ranger|RIX
1 Jungleborn Pioneer|RIX
1 Kumena's Speaker|XLN
1 Kumena, Tyrant of Orazca|RIX
1 Merfolk Branchwalker|XLN
1 Merfolk Mistbinder|RIX
1 Mist-Cloaked Herald|RIX
1 Nezahal, Primal Tide|RIX
1 Ripjaw Raptor|XLN
1 River's Rebuke|XLN
1 Savage Stomp|XLN
1 Seafloor Oracle|RIX
1 Silvergill Adept|RIX
1 Snapping Sailback|XLN
1 Siren Lookout|XLN
1 Spell Pierce|XLN
1 Swift Warden|RIX
1 Tendershoot Dryad|RIX
1 Thundering Spineback|XLN
1 Unclaimed Territory|XLN
[Sideboard]

View File

@@ -0,0 +1,30 @@
[metadata]
Name=Swift Warden - Kumena's Speaker based deck_7
[Main]
1 Deeproot Elite|RIX
1 Deeproot Waters|XLN
1 Depths of Desire|XLN
9 Forest|RIX
1 Golden Guardian|RIX
1 Grasping Current|XLN
1 Hardy Veteran|RIX
8 Island|RIX
1 Jade Bearer|RIX
1 Jadelight Ranger|RIX
1 Jungleborn Pioneer|RIX
1 Kopala, Warden of Waves|XLN
1 Kumena's Speaker|XLN
1 Kumena, Tyrant of Orazca|RIX
1 Merfolk Branchwalker|XLN
1 Merfolk Mistbinder|RIX
1 Mist-Cloaked Herald|RIX
1 Seafloor Oracle|RIX
1 Shadowed Caravel|XLN
1 Silvergill Adept|RIX
1 Soul of the Rapids|RIX
1 Spell Pierce|XLN
1 Swift Warden|RIX
1 Verdant Sun's Avatar|XLN
1 Wildgrowth Walker|XLN
[Sideboard]

View File

@@ -1,33 +1,34 @@
[metadata]
Name=Gishath, Sun's Avatar - Commune with Dinosaurs based deck_12
Name=Gishath, Sun's Avatar - Thunderherd Migration based deck_31
[Main]
1 Atzocan Seer|RIX
1 Bishop of Binding|RIX
1 Captivating Crew|XLN
1 Blight Keeper|XLN
1 Carnage Tyrant|XLN
1 Commune with Dinosaurs|XLN
1 Deathgorge Scavenger|XLN
1 Drover of the Mighty|XLN
8 Forest|RIX
1 Ghalta, Primal Hunger|RIX
7 Forest|RIX
1 Gishath, Sun's Avatar|XLN
1 Gruesome Fate|RIX
1 Hierophant's Chalice|XLN
1 Ixalan's Binding|XLN
1 Mavren Fein, Dusk Apostle|XLN
1 Merfolk Branchwalker|XLN
3 Mountain|RIX
1 Otepec Huntmaster|XLN
2 Mountain|RIX
1 Paladin of Atonement|RIX
4 Plains|RIX
1 Ranging Raptors|XLN
1 Raptor Companion|RIX
1 Regisaur Alpha|XLN
1 Rekindling Phoenix|RIX
1 Ripjaw Raptor|XLN
1 Rootbound Crag|XLN
1 Settle the Wreckage|XLN
1 Sunpetal Grove|XLN
1 Swift Warden|RIX
1 Temple Altisaur|RIX
2 Swamp|RIX
1 Thrashing Brontodon|RIX
1 Thunderherd Migration|RIX
1 Tilonalli's Knight|XLN
1 Thundering Spineback|XLN
1 Vampire's Zeal|XLN
1 Voracious Vampire|RIX
1 Vraska's Contempt|XLN
1 Wayward Swordtooth|RIX
1 Zacama, Primal Calamity|RIX
[Sideboard]

View File

@@ -0,0 +1,34 @@
[metadata]
Name=Huatli, Warrior Poet - Drover of the Mighty based deck_16
[Main]
1 Atzocan Archer|XLN
1 Baffling End|RIX
1 Carnage Tyrant|XLN
1 Charging Monstrosaur|XLN
1 Commune with Dinosaurs|XLN
1 Crushing Canopy|XLN
1 Daring Buccaneer|RIX
1 Deathgorge Scavenger|XLN
1 Drover of the Mighty|XLN
1 Fathom Fleet Firebrand|XLN
7 Forest|RIX
1 Ghalta, Primal Hunger|RIX
1 Huatli, Warrior Poet|XLN
1 Kinjalli's Sunwing|XLN
4 Mountain|RIX
1 Otepec Huntmaster|XLN
3 Plains|RIX
1 Prying Blade|XLN
1 Ranging Raptors|XLN
1 Reckless Rage|RIX
1 Regisaur Alpha|XLN
1 Rekindling Phoenix|RIX
1 Ripjaw Raptor|XLN
1 Rootbound Crag|XLN
1 Sun Sentinel|RIX
1 Sunpetal Grove|XLN
1 Thunderherd Migration|RIX
1 Unclaimed Territory|XLN
1 Zetalpa, Primal Dawn|RIX
[Sideboard]

View File

@@ -1,33 +1,32 @@
[metadata]
Name=Savage Stomp - Carnage Tyrant based deck_2
Name=Otepec Huntmaster - Commune with Dinosaurs based deck_24
[Main]
1 Angrath, the Flame-Chained|RIX
1 Captivating Crew|XLN
1 Carnage Tyrant|XLN
1 Commune with Dinosaurs|XLN
1 Deathgorge Scavenger|XLN
1 Dire Fleet Daredevil|RIX
1 Dire Fleet Neckbreaker|RIX
1 Dire Fleet Poisoner|RIX
1 Deeproot Champion|XLN
1 Drover of the Mighty|XLN
1 Fell Flagship|XLN
1 Forerunner of the Coalition|RIX
8 Forest|RIX
11 Forest|RIX
1 Ghalta, Primal Hunger|RIX
1 Gleaming Barrier|RIX
1 Jadelight Ranger|RIX
1 Lightning Strike|XLN
1 Merfolk Branchwalker|XLN
4 Mountain|RIX
1 Otepec Huntmaster|XLN
1 Ranging Raptors|XLN
1 Ravenous Daggertooth|XLN
1 Reckless Rage|RIX
1 Regisaur Alpha|XLN
1 Rekindling Phoenix|RIX
1 Ripjaw Raptor|XLN
1 Rootbound Crag|XLN
1 Savage Stomp|XLN
3 Swamp|RIX
1 Shadowed Caravel|XLN
1 Thrashing Brontodon|RIX
1 Thunderherd Migration|RIX
1 Trove of Temptation|XLN
1 Unclaimed Territory|XLN
1 Vraska's Contempt|XLN
[Sideboard]

View File

@@ -0,0 +1,31 @@
[metadata]
Name=Regisaur Alpha - Commune with Dinosaurs based deck_30
[Main]
1 Carnage Tyrant|XLN
1 Cobbled Wings|XLN
1 Commune with Dinosaurs|XLN
1 Deathgorge Scavenger|XLN
1 Drover of the Mighty|XLN
1 Fanatical Firebrand|RIX
1 Fiery Cannonade|XLN
10 Forest|RIX
1 Ghalta, Primal Hunger|RIX
1 Hierophant's Chalice|XLN
1 Ixalli's Diviner|XLN
1 Merfolk Branchwalker|XLN
6 Mountain|RIX
1 Needletooth Raptor|RIX
1 Otepec Huntmaster|XLN
1 Overgrown Armasaur|RIX
1 Regisaur Alpha|XLN
1 Rekindling Phoenix|RIX
1 Ripjaw Raptor|XLN
1 Rootbound Crag|XLN
1 Sleek Schooner|XLN
1 Storm Fleet Pyromancer|XLN
1 Strider Harness|RIX
1 Swashbuckling|XLN
1 Thrashing Brontodon|RIX
1 Thunderherd Migration|RIX
[Sideboard]

View File

@@ -1,33 +1,32 @@
[metadata]
Name=Otepec Huntmaster - Thunderherd Migration based deck_10
Name=Savage Stomp - Ghalta, Primal Hunger based deck_2
[Main]
1 Carnage Tyrant|XLN
1 Charging Monstrosaur|XLN
1 Cobbled Wings|XLN
1 Commune with Dinosaurs|XLN
1 Deathgorge Scavenger|XLN
1 Dire Fleet Captain|XLN
1 Drover of the Mighty|XLN
7 Forest|RIX
11 Forest|RIX
1 Ghalta, Primal Hunger|RIX
1 Lightning Strike|XLN
1 Jadelight Ranger|RIX
1 Merfolk Branchwalker|XLN
4 Mountain|RIX
1 Needletooth Raptor|RIX
1 Otepec Huntmaster|XLN
1 Pirate's Cutlass|XLN
1 Ranging Raptors|XLN
1 Reckless Rage|RIX
1 Regisaur Alpha|XLN
1 Rekindling Phoenix|RIX
1 Ripjaw Raptor|XLN
1 Rootbound Crag|XLN
1 Sanctum Seeker|XLN
1 Savage Stomp|XLN
4 Swamp|RIX
1 Sleek Schooner|XLN
1 Storm Fleet Arsonist|XLN
1 Thrashing Brontodon|RIX
1 Thunderherd Migration|RIX
1 Tishana's Wayfinder|XLN
1 Traveler's Amulet|RIX
1 Unclaimed Territory|XLN
1 Vraska's Contempt|XLN
1 Vraska, Relic Seeker|XLN
1 Walk the Plank|XLN
1 Wayward Swordtooth|RIX
[Sideboard]

View File

@@ -0,0 +1,33 @@
[metadata]
Name=Azor, the Lawbringer - Skymarcher Aspirant based deck_18
[Main]
1 Aquatic Incursion|RIX
1 Azor, the Lawbringer|RIX
1 Curious Obsession|RIX
1 Deadeye Tormentor|XLN
1 Desperate Castaways|XLN
1 Dusk Legion Dreadnought|XLN
1 Duskborne Skymarcher|XLN
1 Glacial Fortress|XLN
4 Island|RIX
1 Legion Conquistador|XLN
1 Legion Lieutenant|RIX
1 Legion's Landing|XLN
1 Martyr of Dusk|RIX
1 Mavren Fein, Dusk Apostle|XLN
1 Paladin of Atonement|RIX
1 Pirate's Cutlass|XLN
9 Plains|RIX
1 Pride of Conquerors|RIX
1 Profane Procession|RIX
1 Radiant Destiny|RIX
1 Search for Azcanta|XLN
1 Settle the Wreckage|XLN
1 Shore Keeper|XLN
1 Skyblade of the Legion|XLN
1 Skymarcher Aspirant|RIX
1 Spell Swindle|XLN
2 Swamp|RIX
1 Unclaimed Territory|XLN
[Sideboard]

View File

@@ -0,0 +1,33 @@
[metadata]
Name=Tetzimoc, Primal Death - Commune with Dinosaurs based deck_19
[Main]
1 Azor's Gateway|RIX
1 Carnage Tyrant|XLN
1 Commune with Dinosaurs|XLN
1 Deathgorge Scavenger|XLN
1 Dragonskull Summit|XLN
1 Drover of the Mighty|XLN
8 Forest|RIX
1 Ghalta, Primal Hunger|RIX
1 Giltgrove Stalker|RIX
1 Jungleborn Pioneer|RIX
1 Merfolk Branchwalker|XLN
3 Mountain|RIX
1 Nest Robber|XLN
1 New Horizons|XLN
1 Reaver Ambush|RIX
1 Regisaur Alpha|XLN
1 Rekindling Phoenix|RIX
1 Ripjaw Raptor|XLN
1 Rootbound Crag|XLN
1 Storm Fleet Pyromancer|XLN
4 Swamp|RIX
1 Tetzimoc, Primal Death|RIX
1 Thrashing Brontodon|RIX
1 Thunderherd Migration|RIX
1 Treasure Map|XLN
1 Vraska's Contempt|XLN
1 Walk the Plank|XLN
1 Wayward Swordtooth|RIX
[Sideboard]

View File

@@ -0,0 +1,35 @@
[metadata]
Name=Vraska, Relic Seeker - Jadelight Ranger based deck_21
[Main]
1 Awakened Amalgam|RIX
1 Blight Keeper|XLN
1 Crested Herdcaller|RIX
1 Dead Man's Chest|RIX
1 Deadeye Brawler|RIX
1 Deathgorge Scavenger|XLN
1 Depths of Desire|XLN
1 Dire Fleet Neckbreaker|RIX
1 Drowned Catacomb|XLN
1 Field of Ruin|XLN
6 Forest|RIX
1 Giltgrove Stalker|RIX
1 Goblin Trailblazer|RIX
1 Growing Rites of Itlimoc|XLN
1 Island|RIX
1 Jadelight Ranger|RIX
1 Knight of the Stampede|RIX
1 Mark of the Vampire|XLN
1 Merfolk Branchwalker|XLN
2 Mountain|RIX
1 Old-Growth Dryads|XLN
1 Recover|RIX
1 Rekindling Phoenix|RIX
1 Rootbound Crag|XLN
1 Rummaging Goblin|XLN
1 Snapping Sailback|XLN
5 Swamp|RIX
1 Vraska's Contempt|XLN
1 Vraska's Scorn|RIX
1 Vraska, Relic Seeker|XLN
[Sideboard]

View File

@@ -571,7 +571,8 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase {
if (secondKeyCard != null) {
possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName()));
}
Iterator<PaperCard> iRandomPool = CardRanker.rankCardsInDeck(possibleList.subList(0, targetSize <= possibleList.size() ? targetSize : possibleList.size())).iterator();
//Iterator<PaperCard> iRandomPool = CardRanker.rankCardsInDeck(possibleList.subList(0, targetSize <= possibleList.size() ? targetSize : possibleList.size())).iterator();
Iterator<PaperCard> iRandomPool = possibleList.iterator();
while (deckList.size() < targetSize) {
if (logToConsole) {
System.out.println("WARNING: Fixing deck size, currently " + deckList.size() + " cards.");
@@ -805,7 +806,9 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase {
possibleList.removeAll(StaticData.instance().getCommonCards().getAllCards(secondKeyCard.getName()));
}
Collections.shuffle(possibleList);
addManaCurveCards(CardRanker.rankCardsInDeck(possibleList.subList(0, targetSize*3 <= possibleList.size() ? targetSize*3 : possibleList.size())),
//addManaCurveCards(CardRanker.rankCardsInDeck(possibleList.subList(0, targetSize*3 <= possibleList.size() ? targetSize*3 : possibleList.size())),
//num, "Random Card");
addManaCurveCards(possibleList,
num, "Random Card");
}