1
0
Fork 0
mirror of https://github.com/correl/mage.git synced 2025-04-02 03:18:09 -09:00

Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Count Andromalius 2018-03-13 12:22:24 -03:00
commit 4df90d7d51
38569 changed files with 1055382 additions and 1325528 deletions
.gitignore.travis.yml
Mage.Client
pom.xml
release/sample-decks
2011
2012/Starter Decks
2013
2014
Legacy/Championship Philadelpia
Modern/MTGO Reconstructed/Casting Emrakul on Turn Three
Standard
Commander
Decks to Beat
Duel Decks
Divine vs. Demonic
Elspeth vs. Kiora
Elspeth vs. Tezzeret
Jace vs. Chandra
Jace vs. Vraska
Nissa vs. Ob Nixilis
Venser vs. Koth
Planeswalk Decks
Top8 PT and Worlds decks (Standard)
serverlist.txt
sounds
src/main/java/mage/client

238
.gitignore vendored
View file

@ -1,99 +1,139 @@
syntax: glob
Mage.Client/*.dck
Mage.Client/db
Mage.Client/gamelogs
Mage.Client/mageclient.log
Mage.Client/plugins/images
Mage.Client/plugins/plugin.data
Mage.Client/target
Mage.Common/target
Mage.Plugins/Mage.Card.Plugin/target
Mage.Plugins/Mage.Counter.Plugin/target
Mage.Plugins/Mage.Theme.Plugin/target
Mage.Plugins/Mage.Rating.Plugin/target
Mage.Server.Console/target/
Mage.Server.Console/mageadmin.log
Mage.Server.Plugins/Mage.Deck.Constructed/target
Mage.Server.Plugins/Mage.Deck.Limited/target
Mage.Server.Plugins/Mage.Game.CommanderDuel/target
Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/target/
Mage.Server.Plugins/Mage.Game.FreeForAll/target
Mage.Server.Plugins/Mage.Game.MomirDuel/target
Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target
Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target
Mage.Server.Plugins/Mage.Player.AI.DraftBot/target
Mage.Server.Plugins/Mage.Player.AI.MA/target
Mage.Server.Plugins/Mage.Player.AI/target
Mage.Server.Plugins/Mage.Player.AIMCTS/target
Mage.Server.Plugins/Mage.Player.AIMinimax/target
Mage.Server.Plugins/Mage.Player.Human/target
Mage.Server.Plugins/Mage.Tournament.BoosterDraft/target
Mage.Server.Plugins/Mage.Tournament.Constructed/target
Mage.Server.Plugins/Mage.Tournament.Sealed/target
Mage.Server/config/init.txt
Mage.Server/saved
Mage.Server/target
Mage.Server/db
Mage.Server/cache
Mage.Server/mageserver.log
Mage.Server/magediag.log
Mage.Sets/target
Mage.Stats/server.log
Mage.Stats/mageserver.log
Mage.Stats/magediag.log
Mage.Tests/target
Mage.Tests/cache
Mage.Tests/db
Mage.Tests/Mage.log
Mage.Tests/watchdog.log
Mage/target
Mage.Updater/target
mage.updater.client/target
releases
Utils/author.txt
.DS_Store
.metadata
.project
.settings
.idea
syntax: regexp
\.class
\.jar
\.iml
\.ipr
\.iws
\.log
nbactions.xml
nbactions-*.xml
nb-configuration.xml
glob:Mage.Client/cheat.dck
glob:Mage.Client/test.dck
mage-bundle.zip
mage-stats-ws.war
Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target
\.orig\..*$
\.orig$
\.chg\..*$
\.rej$
\.conflict\~$
/Mage.Server.Plugins/Mage.Player.AIMCTS/target/
*.classpath
*.iml
hs_err*.log
/submitted
/Mage.Server/config/ai.please.cast.this.txt
/Mage.Stats/target/
/Utils/*_unimplemented.txt
*.netbeans_automatic_build
*.txt
Mage.Client/serverlist.txt
/bin/
/target/
client_secrets.json
dependency-reduced-pom.xml
syntax: glob
# Mage.Client
Mage.Client/*.dck
Mage.Client/db
Mage.Client/gamelogs
Mage.Client/gamelogsJson
Mage.Client/*.log
Mage.Client/plugins/images
Mage.Client/plugins/plugin.data
Mage.Client/target
Mage.Common/target
/db
/gamelogs
/mageclient.log
# Mage.Plugins
Mage.Plugins/Mage.Card.Plugin/target
Mage.Plugins/Mage.Counter.Plugin/target
Mage.Plugins/Mage.Theme.Plugin/target
Mage.Plugins/Mage.Rating.Plugin/target
# Mage.Server
Mage.Server/config/init.txt
Mage.Server/saved
Mage.Server/target
Mage.Server/db
Mage.Server/cache
Mage.Server/mageserver.log
Mage.Server/magediag.log
Mage.Server/extensions
/saved
/db
/cache
/mageserver.log
/magediag.log
/extensions
Mage.Server.Console/target/
Mage.Server.Console/mageadmin.log
Mage.Server.Plugins/Mage.Deck.Constructed/target
Mage.Server.Plugins/Mage.Deck.Limited/target
Mage.Server.Plugins/Mage.Game.CanadianHighlanderDuel/target
Mage.Server.Plugins/Mage.Game.CommanderDuel/target
Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/target/
Mage.Server.Plugins/Mage.Game.FreeForAll/target
Mage.Server.Plugins/Mage.Game.MomirDuel/target
Mage.Server.Plugins/Mage.Game.MomirGame/target/
Mage.Server.Plugins/Mage.Game.PennyDreadfulCommanderFreeForAll/target
Mage.Server.Plugins/Mage.Game.FreeformCommanderFreeForAll/target/
Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target
Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target
Mage.Server.Plugins/Mage.Player.AI.DraftBot/target
Mage.Server.Plugins/Mage.Player.AI.MA/target
Mage.Server.Plugins/Mage.Player.AI/target
Mage.Server.Plugins/Mage.Player.AIMCTS/target
Mage.Server.Plugins/Mage.Player.AIMinimax/target
Mage.Server.Plugins/Mage.Player.Human/target
Mage.Server.Plugins/Mage.Tournament.BoosterDraft/target
Mage.Server.Plugins/Mage.Tournament.Constructed/target
Mage.Server.Plugins/Mage.Tournament.Sealed/target
# Mage.Sets
Mage.Sets/target
# Mage.Stats
Mage.Stats/server.log
Mage.Stats/mageserver.log
Mage.Stats/magediag.log
# Mage.Tests
Mage.Tests/target
Mage.Tests/cache
Mage.Tests/db
Mage.Tests/Mage.log
Mage.Tests/watchdog.log
# Mage
Mage/target
# Mage.Updater
Mage.Updater/target
mage.updater.client/target
# Mage.Verify
Mage.Verify/target
Mage.Verify/AllCards.json.zip
Mage.Verify/AllSets.json.zip
releases
Utils/author.txt
.DS_Store
.metadata
.project
.settings
.idea
syntax: regexp
\.class
\.jar
\.iml
\.ipr
\.iws
\.log
nbactions.xml
nbactions-*.xml
nb-configuration.xml
glob:Mage.Client/cheat.dck
glob:Mage.Client/test.dck
mage-bundle.zip
mage-stats-ws.war
Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target
\.orig\..*$
\.orig$
\.chg\..*$
\.rej$
\.conflict\~$
/Mage.Server.Plugins/Mage.Player.AIMCTS/target/
*.classpath
*.iml
hs_err*.log
/submitted
/Mage.Server/config/ai.please.cast.this.txt
/Mage.Stats/target/
/Utils/*_unimplemented.txt
*.netbeans_automatic_build
*.txt
Mage.Client/serverlist.txt
/bin/
/out/
/target/
client_secrets.json
dependency-reduced-pom.xml
mage-bundle
/Mage.Client/game-*.json

5
.travis.yml Normal file
View file

@ -0,0 +1,5 @@
sudo: required
dist: trusty
language: java
before_install:
- echo "MAVEN_OPTS='-Xmx2g'" > ~/.mavenrc

View file

@ -1,201 +1,223 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.mage</groupId>
<artifactId>mage-root</artifactId>
<version>1.4.13</version>
</parent>
<groupId>org.mage</groupId>
<artifactId>mage-client</artifactId>
<packaging>jar</packaging>
<name>Mage Client</name>
<dependencies>
<dependency>
<groupId>org.mage</groupId>
<artifactId>mage</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.mage</groupId>
<artifactId>mage-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.mage</groupId>
<artifactId>mage-deck-constructed</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.googlecode.jspf</groupId>
<artifactId>jspf-core</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>net.sf.trove4j</groupId>
<artifactId>trove4j</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.mortennobel</groupId>
<artifactId>java-image-scaling</artifactId>
<version>0.8.5</version>
</dependency>
<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>swingx</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.jetlang</groupId>
<artifactId>jetlang</artifactId>
<version>0.2.9</version>
</dependency>
<dependency>
<groupId>com.jgoodies</groupId>
<artifactId>forms</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.intellij</groupId>
<artifactId>forms_rt</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mage-counter-plugin</artifactId>
<version>0.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.jdesktop</groupId>
<artifactId>beansbinding</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>swing-layout</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<artifactId>truevfs-profile-base</artifactId>
<groupId>net.java.truevfs</groupId>
<type>jar</type>
<version>0.10.8</version>
<exclusions>
<exclusion>
<artifactId>truevfs-access-swing</artifactId>
<groupId>net.java.truevfs</groupId>
</exclusion>
<exclusion>
<artifactId>truecommons-key-swing</artifactId>
<groupId>net.java.truecommons</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5-1</version>
</dependency>
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.mobicents.external.tritonus</groupId>
<artifactId>tritonus_share</artifactId>
<version>0.3.6</version>
</dependency>
<dependency>
<groupId>net.java.balloontip</groupId>
<artifactId>balloontip</artifactId>
<version>1.2.4.1</version>
</dependency>
</dependencies>
<!-- to get the reference to local repository with com\googlecode\jspf\jspf-core\0.9.1\ -->
<repositories>
<repository>
<id>local-project-repo</id>
<url>file://${project.basedir}/../repository</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${manifest.file}</manifestFile>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>mage.client.MageFrame</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/distribution.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
<finalName>mage-client</finalName>
</build>
<properties>
<manifest.file>src/main/resources/META-INF/MANIFEST.MF</manifest.file>
</properties>
</project>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.mage</groupId>
<artifactId>mage-root</artifactId>
<version>1.4.28</version>
</parent>
<groupId>org.mage</groupId>
<artifactId>mage-client</artifactId>
<packaging>jar</packaging>
<name>Mage Client</name>
<dependencies>
<dependency>
<groupId>org.mage</groupId>
<artifactId>mage</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.mage</groupId>
<artifactId>mage-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.mage</groupId>
<artifactId>mage-deck-constructed</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.googlecode.jspf</groupId>
<artifactId>jspf-core</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>net.sf.trove4j</groupId>
<artifactId>trove4j</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.mortennobel</groupId>
<artifactId>java-image-scaling</artifactId>
<version>0.8.5</version>
</dependency>
<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>swingx</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.jetlang</groupId>
<artifactId>jetlang</artifactId>
<version>0.2.9</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.286</version>
</dependency>
<dependency>
<groupId>com.jgoodies</groupId>
<artifactId>forms</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>com.intellij</groupId>
<artifactId>forms_rt</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mage-counter-plugin</artifactId>
<version>0.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.jdesktop</groupId>
<artifactId>beansbinding</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>swing-layout</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<artifactId>truevfs-profile-base</artifactId>
<groupId>net.java.truevfs</groupId>
<type>jar</type>
<version>0.10.8</version>
<exclusions>
<exclusion>
<artifactId>truevfs-access-swing</artifactId>
<groupId>net.java.truevfs</groupId>
</exclusion>
<exclusion>
<artifactId>truecommons-key-swing</artifactId>
<groupId>net.java.truecommons</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5-1</version>
</dependency>
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.mobicents.external.tritonus</groupId>
<artifactId>tritonus_share</artifactId>
<version>0.3.6</version>
</dependency>
<dependency>
<groupId>net.java.balloontip</groupId>
<artifactId>balloontip</artifactId>
<version>1.2.4.1</version>
</dependency>
<!-- svg support start -->
<!--
for "SAX2 driver class org.apache.crimson.parser.XMLReaderImpl not found" error looks here:
https://stackoverflow.com/questions/714243/sax2-driver-class-org-apache-crimson-parser-xmlreaderimpl-not-found-when-using
-->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-transcoder</artifactId>
<version>1.7</version>
</dependency>
<!-- svg support end -->
<dependency>
<groupId>org.ocpsoft.prettytime</groupId>
<artifactId>prettytime</artifactId>
<version>3.2.7.Final</version>
</dependency>
</dependencies>
<!-- to get the reference to local repository with com\googlecode\jspf\jspf-core\0.9.1\ -->
<repositories>
<repository>
<id>local-project-repo</id>
<url>file://${project.basedir}/../repository</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestFile>${manifest.file}</manifestFile>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>mage.client.MageFrame</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/distribution.xml</descriptor>
</descriptors>
</configuration>
</plugin>
</plugins>
<finalName>mage-client</finalName>
</build>
<properties>
<manifest.file>src/main/resources/META-INF/MANIFEST.MF</manifest.file>
</properties>
</project>

View file

@ -9,7 +9,7 @@ AUTHOR:WotC
1 [SOM:194] Precursor Golem
1 [SOM:205] Steel Hellkite
3 [M12:71] Phantasmal Dragon
4 [M12:41] AEther Adept
4 [M12:41] Aether Adept
1 [M12:72] Phantasmal Image
4 [M12:70] Phantasmal Bear
4 [NPH:19] Porcelain Legionnaire

View file

@ -4,7 +4,7 @@ AUTHOR:WotC
# Creature
1 [M11:8] Blinding Mage
2 [M11:41] AEther Adept
2 [M11:41] Aether Adept
2 [M11:42] Air Servant
1 [M11:44] Armored Cancrix
2 [M11:45] Augury Owl

View file

@ -8,7 +8,7 @@ AUTHOR:WotC
1 [M12:33] Serra Angel
1 [M12:34] Siege Mastodon
2 [M12:38] Stormfront Pegasus
1 [M12:41] AEther Adept
1 [M12:41] Aether Adept
2 [M12:44] Aven Fleetwing
2 [M12:47] Cancel
3 [M12:49] Coral Merfolk

View file

@ -18,7 +18,7 @@ NAME:[DKA] Grave Power
2 [ISD:211] Wreath of Geists
1 [M12:42] Alluring Siren
2 [DKA:53] Tower Geist
1 [M12:41] AEther Adept
1 [M12:41] Aether Adept
2 [DKA:117] Grim Flowering
4 [ISD:253] Island
2 [DKA:118] Hollowhenge Beast

View file

@ -9,7 +9,7 @@ NAME:Gabriel Joglar's Merfolk 2nd Place
4 [SHM:34] Cursecatcher
4 [ZEN:70] Spreading Seas
4 [LRW:74] Merrow Reejerey
2 [DST:91] AEther Vial
2 [DST:91] Aether Vial
17 [RTR:255] Island
2 [ROE:57] Coralhelm Commander
4 [LRW:86] Silvergill Adept

View file

@ -15,7 +15,7 @@ NAME:Elias Rudin's RUG Vial
3 [RAV:63] Remand
3 [DKA:140] Huntmaster of the Fells
1 [MMA:190] Kitchen Finks
4 [MMA:197] AEther Vial
4 [MMA:197] Aether Vial
1 [RTR:247] Steam Vents
3 [ZEN:220] Misty Rainforest
4 [RTR:255] Island

View file

@ -1,5 +1,5 @@
NAME:Nathan Kalsch's The God Complex
2 [DGM:11] AEtherling
2 [DGM:11] Aetherling
4 [THS:56] Nimbus Naiad
4 [RTR:215] Frostburn Weird
2 [RTR:35] Cyclonic Rift

View file

@ -1,5 +1,5 @@
NAME:Gildor Inglorion's Esper Control
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
4 [ISD:245] Nephalia Drownyard
4 [RTR:145] Azorius Charm
2 [DGM:5] Renounce the Guilds

View file

@ -1,6 +1,6 @@
NAME:Jonathan Gutierrez's Sphinx-Ghoul Revelation
1 [RTR:208] Vraska the Unseen
2 [DGM:11] AEtherling
2 [DGM:11] Aetherling
4 [RTR:243] Overgrown Tomb
4 [M13:114] Veilborn Ghoul
4 [M13:170] Farseek

View file

@ -1,5 +1,5 @@
NAME:Roy Keck's AEtheRenFerno
2 [DGM:11] AEtherling
2 [DGM:11] Aetherling
1 [ISD:115] Sever the Bloodline
1 [ISD:78] Snapcaster Mage
4 [RTR:238] Blood Crypt

View file

@ -14,4 +14,4 @@ NAME:Coleman Jackson's Advent of the Arcanist
3 [DIS:174] Hallowed Fountain
3 [DGM:51] Advent of the Wurm
4 [RTR:123] Druid's Deliverance
3 [GTC:29] AEtherize
3 [GTC:29] Aetherize

View file

@ -1,7 +1,7 @@
NAME:Michael Steidl's Planeswalker Control
2 [RTR:208] Vraska the Unseen
3 [M13:160] Arbor Elf
2 [DGM:11] AEtherling
2 [DGM:11] Aetherling
1 [CON:120] Nicol Bolas, Planeswalker
2 [RTR:44] Jace, Architect of Thought
2 [RTR:82] Ultimate Price

View file

@ -1,6 +1,6 @@
NAME:Robert Seder's Esper Control
1 [DKA:142] Sorin, Lord of Innistrad
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
4 [M13:225] Glacial Fortress
3 [ISD:83] Think Twice
3 [RTR:145] Azorius Charm

View file

@ -1,7 +1,7 @@
NAME:Andy Sipka's Esper Control
2 [DKA:142] Sorin, Lord of Innistrad
1 [RTR:250] Plains
2 [DGM:11] AEtherling
2 [DGM:11] Aetherling
4 [M13:225] Glacial Fortress
4 [RTR:145] Azorius Charm
1 [DKA:158] Vault of the Archangel

View file

@ -8,7 +8,7 @@ NAME:Louis Fata's Death and Taxes
1 [BOK:163] Umezawa's Jitte
2 [FUT:177] Horizon Canopy
4 [CMD:21] Mother of Runes
4 [MMA:197] AEther Vial
4 [MMA:197] Aether Vial
3 [M15:225] Phyrexian Revoker
10 [KTK:250] Plains
3 [LEG:248] Karakas

View file

@ -8,7 +8,7 @@ NAME:Dawn's GW Hatebears
3 [DKA:24] Thalia, Guardian of Thraben
4 [ISD:240] Ghost Quarter
2 [FUT:18] Aven Mindcensor
4 [MMA:197] AEther Vial
4 [MMA:197] Aether Vial
3 [M14:195] Scavenging Ooze
2 [DDM:84] Forest
2 [FUT:177] Horizon Canopy

View file

@ -1,5 +1,5 @@
NAME:AJ Owenss's Bant Control
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
1 [C13:341] Island
4 [RTR:145] Azorius Charm
2 [BNG:149] Kiora, the Crashing Wave

View file

@ -1,6 +1,6 @@
NAME:Hayden's Pyxis of Possibly Planeswalker-Pertaining Pandemonium
8 [C13:353] Forest
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
8 [C13:341] Island
3 [BNG:149] Kiora, the Crashing Wave
3 [THS:209] Xenagos, the Reveler

View file

@ -23,4 +23,4 @@ SB: 4 [THS:107] Thoughtseize
SB: 1 [THS:110] Whip of Erebos
SB: 2 [JOU:154] Pharika, God of Affliction
SB: 1 [KTK:81] Murderous Cut
SB: 3 [BNG:143] Unravel the AEther
SB: 3 [BNG:143] Unravel the Aether

View file

@ -0,0 +1,77 @@
1 [CMD:266] Barren Moor
1 [CMD:269] Command Tower
1 [CMD:272] Evolving Wilds
10 [CMD:315] Forest
1 [CMD:275] Golgari Rot Farm
1 [CMD:283] Orzhov Basilica
8 [CMD:299] Plains
1 [CMD:285] Rupture Spire
1 [CMD:286] Secluded Steppe
1 [CMD:287] Selesnya Sanctuary
8 [CMD:307] Swamp
1 [CMD:290] Temple of the False God
1 [CMD:292] Tranquil Thicket
1 [CMD:295] Vivid Grove
1 [CMD:296] Vivid Marsh
1 [CMD:297] Vivid Meadow
1 [CMD:141] Aquastrand Spider
1 [CMD:10] Celestial Force
1 [CMD:189] Chorus of the Conclave
1 [CMD:76] Dark Hatchling
1 [CMD:149] Deadly Recluse
1 [CMD:154] Fertilid
1 [CMD:201] Golgari Guildmage
1 [CMD:159] Hornet Queen
1 [CMD:207] Karador, Ghost Chieftain
1 [CMD:20] Monk Realist
1 [CMD:90] Nantuko Husk
1 [CMD:167] Penumbra Spider
1 [CMD:169] Sakura-Tribe Elder
1 [CMD:170] Scavenging Ooze
1 [CMD:223] Selesnya Evangel
1 [CMD:224] Selesnya Guildmage
1 [CMD:100] Shriekmaw
1 [CMD:225] Sigil Captain
1 [CMD:171] Spawnwrithe
1 [CMD:172] Spike Feeder
1 [CMD:173] Squallmonger
1 [CMD:174] Symbiotic Wurm
1 [CMD:230] Teneb, the Harvester
1 [CMD:106] Vampire Nighthawk
1 [CMD:234] Vish Kal, Blood Arbiter
1 [CMD:179] Yavimaya Elder
1 [CMD:241] Acorn Catapult
1 [CMD:2] Afterlife
1 [CMD:4] Alliance of Arms
1 [CMD:72] Attrition
1 [CMD:182] Aura Shards
1 [CMD:142] Awakening Zone
1 [CMD:144] Bestial Menace
1 [CMD:146] Cobra Trap
1 [CMD:148] Cultivate
1 [CMD:245] Darksteel Ingot
1 [CMD:192] Death Mutation
1 [CMD:78] Doom Blade
1 [CMD:156] Fists of Ironwood
1 [CMD:84] Footbottom Feast
1 [CMD:249] Golgari Signet
1 [CMD:158] Harmonize
1 [CMD:87] Hex
1 [CMD:15] Hour of Reckoning
1 [CMD:253] Lightning Greaves
1 [CMD:211] Mortify
1 [CMD:212] Necrogenesis
1 [CMD:91] Nemesis Trap
1 [CMD:23] Oblivion Ring
1 [CMD:255] Orzhov Signet
1 [CMD:258] Selesnya Signet
1 [CMD:260] Skullclamp
1 [CMD:261] Sol Ring
1 [CMD:32] Soul Snare
1 [CMD:34] Storm Herd
1 [CMD:103] Syphon Flesh
1 [CMD:175] Tribute to the Wild
1 [CMD:36] Vow of Duty
1 [CMD:107] Vow of Malice
1 [CMD:178] Vow of Wildness
SB: 1 [CMD:200] Ghave, Guru of Spores

View file

@ -0,0 +1,86 @@
1 [CMD:151] Elvish Aberration
1 [CMD:272] Evolving Wilds
1 [CMD:63] Spell Crumple
1 [CMD:150] Deadwood Treefolk
1 [CMD:197] Electrolyze
1 [CMD:153] Explosive Vegetation
1 [CMD:274] Fungal Reaches
1 [CMD:196] Edric, Spymaster of Trest
1 [CMD:155] Fierce Empath
1 [CMD:199] Firespout
1 [CMD:232] Valley Rannet
1 [CMD:276] Gruul Turf
1 [CMD:198] Fire // Ice
1 [CMD:110] Avatar of Fury
1 [CMD:68] Vow of Flight
2 [CMD:311] Mountain
1 [CMD:157] Garruk Wildspeaker
1 [CMD:113] Chain Reaction
1 [CMD:278] Izzet Boilerworks
1 [CMD:233] Vengeful Rebirth
1 [CMD:277] Homeward Path
2 [CMD:313] Mountain
1 [CMD:115] Chartooth Cougar
2 [CMD:312] Mountain
4 [CMD:315] Forest
1 [CMD:65] Trench Gorger
2 [CMD:314] Mountain
3 [CMD:317] Forest
1 [CMD:119] Disaster Radius
1 [CMD:118] Death by Dragons
3 [CMD:316] Forest
1 [CMD:190] Colossal Might
1 [CMD:181] Animar, Soul of Elements
1 [CMD:261] Sol Ring
1 [CMD:188] Call the Skybreaker
1 [CMD:143] Baloth Woodcrasher
1 [CMD:222] Savage Twister
1 [CMD:148] Cultivate
1 [CMD:269] Command Tower
1 [CMD:147] Collective Voyage
2 [CMD:304] Island
2 [CMD:303] Island
1 [CMD:226] Simic Sky Swallower
1 [CMD:306] Island
2 [CMD:305] Island
1 [CMD:219] Prophetic Bolt
1 [CMD:294] Vivid Creek
1 [CMD:40] Brainstorm
1 [CMD:250] Gruul Signet
1 [CMD:293] Vivid Crag
1 [CMD:252] Izzet Signet
1 [CMD:175] Tribute to the Wild
1 [CMD:295] Vivid Grove
1 [CMD:177] Veteran Explorer
1 [CMD:133] Rapacious One
1 [CMD:253] Lightning Greaves
1 [CMD:256] Prophetic Prism
1 [CMD:135] Spitebellows
1 [CMD:1] Artisan of Kozilek
1 [CMD:178] Vow of Wildness
1 [CMD:134] Ruination
1 [CMD:214] Nucklavee
1 [CMD:42] Conundrum Sphinx
1 [CMD:138] Vow of Lightning
1 [CMD:259] Simic Signet
1 [CMD:39] Aethersnipe
1 [CMD:290] Temple of the False God
1 [CMD:160] Hunting Pack
1 [CMD:280] Kazandu Refuge
1 [CMD:162] Invigorate
1 [CMD:161] Hydra Omnivore
1 [CMD:164] Krosan Tusker
1 [CMD:285] Rupture Spire
1 [CMD:163] Kodama's Reach
1 [CMD:166] Magus of the Vineyard
1 [CMD:122] Faultgrinder
1 [CMD:242] Armillary Sphere
1 [CMD:288] Simic Growth Chamber
1 [CMD:203] Hull Breach
1 [CMD:128] Magmatic Force
1 [CMD:204] Intet, the Dreamer
1 [CMD:56] Ray of Command
3 [CMD:318] Forest
SB: 1 [CMD:220] Riku of Two Reflections
LAYOUT MAIN:(1,10)(CMC,false,50)|([CMD:269],[CMD:272],[CMD:315],[CMD:315],[CMD:315],[CMD:315],[CMD:316],[CMD:316],[CMD:316],[CMD:317],[CMD:317],[CMD:317],[CMD:318],[CMD:318],[CMD:318],[CMD:274],[CMD:276],[CMD:277],[CMD:303],[CMD:303],[CMD:304],[CMD:304],[CMD:305],[CMD:305],[CMD:306],[CMD:278],[CMD:280],[CMD:311],[CMD:311],[CMD:312],[CMD:312],[CMD:313],[CMD:313],[CMD:314],[CMD:314],[CMD:285],[CMD:288],[CMD:290],[CMD:293],[CMD:294],[CMD:295])([CMD:40],[CMD:147],[CMD:166],[CMD:261],[CMD:177])([CMD:242],[CMD:190],[CMD:250],[CMD:203],[CMD:252],[CMD:253],[CMD:256],[CMD:222],[CMD:259],[CMD:175])([CMD:181],[CMD:148],[CMD:196],[CMD:197],[CMD:155],[CMD:199],[CMD:162],[CMD:163],[CMD:63],[CMD:68],[CMD:138],[CMD:178])([CMD:113],[CMD:42],[CMD:153],[CMD:198],[CMD:157],[CMD:56],[CMD:134])([CMD:219])([CMD:39],[CMD:143],[CMD:115],[CMD:150],[CMD:118],[CMD:151],[CMD:161],[CMD:204],[CMD:214],[CMD:133],[CMD:135],[CMD:232],[CMD:233])([CMD:188],[CMD:119],[CMD:122],[CMD:160],[CMD:164],[CMD:226])([CMD:110],[CMD:128],[CMD:65])([CMD:1])
LAYOUT SIDEBOARD:(1,1)(NONE,false,50)|([CMD:220])

View file

@ -30,7 +30,7 @@ NAME:Evasive Maneuvers
1 [C13:263] Swiftfoot Boots
1 [C13:316] Saltcrusted Steppe
1 [C13:262] Surveyor's Scope
1 [C13:176] AEthermage's Touch
1 [C13:176] Aethermage's Touch
1 [C13:137] Bane of Progress
1 [C13:319] Secluded Steppe
1 [C13:267] Thunderstaff

View file

@ -2,7 +2,7 @@ NAME:Peer Through Time
1 [C14:12] Breaching Leviathan
1 [C14:99] Brine Elemental
1 [C14:55] Crown of Doom
1 [C14:11] AEther Gale
1 [C14:11] Aether Gale
1 [C14:98] Azure Mage
1 [C14:54] Commander's Sphere
1 [C14:53] Assault Suit

View file

@ -64,7 +64,7 @@ NAME:Sworn to Darkness
1 [C14:136] Black Sun's Zenith
1 [C14:135] Bad Moon
1 [C14:134] Annihilate
1 [C14:133] AEther Snap
1 [C14:133] Aether Snap
1 [C14:298] Ghost Quarter
1 [C14:132] Abyssal Persecutor
1 [C14:250] Mind Stone

View file

@ -10,7 +10,7 @@
1 [C15:88] Blue Sun's Zenith
1 [C15:87] Blatant Thievery
1 [C15:42] Arjun, the Shifting Flame
1 [C15:85] AEtherize
1 [C15:85] Aetherize
1 [C15:151] Dragon Mage
1 [C15:153] Faithless Looting
1 [C15:275] Worn Powerstone
@ -65,7 +65,7 @@
1 [C15:29] Mizzix's Mastery
1 [C15:28] Meteor Blast
1 [C15:256] Izzet Signet
1 [C15:9] AEthersnatch
1 [C15:9] Aethersnatch
1 [C15:24] Awaken the Sky Tyrant
1 [C15:214] Counterflux
13 [C15:335] Mountain

View file

@ -0,0 +1,91 @@
1 [C16:10] Manifold Insights
1 [C16:54] Crystalline Crawler
1 [C16:293] Dreadship Reef
1 [C16:173] Tuskguard Captain
1 [C16:250] Darksteel Ingot
1 [C16:294] Evolving Wilds
1 [C16:295] Exotic Orchard
1 [C16:210] Master Biomancer
1 [C16:254] Fellwar Stone
1 [C16:298] Golgari Rot Farm
1 [C16:331] Temple of the False God
1 [C16:211] Merciless Eviction
1 [C16:255] Golgari Signet
1 [C16:332] Terramorphic Expanse
1 [C16:212] Mortify
1 [C16:335] Underground River
1 [C16:57] Abzan Falconer
1 [C16:56] Ash Barrens
1 [C16:9] Grip of Phyresis
2 [C16:337] Plains
1 [C16:338] Plains
2 [C16:339] Plains
1 [C16:99] Tezzeret's Gambit
1 [C16:217] Putrefy
1 [C16:7] Deepglow Skate
1 [C16:5] Sublime Exhalation
1 [C16:3] Orzhov Advokist
1 [C16:1] Duelist's Heritage
1 [C16:65] Elite Scaleguard
1 [C16:63] Custodi Soulbinders
1 [C16:281] Arcane Sanctum
1 [C16:62] Citadel Siege
1 [C16:282] Azorius Chancery
1 [C16:61] Cathars' Crusade
1 [C16:60] Brave the Sands
1 [C16:286] Command Tower
1 [C16:166] Scavenging Ooze
1 [C16:243] Astral Cornucopia
1 [C16:320] Sandsteppe Citadel
1 [C16:200] Ghave, Guru of Spores
1 [C16:27] Ancient Excavation
1 [C16:168] Solidarity of Heroes
1 [C16:289] Darkwater Catacombs
1 [C16:322] Seaside Citadel
1 [C16:246] Cauldron of Souls
1 [C16:248] Commander's Sphere
1 [C16:207] Juniper Order Ranger
1 [C16:328] Sungrass Prairie
1 [C16:190] Corpsejack Menace
1 [C16:32] Ikra Shidiqi, the Usurper
1 [C16:74] Reveillark
1 [C16:270] Simic Signet
1 [C16:150] Forgotten Ancient
1 [C16:194] Duneblast
1 [C16:272] Sol Ring
1 [C16:152] Hardened Scales
1 [C16:196] Enduring Scalelord
1 [C16:153] Inspiring Call
1 [C16:110] Festercreep
1 [C16:154] Kalonian Hydra
1 [C16:198] Fathom Mage
1 [C16:38] Migratory Route
1 [C16:234] Mirrorweave
1 [C16:114] Languish
1 [C16:312] Opal Palace
1 [C16:115] Necroplasm
1 [C16:236] Spitting Image
1 [C16:313] Opulent Palace
1 [C16:33] Ishai, Ojutai Dragonspeaker
1 [C16:40] Reyhan, Last of the Abzan
1 [C16:186] Bred for the Hunt
1 [C16:340] Island
2 [C16:341] Island
1 [C16:342] Island
1 [C16:100] Thrummingbird
1 [C16:144] Champion of Lambholt
1 [C16:101] Treasure Cruise
1 [C16:266] Orzhov Signet
2 [C16:343] Swamp
1 [C16:344] Swamp
2 [C16:345] Swamp
1 [C16:106] Bane of the Living
1 [C16:227] Vorel of the Hull Clade
1 [C16:44] Sylvan Reclamation
1 [C16:88] Disdainful Stroke
1 [C16:228] Vulturous Zombie
3 [C16:349] Forest
2 [C16:350] Forest
2 [C16:351] Forest
1 [C16:308] Murmuring Bosk
SB: 1 [C16:28] Atraxa, Praetors' Voice

View file

@ -0,0 +1,92 @@
1 [C16:97] Spelltwine
1 [C16:291] Dismal Backwater
1 [C16:52] Boompile
1 [C16:294] Evolving Wilds
1 [C16:295] Exotic Orchard
1 [C16:131] Past in Flames
1 [C16:175] Wall of Blossoms
1 [C16:91] Evacuation
1 [C16:132] Reforge the Soul
1 [C16:18] Frenzied Fugue
1 [C16:297] Frontier Bivouac
1 [C16:330] Swiftwater Cliffs
1 [C16:254] Fellwar Stone
1 [C16:332] Terramorphic Expanse
1 [C16:15] Parting Thoughts
1 [C16:333] Thornwood Falls
1 [C16:213] Nath of the Gilt-Leaf
1 [C16:137] Volcanic Vision
1 [C16:13] Curtains' Call
1 [C16:138] Wheel of Fate
1 [C16:56] Ash Barrens
1 [C16:11] Cruel Entertainment
1 [C16:139] Whims of the Fates
1 [C16:218] Rakdos Charm
1 [C16:19] Goblin Spymaster
1 [C16:20] Runehorn Hellkite
1 [C16:280] Whispersilk Cloak
1 [C16:165] Satyr Wayfinder
1 [C16:286] Command Tower
1 [C16:122] Chaos Warp
1 [C16:287] Crumbling Necropolis
1 [C16:27] Ancient Excavation
1 [C16:321] Savage Lands
1 [C16:124] Dragon Mage
1 [C16:201] Glint-Eye Nephilim
1 [C16:247] Chromatic Lantern
1 [C16:204] Horizon Chimera
1 [C16:248] Commander's Sphere
1 [C16:325] Shadowblood Ridge
1 [C16:326] Simic Growth Chamber
1 [C16:31] Grave Upheaval
1 [C16:193] Decimate
1 [C16:270] Simic Signet
1 [C16:151] Gamekeeper
1 [C16:272] Sol Ring
1 [C16:197] Etherium-Horn Sorcerer
1 [C16:111] Ghastly Conscription
1 [C16:112] Guiltfeeder
1 [C16:113] In Garruk's Wake
1 [C16:313] Opulent Palace
1 [C16:35] Kydele, Chosen of Kruphix
1 [C16:116] Sangromancer
1 [C16:117] Waste Not
1 [C16:238] Worm Harvest
1 [C16:315] Rakdos Carnarium
1 [C16:316] Reliquary Tower
1 [C16:318] Rugged Highlands
1 [C16:319] Rupture Spire
1 [C16:87] Devastation Tide
1 [C16:182] Bituminous Blast
1 [C16:84] Chain of Vapor
1 [C16:183] Blood Tyrant
1 [C16:184] Bloodbraid Elf
1 [C16:82] Aeon Chronicler
1 [C16:81] Academy Elite
2 [C16:340] Island
2 [C16:341] Island
1 [C16:342] Island
1 [C16:143] Burgeoning
1 [C16:188] Coiling Oracle
1 [C16:101] Treasure Cruise
1 [C16:189] Consuming Aberration
1 [C16:222] Spellheart Chimera
1 [C16:49] Vial Smasher the Fierce
2 [C16:343] Swamp
2 [C16:344] Swamp
1 [C16:345] Swamp
1 [C16:268] Rakdos Signet
1 [C16:47] Treacherous Terrain
1 [C16:104] Windfall
1 [C16:148] Far Wanderings
1 [C16:46] Thrasios, Triton Hero
1 [C16:346] Mountain
2 [C16:347] Mountain
1 [C16:348] Mountain
1 [C16:105] Army of the Damned
1 [C16:303] Jungle Hollow
2 [C16:349] Forest
2 [C16:350] Forest
1 [C16:351] Forest
1 [C16:229] Whispering Madness
SB: 1 [C16:50] Yidris, Maelstrom Wielder

View file

@ -0,0 +1,94 @@
1 [C16:290] Dimir Aqueduct
1 [C16:51] Armory Automaton
1 [C16:95] Read the Runes
1 [C16:294] Evolving Wilds
1 [C16:295] Exotic Orchard
1 [C16:92] Master of Etherium
1 [C16:252] Etched Oracle
1 [C16:253] Everflowing Chalice
1 [C16:254] Fellwar Stone
1 [C16:133] Slobad, Goblin Tinkerer
1 [C16:331] Temple of the False God
1 [C16:332] Terramorphic Expanse
1 [C16:15] Parting Thoughts
1 [C16:14] Magus of the Will
1 [C16:334] Transguild Promenade
1 [C16:136] Trash for Treasure
1 [C16:258] Ichor Wellspring
1 [C16:56] Ash Barrens
1 [C16:12] Curse of Vengeance
1 [C16:9] Grip of Phyresis
1 [C16:8] Faerie Artisans
1 [C16:337] Plains
2 [C16:338] Plains
2 [C16:339] Plains
1 [C16:6] Coastal Breach
1 [C16:64] Dispeller's Capsule
1 [C16:281] Arcane Sanctum
1 [C16:282] Azorius Chancery
1 [C16:283] Boros Garrison
1 [C16:284] Buried Ruin
1 [C16:286] Command Tower
1 [C16:287] Crumbling Necropolis
1 [C16:27] Ancient Excavation
1 [C16:244] Blinkmoth Urn
1 [C16:123] Daretti, Scrap Savant
1 [C16:288] Darksteel Citadel
1 [C16:26] Akiri, Line-Slinger
1 [C16:245] Bonehoard
1 [C16:125] Godo, Bandit Warlord
1 [C16:323] Seat of the Synod
1 [C16:203] Hanna, Ship's Navigator
1 [C16:248] Commander's Sphere
1 [C16:127] Hellkite Igniter
1 [C16:249] Cranial Plating
1 [C16:128] Hellkite Tyrant
1 [C16:206] Jor Kadeen, the Prevailer
1 [C16:76] Sanctum Gargoyle
1 [C16:31] Grave Upheaval
1 [C16:30] Bruse Tarl, Boorish Herder
1 [C16:73] Phyrexian Rebirth
1 [C16:72] Open the Vaults
1 [C16:271] Skullclamp
1 [C16:272] Sol Ring
1 [C16:273] Solemn Simulacrum
1 [C16:274] Soul of New Phyrexia
1 [C16:199] Filigree Angel
1 [C16:276] Swiftfoot Boots
1 [C16:38] Migratory Route
1 [C16:310] Mystic Monastery
1 [C16:311] Nomad Outpost
1 [C16:278] Trading Post
1 [C16:237] Thopter Foundry
1 [C16:315] Rakdos Carnarium
1 [C16:239] Trial // Error
1 [C16:319] Rupture Spire
1 [C16:43] Silas Renn, Seeker Adept
1 [C16:86] Chief Engineer
1 [C16:181] Baleful Strix
1 [C16:261] Loxodon Warhammer
1 [C16:140] Whipflare
1 [C16:262] Mycosynth Wellspring
1 [C16:263] Myr Battlesphere
2 [C16:340] Island
1 [C16:341] Island
2 [C16:342] Island
1 [C16:264] Myr Retriever
1 [C16:221] Sharuum the Hegemon
1 [C16:265] Nevinyrral's Disk
1 [C16:343] Swamp
2 [C16:344] Swamp
1 [C16:345] Swamp
1 [C16:223] Sphinx Summoner
1 [C16:102] Trinket Mage
1 [C16:224] Sydri, Galvanic Genius
1 [C16:103] Vedalken Engineer
1 [C16:269] Shimmer Myr
2 [C16:346] Mountain
1 [C16:347] Mountain
1 [C16:348] Mountain
1 [C16:89] Etherium Sculptor
1 [C16:107] Beacon of Unrest
1 [C16:109] Executioner's Capsule
1 [C16:90] Ethersworn Adjudicator
SB: 1 [C16:29] Breya, Etherium Shaper

View file

@ -0,0 +1,96 @@
1 [C16:53] Conqueror's Flail
1 [C16:292] Dragonskull Summit
1 [C16:171] Thelonite Hermit
1 [C16:172] Thunderfoot Baloth
1 [C16:294] Evolving Wilds
1 [C16:295] Exotic Orchard
1 [C16:18] Frenzied Fugue
1 [C16:176] Wild Beastmaster
1 [C16:254] Fellwar Stone
1 [C16:177] Abzan Charm
1 [C16:17] Divergent Transformations
1 [C16:16] Charging Cinderhorn
1 [C16:299] Grand Coliseum
1 [C16:134] Stalking Vengeance
1 [C16:332] Terramorphic Expanse
1 [C16:178] Ankle Shanker
1 [C16:256] Gruul Signet
1 [C16:135] Taurean Mauler
1 [C16:59] Blind Obedience
1 [C16:179] Artifact Mutation
1 [C16:214] Naya Charm
1 [C16:215] Necrogenesis
1 [C16:336] Windbrisk Heights
1 [C16:56] Ash Barrens
1 [C16:337] Plains
1 [C16:338] Plains
1 [C16:339] Plains
1 [C16:160] Quirion Explorer
1 [C16:161] Rampant Growth
1 [C16:240] Order // Chaos
1 [C16:164] Sakura-Tribe Elder
1 [C16:285] Caves of Koilos
1 [C16:286] Command Tower
1 [C16:121] Breath of Fury
1 [C16:320] Sandsteppe Citadel
1 [C16:321] Savage Lands
1 [C16:167] Shamanic Revelation
1 [C16:69] Mentor of the Meek
1 [C16:25] Stonehoof Chieftain
1 [C16:169] Sylvok Explorer
1 [C16:126] Grab the Reins
1 [C16:248] Commander's Sphere
1 [C16:23] Primeval Protector
1 [C16:22] Evolutionary Escalation
1 [C16:205] Iroas, God of Victory
1 [C16:327] Spinerock Knoll
1 [C16:208] Korozda Guildmage
1 [C16:329] Sunpetal Grove
1 [C16:209] Lavalanche
1 [C16:191] Crackling Doom
1 [C16:31] Grave Upheaval
1 [C16:192] Dauntless Escort
1 [C16:271] Skullclamp
1 [C16:272] Sol Ring
1 [C16:70] Mirror Entity
1 [C16:230] Wilderness Elemental
1 [C16:275] Sunforger
1 [C16:39] Ravos, Soultender
1 [C16:232] Zhur-Taa Druid
1 [C16:233] Everlasting Torment
1 [C16:157] Managorger Hydra
1 [C16:311] Nomad Outpost
1 [C16:158] Mycoloth
1 [C16:235] Selesnya Guildmage
1 [C16:314] Orzhov Basilica
1 [C16:118] Wight of Precinct Six
1 [C16:317] Rootbound Crag
1 [C16:119] Alesha, Who Smiles at Death
1 [C16:180] Aura Mutation
1 [C16:260] Lightning Greaves
1 [C16:185] Boros Charm
1 [C16:142] Beastmaster Ascension
1 [C16:187] Clan Defiance
1 [C16:343] Swamp
1 [C16:344] Swamp
1 [C16:345] Swamp
1 [C16:300] Gruul Turf
1 [C16:48] Tymna the Weaver
1 [C16:147] Den Protector
1 [C16:47] Treacherous Terrain
2 [C16:346] Mountain
1 [C16:347] Mountain
2 [C16:348] Mountain
1 [C16:225] Terminate
1 [C16:45] Tana, the Bloodsower
1 [C16:149] Farseek
1 [C16:226] Utter End
1 [C16:304] Jungle Shrine
1 [C16:44] Sylvan Reclamation
1 [C16:305] Karplusan Forest
2 [C16:349] Forest
1 [C16:350] Forest
2 [C16:351] Forest
1 [C16:108] Brutal Hordechief
1 [C16:307] Mosswort Bridge
SB: 1 [C16:41] Saskia the Unyielding

View file

@ -0,0 +1,92 @@
1 [C16:98] Swan Song
1 [C16:96] Reins of Power
1 [C16:170] Tempt with Discovery
1 [C16:94] Propaganda
1 [C16:294] Evolving Wilds
1 [C16:93] Minds Aglow
1 [C16:251] Empyrial Plate
1 [C16:295] Exotic Orchard
1 [C16:174] Veteran Explorer
1 [C16:130] Kazuul, Tyrant of the Cliffs
1 [C16:296] Forbidden Orchard
1 [C16:297] Frontier Bivouac
1 [C16:332] Terramorphic Expanse
1 [C16:58] Blazing Archon
1 [C16:257] Howling Mine
1 [C16:334] Transguild Promenade
1 [C16:56] Ash Barrens
1 [C16:259] Keening Stone
1 [C16:55] Prismatic Geoscope
1 [C16:216] Progenitor Mimic
2 [C16:337] Plains
2 [C16:338] Plains
1 [C16:339] Plains
1 [C16:219] Rubblehulk
1 [C16:4] Selfless Squire
1 [C16:3] Orzhov Advokist
1 [C16:2] Entrapment Maneuver
1 [C16:21] Benefactor's Draught
1 [C16:282] Azorius Chancery
1 [C16:162] Realm Seekers
1 [C16:163] Rites of Flourishing
1 [C16:241] Akroan Horse
1 [C16:120] Blasphemous Act
1 [C16:242] Assault Suit
1 [C16:286] Command Tower
1 [C16:322] Seaside Citadel
1 [C16:202] Gwafa Hazid, Profiteer
1 [C16:68] Hushwing Gryff
1 [C16:24] Seeds of Renewal
1 [C16:324] Selesnya Sanctuary
1 [C16:248] Commander's Sphere
1 [C16:67] Hoofprints of the Stag
1 [C16:204] Horizon Chimera
1 [C16:22] Evolutionary Escalation
1 [C16:66] Ghostly Prison
1 [C16:129] Humble Defector
1 [C16:75] Reverse the Sands
1 [C16:195] Edric, Spymaster of Trest
1 [C16:71] Oblation
1 [C16:272] Sol Ring
1 [C16:231] Zedruu the Greathearted
1 [C16:155] Kodama's Reach
1 [C16:156] Lurking Predators
1 [C16:38] Migratory Route
1 [C16:310] Mystic Monastery
1 [C16:277] Temple Bell
1 [C16:37] Ludevic, Necro-Alchemist
1 [C16:312] Opal Palace
1 [C16:279] Venser's Journal
1 [C16:159] Oath of Druids
1 [C16:79] Wave of Reckoning
1 [C16:34] Kraum, Ludevic's Opus
1 [C16:78] Swords to Plowshares
1 [C16:77] Sphere of Safety
1 [C16:319] Rupture Spire
1 [C16:42] Sidar Kondo of Jamuraa
1 [C16:85] Chasm Skulker
1 [C16:83] Arcane Denial
1 [C16:141] Beast Within
1 [C16:80] Windborn Muse
2 [C16:340] Island
1 [C16:341] Island
2 [C16:342] Island
1 [C16:220] Selvala, Explorer Returned
1 [C16:145] Collective Voyage
1 [C16:146] Cultivate
1 [C16:300] Gruul Turf
1 [C16:267] Psychosis Crawler
1 [C16:301] Homeward Path
1 [C16:47] Treacherous Terrain
1 [C16:302] Izzet Boilerworks
1 [C16:346] Mountain
2 [C16:347] Mountain
2 [C16:348] Mountain
1 [C16:304] Jungle Shrine
1 [C16:44] Sylvan Reclamation
1 [C16:349] Forest
2 [C16:350] Forest
2 [C16:351] Forest
1 [C16:306] Krosan Verge
1 [C16:309] Myriad Landscape
SB: 1 [C16:36] Kynaios and Tiro of Meletis

View file

@ -0,0 +1,89 @@
1 [C17:106] Corpse Augur
1 [C17:10] Galecaster Colossus
1 [C17:111] Decree of Pain
1 [C17:114] Go for the Throat
1 [C17:115] Magus of the Abyss
1 [C17:117] Necromantic Selection
1 [C17:121] Puppeteer Clique
1 [C17:12] Magus of the Mind
1 [C17:131] Chaos Warp
1 [C17:132] Comet Storm
1 [C17:13] Portal Mage
1 [C17:14] Bloodline Necromancer
1 [C17:166] Cauldron Dance
1 [C17:169] Crosis's Charm
1 [C17:16] Curse of Disturbance
1 [C17:171] Etherium-Horn Sorcerer
1 [C17:173] Havengul Lich
1 [C17:175] Izzet Chronarch
1 [C17:177] Marchesa, the Black Rose
1 [C17:178] Memory Plunder
1 [C17:180] Mercurial Chemister
1 [C17:183] Nin, the Pain Artist
1 [C17:185] Niv-Mizzet, the Firemind
1 [C17:186] Nivix Guildmage
1 [C17:18] Kindred Dominance
1 [C17:190] Rakdos Charm
1 [C17:193] Shadowmage Infiltrator
1 [C17:195] Silumgar's Command
1 [C17:199] Terminate
1 [C17:201] Vela the Night-Clad
1 [C17:206] Commander's Sphere
1 [C17:207] Darksteel Ingot
1 [C17:210] Fellwar Stone
1 [C17:217] Nevinyrral's Disk
1 [C17:21] Vindictive Lich
1 [C17:223] Sol Ring
1 [C17:229] Unstable Obelisk
1 [C17:232] Worn Powerstone
1 [C17:242] Command Tower
1 [C17:244] Crumbling Necropolis
1 [C17:245] Dimir Aqueduct
1 [C17:246] Dismal Backwater
1 [C17:248] Evolving Wilds
1 [C17:249] Exotic Orchard
1 [C17:24] Curse of Opulence
1 [C17:254] Grixis Panorama
1 [C17:256] Izzet Boilerworks
1 [C17:258] Jwar Isle Refuge
1 [C17:264] Mystifying Maze
1 [C17:26] Izzet Chemister
1 [C17:270] Rakdos Carnarium
1 [C17:283] Swiftwater Cliffs
1 [C17:284] Temple of the False God
1 [C17:285] Terramorphic Expanse
1 [C17:289] Vivid Crag
1 [C17:28] Shifting Shadow
1 [C17:290] Vivid Creek
1 [C17:292] Vivid Marsh
1 [C17:305] Mountain
1 [C17:306] Mountain
1 [C17:39] Kess, Dissident Mage
1 [C17:41] Mairsil, the Pretender
1 [C17:47] Taigam, Sidisi's Hand
1 [C17:54] Mirror of the Forebears
1 [C17:56] Path of Ancestry
1 [C17:80] Arcanis the Omnipotent
1 [C17:81] Archaeomancer
1 [C17:82] Azami, Lady of Scrolls
1 [C17:83] Body Double
1 [C17:84] Clone Legion
1 [C17:85] Harbinger of the Tides
1 [C17:86] Into the Roil
1 [C17:87] Merchant of Secrets
1 [C17:89] Opportunity
1 [C17:90] Polymorphist's Jest
1 [C17:91] Reality Shift
1 [C17:92] Sea Gate Oracle
1 [C17:93] Serendib Sorcerer
1 [C17:94] Spelltwine
1 [C17:97] Apprentice Necromancer
1 [C17:9] Curse of Verbosity
2 [C17:301] Swamp
2 [C17:302] Swamp
2 [C17:303] Swamp
2 [C17:304] Mountain
3 [C17:298] Island
3 [C17:300] Island
4 [C17:299] Island
SB: 1 [C17:38] Inalla, Archmage Ritualist

View file

@ -0,0 +1,97 @@
1 [C17:234] Arcane Sanctum
1 [C17:203] Armillary Sphere
1 [C17:161] Atarka, World Render
1 [C17:163] Bladewing the Risen
1 [C17:15] Boneyard Scourge
1 [C17:165] Broodmate Dragon
1 [C17:242] Command Tower
1 [C17:206] Commander's Sphere
1 [C17:168] Crosis, the Purger
1 [C17:133] Crucible of Fire
1 [C17:243] Crucible of the Spirit Dragon
1 [C17:244] Crumbling Necropolis
1 [C17:107] Crux of Fate
1 [C17:147] Cultivate
1 [C17:30] Curse of Bounty
1 [C17:24] Curse of Opulence
1 [C17:9] Curse of Verbosity
1 [C17:207] Darksteel Ingot
1 [C17:110] Deathbringer Regent
1 [C17:134] Dragon Tempest
1 [C17:135] Dragonlord's Servant
1 [C17:136] Dragonspeaker Shaman
1 [C17:209] Dreamstone Hedron
1 [C17:170] Dromoka, the Eternal
1 [C17:137] Earthquake
1 [C17:148] Elemental Bond
1 [C17:149] Farseek
1 [C17:211] Fist of Suns
1 [C17:307] Forest
1 [C17:308] Forest
1 [C17:309] Forest
1 [C17:4] Fortunate Few
1 [C17:37] Fractured Identity
1 [C17:251] Frontier Bivouac
1 [C17:150] Frontier Siege
1 [C17:255] Haven of the Spirit Dragon
1 [C17:138] Hellkite Charger
1 [C17:53] Herald's Horn
1 [C17:174] Intet, the Dreamer
1 [C17:298] Island
1 [C17:299] Island
1 [C17:300] Island
1 [C17:257] Jungle Shrine
1 [C17:11] Kindred Discovery
1 [C17:154] Kodama's Reach
1 [C17:176] Kolaghan, the Storm's Fury
1 [C17:215] Lightning Greaves
1 [C17:54] Mirror of the Forebears
1 [C17:88] Monastery Siege
1 [C17:263] Mystic Monastery
1 [C17:218] Nihil Spellbomb
1 [C17:184] Niv-Mizzet, Dracogenius
1 [C17:265] Nomad Outpost
1 [C17:45] O-Kagachi, Vengeful Kami
1 [C17:187] Ojutai, Soul of Winter
1 [C17:267] Opulent Palace
1 [C17:67] Orator of Ojutai
1 [C17:118] Painful Truths
1 [C17:119] Palace Siege
1 [C17:56] Path of Ancestry
1 [C17:295] Plains
1 [C17:296] Plains
1 [C17:297] Plains
1 [C17:156] Rain of Thorns
1 [C17:55] Ramos, Dragon Engine
1 [C17:141] Ryusei, the Falling Star
1 [C17:274] Sandsteppe Citadel
1 [C17:275] Savage Lands
1 [C17:191] Savage Ventmaw
1 [C17:6] Scalelord Reckoner
1 [C17:192] Scion of the Ur-Dragon
1 [C17:142] Scourge of Valkas
1 [C17:277] Seaside Citadel
1 [C17:194] Silumgar, the Drifting Death
1 [C17:223] Sol Ring
1 [C17:196] Spellbound Dragon
1 [C17:225] Steel Hellkite
1 [C17:74] Sunscorch Regent
1 [C17:301] Swamp
1 [C17:302] Swamp
1 [C17:303] Swamp
1 [C17:46] Taigam, Ojutai Master
1 [C17:198] Teneb, the Harvester
1 [C17:29] Territorial Hellkite
1 [C17:143] Tyrant's Familiar
1 [C17:144] Utvara Hellkite
1 [C17:289] Vivid Crag
1 [C17:290] Vivid Creek
1 [C17:291] Vivid Grove
1 [C17:292] Vivid Marsh
1 [C17:293] Vivid Meadow
1 [C17:49] Wasitora, Nekoru Queen
1 [C17:230] Wayfarer's Bauble
2 [C17:304] Mountain
2 [C17:305] Mountain
2 [C17:306] Mountain
SB: 1 [C17:48] The Ur-Dragon

View file

@ -0,0 +1,92 @@
1 [C17:145] Abundance
1 [C17:1] Alms Collector
1 [C17:202] Argentum Armor
1 [C17:2] Balan, Wandering Knight
1 [C17:162] Behemoth Sledge
1 [C17:235] Blighted Woodland
1 [C17:50] Bloodforged Battle-Axe
1 [C17:237] Blossoming Sands
1 [C17:242] Command Tower
1 [C17:58] Condemn
1 [C17:146] Crushing Vines
1 [C17:147] Cultivate
1 [C17:30] Curse of Bounty
1 [C17:3] Curse of Vitality
1 [C17:59] Divine Reckoning
1 [C17:209] Dreamstone Hedron
1 [C17:247] Elfhame Palace
1 [C17:248] Evolving Wilds
1 [C17:172] Fleecemane Lion
1 [C17:212] Grappling Hook
1 [C17:252] Grasslands
1 [C17:253] Graypelt Refuge
1 [C17:51] Hammer of Nazahn
1 [C17:151] Harmonize
1 [C17:213] Hedron Archive
1 [C17:52] Heirloom Blade
1 [C17:53] Herald's Horn
1 [C17:214] Hero's Blade
1 [C17:31] Hungry Lynx
1 [C17:152] Hunter's Prowess
1 [C17:61] Jareth, Leonine Titan
1 [C17:62] Jazal Goldmane
1 [C17:153] Jedit Ojanen of Efrava
1 [C17:63] Kemba, Kha Regent
1 [C17:32] Kindred Summons
1 [C17:260] Krosan Verge
1 [C17:64] Leonin Arbiter
1 [C17:65] Leonin Relic-Warder
1 [C17:66] Leonin Shikari
1 [C17:215] Lightning Greaves
1 [C17:216] Loxodon Warhammer
1 [C17:181] Mirari's Wake
1 [C17:43] Mirri, Weatherlight Duelist
1 [C17:261] Mosswort Bridge
1 [C17:262] Myriad Landscape
1 [C17:44] Nazahn, Revered Bladesmith
1 [C17:155] Nissa's Pilgrimage
1 [C17:266] Opal Palace
1 [C17:68] Oreskos Explorer
1 [C17:56] Path of Ancestry
1 [C17:188] Phantom Nishoba
1 [C17:189] Qasali Pridemage
1 [C17:33] Qasali Slingers
1 [C17:220] Quietus Spike
1 [C17:69] Raksha Golden Cub
1 [C17:157] Relic Crush
1 [C17:272] Rogue's Passage
1 [C17:71] Rout
1 [C17:273] Saltcrusted Steppe
1 [C17:278] Secluded Steppe
1 [C17:72] Seht's Tiger
1 [C17:279] Selesnya Guildgate
1 [C17:280] Selesnya Sanctuary
1 [C17:222] Skullclamp
1 [C17:223] Sol Ring
1 [C17:158] Soul's Majesty
1 [C17:73] Spirit of the Hearth
1 [C17:224] Staff of Nin
1 [C17:281] Stirring Wildwood
1 [C17:75] Sunspear Shikari
1 [C17:226] Swiftfoot Boots
1 [C17:228] Sword of Vengeance
1 [C17:227] Sword of the Animist
1 [C17:77] Taj-Nar Swordsmith
1 [C17:284] Temple of the False God
1 [C17:159] Temur Sabertooth
1 [C17:285] Terramorphic Expanse
1 [C17:286] Tranquil Expanse
1 [C17:287] Tranquil Thicket
1 [C17:34] Traverse the Outlands
1 [C17:291] Vivid Grove
1 [C17:293] Vivid Meadow
1 [C17:78] White Sun's Zenith
1 [C17:79] Wing Shards
1 [C17:160] Zendikar Resurgent
2 [C17:307] Forest
2 [C17:308] Forest
2 [C17:309] Forest
2 [C17:295] Plains
2 [C17:296] Plains
3 [C17:297] Plains
SB: 1 [C17:35] Arahbo, Roar of the World

View file

@ -0,0 +1,94 @@
1 [C17:100] Blood Tribute
1 [C17:101] Bloodhusk Ritualist
1 [C17:102] Bloodlord of Vaasgoth
1 [C17:103] Butcher of Malakir
1 [C17:104] Captivating Vampire
1 [C17:105] Consuming Vapors
1 [C17:108] Damnable Pact
1 [C17:112] Drana, Kalastria Bloodchief
1 [C17:113] Falkenrath Noble
1 [C17:114] Go for the Throat
1 [C17:116] Malakir Bloodwitch
1 [C17:120] Pawn of Ulamog
1 [C17:122] Read the Bones
1 [C17:123] Sangromancer
1 [C17:124] Sanguine Bond
1 [C17:125] Skeletal Scrying
1 [C17:126] Skeletal Vampire
1 [C17:127] Syphon Mind
1 [C17:128] Underworld Connections
1 [C17:129] Vampire Nighthawk
1 [C17:130] Vein Drinker
1 [C17:139] Outpost Siege
1 [C17:140] Rakish Heir
1 [C17:14] Bloodline Necromancer
1 [C17:164] Blood Baron of Vizkopa
1 [C17:167] Crackling Doom
1 [C17:16] Curse of Disturbance
1 [C17:179] Merciless Eviction
1 [C17:17] Kheru Mind-Eater
1 [C17:182] Mortify
1 [C17:197] Stromkirk Captain
1 [C17:200] Tithe Drinker
1 [C17:204] Blade of the Bloodchief
1 [C17:205] Boros Signet
1 [C17:207] Darksteel Ingot
1 [C17:208] Door of Destinies
1 [C17:20] Patron of the Vein
1 [C17:218] Nihil Spellbomb
1 [C17:219] Orzhov Signet
1 [C17:221] Rakdos Signet
1 [C17:222] Skullclamp
1 [C17:223] Sol Ring
1 [C17:22] Bloodsworn Steward
1 [C17:231] Well of Lost Dreams
1 [C17:232] Worn Powerstone
1 [C17:233] Akoum Refuge
1 [C17:236] Bloodfell Caves
1 [C17:238] Bojuka Bog
1 [C17:239] Boros Garrison
1 [C17:23] Crimson Honor Guard
1 [C17:240] Boros Guildgate
1 [C17:241] Cinder Barrens
1 [C17:242] Command Tower
1 [C17:248] Evolving Wilds
1 [C17:250] Forsaken Sanctuary
1 [C17:259] Kabira Crossroads
1 [C17:25] Disrupt Decorum
1 [C17:265] Nomad Outpost
1 [C17:266] Opal Palace
1 [C17:268] Orzhov Basilica
1 [C17:269] Orzhov Guildgate
1 [C17:270] Rakdos Carnarium
1 [C17:271] Rakdos Guildgate
1 [C17:276] Scoured Barrens
1 [C17:27] Kindred Charge
1 [C17:282] Stone Quarry
1 [C17:285] Terramorphic Expanse
1 [C17:288] Urborg Volcano
1 [C17:294] Wind-Scarred Crag
1 [C17:295] Plains
1 [C17:296] Plains
1 [C17:297] Plains
1 [C17:305] Mountain
1 [C17:306] Mountain
1 [C17:3] Curse of Vitality
1 [C17:40] Licia, Sanguine Tribune
1 [C17:42] Mathas, Fiend Seeker
1 [C17:52] Heirloom Blade
1 [C17:56] Path of Ancestry
1 [C17:57] Blind Obedience
1 [C17:5] Kindred Boon
1 [C17:60] Fell the Mighty
1 [C17:70] Return to Dust
1 [C17:76] Swords to Plowshares
1 [C17:8] Teferi's Protection
1 [C17:95] Ambition's Cost
1 [C17:96] Anowon, the Ruin Sage
1 [C17:98] Black Market
1 [C17:99] Blood Artist
2 [C17:304] Mountain
3 [C17:301] Swamp
2 [C17:303] Swamp
3 [C17:302] Swamp
SB: 1 [C17:36] Edgar Markov

View file

@ -33,7 +33,7 @@
1 [5ED:191] Sylvan Library
1 [CMD:269] Command Tower
1 [EXO:35] Forbid
1 [DDO:36] AEtherize
1 [DDO:36] Aetherize
1 [KTK:36] Dig Through Time
1 [RTR:141] Abrupt Decay
1 [SHM:280] Sunken Ruins

View file

@ -15,7 +15,7 @@
SB: 1 [C14:104] Cyclonic Rift
SB: 2 [THS:47] Dissolve
SB: 3 [THS:49] Gainsay
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 1 [RTR:36] Dispel
SB: 2 [M14:53] Domestication
SB: 2 [RTR:44] Jace, Architect of Thought

View file

@ -15,7 +15,7 @@
SB: 1 [C14:104] Cyclonic Rift
SB: 1 [THS:46] Curse of the Swine
SB: 4 [THS:49] Gainsay
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 2 [GTC:44] Rapid Hybridization
SB: 1 [RTR:44] Jace, Architect of Thought
SB: 3 [M14:53] Domestication

View file

@ -15,7 +15,7 @@
SB: 2 [C14:104] Cyclonic Rift
SB: 1 [THS:47] Dissolve
SB: 3 [THS:49] Gainsay
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 1 [GTC:44] Rapid Hybridization
SB: 1 [RTR:36] Dispel
SB: 2 [M14:53] Domestication

View file

@ -15,7 +15,7 @@
SB: 2 [THS:47] Dissolve
SB: 1 [THS:38] Annul
SB: 4 [THS:49] Gainsay
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 1 [GTC:44] Rapid Hybridization
SB: 1 [RTR:36] Dispel
SB: 1 [M14:53] Domestication

View file

@ -16,7 +16,7 @@ SB: 2 [C14:104] Cyclonic Rift
SB: 1 [THS:223] Nykthos, Shrine to Nyx
SB: 1 [THS:47] Dissolve
SB: 2 [THS:49] Gainsay
SB: 2 [DGM:11] AEtherling
SB: 2 [DGM:11] Aetherling
SB: 1 [RTR:36] Dispel
SB: 1 [GTC:44] Rapid Hybridization
SB: 1 [M14:53] Domestication

View file

@ -13,7 +13,7 @@
4 [THS:66] Thassa, God of the Sea
SB: 3 [THS:47] Dissolve
SB: 3 [THS:49] Gainsay
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 2 [M14:46] Claustrophobia
SB: 3 [M14:53] Domestication
SB: 2 [RTR:44] Jace, Architect of Thought

View file

@ -18,7 +18,7 @@ SB: 1 [C14:104] Cyclonic Rift
SB: 1 [THS:47] Dissolve
SB: 1 [RTR:231] Pithing Needle
SB: 2 [THS:49] Gainsay
SB: 2 [DGM:11] AEtherling
SB: 2 [DGM:11] Aetherling
SB: 2 [GTC:44] Rapid Hybridization
SB: 2 [RTR:36] Dispel
SB: 2 [M14:53] Domestication

View file

@ -13,7 +13,7 @@
21 [UNH:137] Island
4 [THS:66] Thassa, God of the Sea
SB: 1 [RTR:231] Pithing Needle
SB: 2 [DGM:11] AEtherling
SB: 2 [DGM:11] Aetherling
SB: 2 [M14:215] Ratchet Bomb
SB: 1 [M14:228] Mutavault
SB: 1 [THS:71] Triton Tactics

View file

@ -7,7 +7,7 @@
4 [RTR:201] Supreme Verdict
4 [RTR:200] Sphinx's Revelation
4 [RTR:155] Detention Sphere
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
2 [M14:228] Mutavault
1 [BNG:25] Revoke Existence
2 [M14:96] Doom Blade

View file

@ -10,7 +10,7 @@
3 [RTR:145] Azorius Charm
4 [RTR:200] Sphinx's Revelation
4 [RTR:155] Detention Sphere
2 [DGM:11] AEtherling
2 [DGM:11] Aetherling
2 [THS:90] Hero's Downfall
1 [M14:96] Doom Blade
1 [DGM:127] Far // Away

View file

@ -7,7 +7,7 @@
4 [RTR:201] Supreme Verdict
4 [RTR:200] Sphinx's Revelation
4 [RTR:155] Detention Sphere
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
2 [M14:228] Mutavault
1 [BNG:25] Revoke Existence
2 [M14:96] Doom Blade

View file

@ -11,7 +11,7 @@
1 [RTR:145] Azorius Charm
4 [RTR:200] Sphinx's Revelation
3 [RTR:155] Detention Sphere
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
3 [THS:90] Hero's Downfall
1 [M14:228] Mutavault
4 [RTR:44] Jace, Architect of Thought

View file

@ -9,7 +9,7 @@
4 [RTR:200] Sphinx's Revelation
4 [RTR:155] Detention Sphere
2 [DGM:57] Blood Baron of Vizkopa
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
2 [THS:90] Hero's Downfall
4 [RTR:44] Jace, Architect of Thought
2 [M15:52] Divination

View file

@ -8,7 +8,7 @@
3 [RTR:200] Sphinx's Revelation
4 [RTR:145] Azorius Charm
1 [RTR:155] Detention Sphere
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
4 [THS:90] Hero's Downfall
4 [M14:96] Doom Blade
4 [RTR:44] Jace, Architect of Thought
@ -20,7 +20,7 @@
SB: 2 [RTR:155] Detention Sphere
SB: 2 [DGM:57] Blood Baron of Vizkopa
SB: 1 [THS:49] Gainsay
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 1 [THS:107] Thoughtseize
SB: 2 [M15:71] Negate
SB: 2 [DGM:103] Sin Collector

View file

@ -23,7 +23,7 @@
SB: 1 [RTR:201] Supreme Verdict
SB: 1 [C13:211] Selesnya Charm
SB: 2 [M13:29] Rhox Faithmender
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 2 [RTR:148] Centaur Healer
SB: 2 [M15:51] Dissipate
SB: 1 [M13:22] Oblivion Ring

View file

@ -24,7 +24,7 @@ SB: 1 [M15:169] Back to Nature
SB: 1 [KTK:208] Temur Charm
SB: 2 [THS:112] Anger of the Gods
SB: 1 [KTK:42] Icy Blast
SB: 1 [BNG:143] Unravel the AEther
SB: 1 [BNG:143] Unravel the Aether
SB: 1 [JOU:140] Setessan Tactics
SB: 2 [M15:75] Polymorphist's Jest
SB: 2 [KTK:37] Disdainful Stroke

View file

@ -8,7 +8,7 @@
4 [RTR:200] Sphinx's Revelation
4 [RTR:155] Detention Sphere
4 [C13:275] Azorius Guildgate
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
3 [M14:228] Mutavault
4 [RTR:44] Jace, Architect of Thought
5 [UNH:136] Plains

View file

@ -8,7 +8,7 @@
3 [RTR:145] Azorius Charm
4 [RTR:200] Sphinx's Revelation
4 [C13:275] Azorius Guildgate
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
4 [M14:228] Mutavault
3 [RTR:44] Jace, Architect of Thought
4 [M15:52] Divination

View file

@ -21,7 +21,7 @@ SB: 1 [RTR:201] Supreme Verdict
SB: 2 [AVR:34] Righteous Blow
SB: 2 [ISD:27] Purify the Grave
SB: 1 [DGM:5] Renounce the Guilds
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 2 [RTR:36] Dispel
SB: 1 [RTR:44] Jace, Architect of Thought
SB: 1 [M13:22] Oblivion Ring

View file

@ -3,7 +3,7 @@
4 [DDO:35] Accumulated Knowledge
1 [DDO:34] Kiora, the Crashing Wave
1 [DDO:37] Inkwell Leviathan
1 [DDO:36] AEtherize
1 [DDO:36] Aetherize
1 [DDO:56] Simic Sky Swallower
1 [DDO:57] Urban Evolution
2 [DDO:58] Evolving Wilds

View file

@ -2,7 +2,7 @@ NAME:Tezzeret
1 [DDF:62] Elixir of Immortality
1 [DDF:63] Contagion Clasp
2 [DDF:60] Everflowing Chalice
1 [DDF:61] AEther Spellbomb
1 [DDF:61] Aether Spellbomb
1 [DDF:66] Echoing Truth
1 [DDF:67] Moonglove Extract
1 [DDF:64] Energy Chamber

View file

@ -15,7 +15,7 @@
1 [DD2:15] Riftwing Cloudskate
1 [DD2:7] Bottle Gnomes
1 [DD2:18] Brine Elemental
1 [DD2:17] AEthersnipe
1 [DD2:17] Aethersnipe
1 [DD2:19] Quicksilver Dragon
6 [DD2:31] Island
6 [DD2:32] Island

View file

@ -14,7 +14,7 @@ NAME:Jace (Jace vs. Vraska)
1 [DDM:7] Dream Stalker
1 [DDM:20] Errant Ephemeron
1 [DDM:6] Crosstown Courier
1 [DDM:5] AEther Figment
1 [DDM:5] Aether Figment
4 [DDM:40] Island
1 [DDM:4] Phantasmal Bear
1 [DDM:3] Jace's Phantasm
@ -30,7 +30,7 @@ NAME:Jace (Jace vs. Vraska)
1 [DDM:14] Phantasmal Dragon
1 [DDM:15] Body Double
4 [DDM:37] Island
1 [DDM:12] AEther Adept
1 [DDM:12] Aether Adept
1 [DDM:34] Spelltwine
1 [DDM:35] Dread Statuary
1 [DDM:13] Archaeomancer

View file

@ -0,0 +1,35 @@
1 [DDR:1] Nissa, Voice of Zendikar
2 [DDR:28] Khalni Garden
1 [DDR:29] Mosswort Bridge
2 [DDR:26] Woodborn Behemoth
2 [DDR:27] Fertile Thicket
1 [DDR:24] Walker of the Grove
1 [DDR:25] Wood Elves
2 [DDR:22] Thornweald Archer
2 [DDR:23] Vines of the Recluse
1 [DDR:20] Seek the Horizon
1 [DDR:21] Thicket Elemental
2 [DDR:19] Scythe Leopard
1 [DDR:17] Oran-Rief Invoker
1 [DDR:18] Saddleback Lagac
1 [DDR:15] Oakgnarl Warrior
1 [DDR:16] Oran-Rief Hydra
3 [DDR:35] Forest
1 [DDR:13] Natural Connection
1 [DDR:14] Nissa's Chosen
4 [DDR:33] Forest
2 [DDR:11] Gilt-Leaf Seer
3 [DDR:34] Forest
2 [DDR:12] Jaddi Lifestrider
4 [DDR:31] Forest
4 [DDR:32] Forest
1 [DDR:10] Gaea's Blessing
1 [DDR:30] Treetop Village
1 [DDR:9] Fertilid
2 [DDR:8] Elvish Visionary
1 [DDR:7] Crop Rotation
1 [DDR:6] Cloudthresher
2 [DDR:5] Civic Wayfinder
2 [DDR:4] Citanul Woodreaders
2 [DDR:3] Briarhorn
1 [DDR:2] Abundance

View file

@ -0,0 +1,35 @@
2 [DDR:48] Fetid Imp
1 [DDR:49] Foul Imp
4 [DDR:68] Swamp
1 [DDR:46] Disfigure
5 [DDR:69] Swamp
2 [DDR:47] Doom Blade
5 [DDR:66] Swamp
1 [DDR:44] Desecration Demon
4 [DDR:67] Swamp
1 [DDR:45] Despoiler of Souls
2 [DDR:42] Carrier Thrall
1 [DDR:64] Unhallowed Pact
2 [DDR:65] Leechridden Swamp
1 [DDR:43] Demon's Grasp
2 [DDR:40] Blistergrub
1 [DDR:62] Squelching Leeches
1 [DDR:41] Cadaver Imp
1 [DDR:63] Tendrils of Corruption
1 [DDR:60] Shadows of the Past
2 [DDR:61] Smallpox
1 [DDR:39] Bala Ged Scorpion
1 [DDR:37] Altar's Reap
1 [DDR:59] Renegade Demon
1 [DDR:38] Ambition's Cost
1 [DDR:57] Priest of the Blood Rite
1 [DDR:36] Ob Nixilis Reignited
2 [DDR:58] Quest for the Gravelord
1 [DDR:55] Mire's Toll
1 [DDR:56] Pestilence Demon
1 [DDR:53] Indulgent Tormentor
1 [DDR:54] Innocent Blood
2 [DDR:51] Grim Discovery
1 [DDR:52] Hideous End
1 [DDR:50] Giant Scorpion
4 [DDR:70] Swamp

View file

@ -19,7 +19,7 @@
2 [DDI:49] Fiery Hellhound
1 [DDI:67] Searing Blaze
1 [DDI:66] Vulshok Morningstar
1 [DDI:48] AEther Membrane
1 [DDI:48] Aether Membrane
1 [DDI:65] Journeyer's Kite
2 [DDI:47] Pilgrim's Eye
1 [DDI:46] Pygmy Pyrosaur

View file

@ -0,0 +1,27 @@
3 [AER:173] Renegade Map
2 [KLD:144] Armorcraft Judge
9 [KLD:263] Forest
1 [KLD:181] Engineered Might
1 [AER:149] Daredevil Dragster
1 [AER:105] Aid from the Cowl
3 [AER:7] Audacious Infiltrator
1 [AER:5] Airdrop Aeronauts
4 [AER:189] Tranquil Expanse
1 [AER:22] Solemn Recruit
2 [AER:126] Unbridled Growth
2 [AER:125] Silkweaver Elite
1 [AER:120] Prey Upon
4 [AER:186] Inspiring Roar
1 [AER:185] Ajani, Valiant Protector
2 [AER:188] Ajani's Aid
3 [AER:187] Ajani's Comrade
1 [AER:121] Ridgescale Tusker
9 [KLD:250] Plains
1 [KLD:156] Ghirapur Guide
2 [AER:180] Verdant Automaton
1 [AER:15] Deadeye Harpooner
2 [AER:117] Narnam Renegade
1 [AER:118] Natural Obsolescence
2 [AER:113] Lifecraft Cavalry
LAYOUT MAIN:(1,7)(CMC,false,50)|([KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[AER:189],[AER:189],[AER:189],[AER:189])([AER:117],[AER:117],[AER:120],[AER:173],[AER:173],[AER:173],[AER:126],[AER:126])([AER:187],[AER:187],[AER:187],[AER:7],[AER:7],[AER:7],[AER:118],[AER:180],[AER:180])([AER:149],[AER:15],[KLD:156],[AER:125],[AER:125],[AER:22])([AER:188],[AER:188],[KLD:144],[KLD:144],[AER:186],[AER:186],[AER:186],[AER:186])([AER:105],[AER:5],[KLD:181],[AER:113],[AER:113],[AER:121])([AER:185])
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|

View file

@ -0,0 +1,27 @@
11 [KLD:261] Mountain
1 [KLD:265] Chandra, Pyrogenius
2 [KLD:188] Veteran Motorist
4 [KLD:266] Flame Lash
1 [KLD:28] Skyswirl Harrier
1 [KLD:225] Ovalchase Dragster
2 [KLD:267] Liberating Combustion
3 [KLD:268] Renegade Firebrand
4 [AKH:274] Stone Quarry
1 [KLD:109] Cathartic Reunion
1 [KLD:107] Brazen Scourge
10 [KLD:250] Plains
2 [KLD:133] Spireside Infiltrator
2 [KLD:233] Sky Skiff
2 [KLD:230] Renegade Freighter
1 [KLD:132] Speedway Fanatic
2 [KLD:33] Trusty Companion
1 [KLD:198] Bomat Bazaar Barge
1 [KLD:16] Gearshift Ace
2 [KLD:2] Aerial Responder
2 [KLD:7] Built to Last
1 [KLD:236] Snare Thopter
1 [KLD:214] Fleetwheel Cruiser
1 [KLD:114] Fateful Showdown
1 [KLD:238] Weldfast Monitor
LAYOUT MAIN:(1,7)(CMC,false,50)|([KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:261],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[KLD:250],[AKH:274],[AKH:274],[AKH:274],[AKH:274])([KLD:7],[KLD:7])([KLD:109],[KLD:16],[KLD:233],[KLD:233],[KLD:132],[KLD:33],[KLD:33],[KLD:188],[KLD:188])([KLD:2],[KLD:2],[KLD:107],[KLD:268],[KLD:268],[KLD:268],[KLD:230],[KLD:230],[KLD:133],[KLD:133],[KLD:238])([KLD:198],[KLD:114],[KLD:266],[KLD:266],[KLD:266],[KLD:266],[KLD:214],[KLD:225],[KLD:236])([KLD:267],[KLD:267],[KLD:28])([KLD:265])
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|

View file

@ -0,0 +1,24 @@
1 [AKH:270] Gideon, Martial Paragon
2 [AKH:272] Gideon's Resolve
10 [AKH:250] Plains
3 [AKH:271] Companion of the Trials
1 [AKH:10] Devoted Crop-Mate
1 [AKH:31] Tah-Crop Elite
2 [AKH:29] Sparring Mummy
1 [AKH:18] Impeccable Timing
3 [AKH:17] Gust Walker
1 [AKH:16] Glory-Bound Initiate
3 [AKH:117] Ahn-Crop Crasher
2 [AKH:139] Hyena Pack
2 [AKH:129] Electrify
1 [AKH:146] Pathmaker Initiate
2 [AKH:124] Cartouche of Zeal
2 [AKH:200] Honored Crop-Captain
1 [AKH:137] Hazoret's Favor
4 [AKH:274] Stone Quarry
4 [AKH:273] Graceful Cat
3 [AKH:152] Trial of Zeal
1 [AKH:144] Nef-Crop Entangler
10 [AKH:253] Mountain
LAYOUT MAIN:(1,6)(CMC,false,50)|([AKH:274],[AKH:274],[AKH:274],[AKH:274],[AKH:250],[AKH:250],[AKH:250],[AKH:250],[AKH:250],[AKH:250],[AKH:250],[AKH:250],[AKH:250],[AKH:250],[AKH:253],[AKH:253],[AKH:253],[AKH:253],[AKH:253],[AKH:253],[AKH:253],[AKH:253],[AKH:253],[AKH:253])([AKH:124],[AKH:124])([AKH:16],[AKH:17],[AKH:17],[AKH:17],[AKH:144],[AKH:146],[AKH:200],[AKH:200],[AKH:18])([AKH:271],[AKH:271],[AKH:271],[AKH:10],[AKH:273],[AKH:273],[AKH:273],[AKH:273],[AKH:117],[AKH:117],[AKH:117],[AKH:137],[AKH:152],[AKH:152],[AKH:152])([AKH:29],[AKH:29],[AKH:31],[AKH:139],[AKH:139],[AKH:129],[AKH:129])([AKH:270],[AKH:272],[AKH:272])
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|

View file

@ -0,0 +1,26 @@
1 [AKH:160] Channeler Initiate
1 [AKH:91] Festering Mummy
1 [AKH:162] Crocodile of the Crossing
2 [AKH:89] Dune Beetle
2 [AKH:83] Cartouche of Ambition
2 [AKH:93] Gravedigger
2 [AKH:109] Splendid Agony
1 [AKH:226] Edifice of Authority
2 [AKH:79] Baleful Ammit
4 [AKH:278] Tattered Mummy
1 [AKH:234] Oracle's Vault
2 [AKH:113] Trial of Ambition
2 [AKH:277] Liliana's Influence
1 [AKH:167] Gift of Paradise
1 [AKH:244] Grasping Dunes
2 [AKH:158] Cartouche of Strength
4 [AKH:279] Foul Orchard
2 [AKH:197] Decimator Beetle
11 [AKH:252] Swamp
3 [AKH:276] Desiccated Naga
2 [AKH:166] Giant Spider
1 [AKH:232] Luxa River Shrine
9 [AKH:254] Forest
1 [AKH:275] Liliana, Death Wielder
LAYOUT MAIN:(1,8)(CMC,false,50)|([AKH:254],[AKH:254],[AKH:254],[AKH:254],[AKH:254],[AKH:254],[AKH:254],[AKH:254],[AKH:254],[AKH:279],[AKH:279],[AKH:279],[AKH:279],[AKH:244],[AKH:252],[AKH:252],[AKH:252],[AKH:252],[AKH:252],[AKH:252],[AKH:252],[AKH:252],[AKH:252],[AKH:252],[AKH:252])([AKH:91])([AKH:160],[AKH:89],[AKH:89],[AKH:278],[AKH:278],[AKH:278],[AKH:278],[AKH:113],[AKH:113])([AKH:79],[AKH:79],[AKH:83],[AKH:83],[AKH:158],[AKH:158],[AKH:276],[AKH:276],[AKH:276],[AKH:226],[AKH:167],[AKH:232],[AKH:109],[AKH:109])([AKH:162],[AKH:166],[AKH:166],[AKH:93],[AKH:93],[AKH:234])([AKH:197],[AKH:197])([AKH:277],[AKH:277])([AKH:275])
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|

View file

@ -0,0 +1,24 @@
4 [KLD:272] Terrain Elemental
2 [KLD:273] Verdant Crescendo
2 [KLD:141] Appetite for the Unnatural
1 [KLD:270] Nissa, Nature's Artisan
2 [KLD:171] Thriving Rhino
2 [KLD:161] Longtusk Cub
3 [KLD:271] Guardian of the Great Conduit
2 [KLD:53] Janjeet Sentry
1 [KLD:167] Riparian Tiger
3 [KLD:145] Attune with Aether
2 [KLD:54] Long-Finned Skywhale
2 [KLD:142] Arborback Stomper
4 [KLD:274] Woodland Stream
11 [KLD:263] Forest
2 [KLD:66] Thriving Turtle
2 [KLD:55] Malfunction
8 [KLD:253] Island
2 [KLD:180] Empyreal Voyager
1 [KLD:39] Aethersquall Ancient
1 [KLD:168] Sage of Shaila's Claim
2 [KLD:169] Servant of the Conduit
1 [KLD:147] Bristling Hydra
LAYOUT MAIN:(1,8)(CMC,false,50)|([KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:263],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:274],[KLD:274],[KLD:274],[KLD:274])([KLD:145],[KLD:145],[KLD:145],[KLD:66],[KLD:66])([KLD:161],[KLD:161],[KLD:168],[KLD:169],[KLD:169],[KLD:272],[KLD:272],[KLD:272],[KLD:272])([KLD:141],[KLD:141],[KLD:180],[KLD:180],[KLD:53],[KLD:53],[KLD:171],[KLD:171])([KLD:147],[KLD:271],[KLD:271],[KLD:271],[KLD:54],[KLD:54],[KLD:55],[KLD:55],[KLD:273],[KLD:273])([KLD:142],[KLD:142],[KLD:167])([KLD:270])([KLD:39])
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|

View file

@ -0,0 +1,27 @@
3 [AER:193] Tezzeret's Simulacrum
4 [AER:192] Pendulum of Patterns
1 [AER:151] Foundry Assembler
4 [AER:194] Submerged Boneyard
2 [AER:191] Tezzeret's Betrayal
1 [AER:190] Tezzeret, Master of Metal
1 [AER:42] Reverse Engineer
1 [AER:167] Ornithopter
1 [AER:65] Ironclad Revolutionary
1 [KLD:207] Dukhara Peafowl
1 [AER:163] Merchant's Dockhand
1 [AER:144] Barricade Breaker
2 [AER:143] Augmenting Automaton
1 [AER:41] Quicksmith Spy
2 [KLD:74] Dhund Operative
1 [AER:58] Fen Hauler
11 [KLD:253] Island
2 [AER:138] Tezzeret's Touch
10 [KLD:258] Swamp
2 [AER:178] Universal Solvent
2 [AER:156] Implement of Examination
2 [AER:50] Wind-Kin Raiders
1 [AER:177] Treasure Keeper
2 [AER:30] Bastion Inventor
1 [KLD:80] Essence Extraction
LAYOUT MAIN:(1,8)(CMC,false,50)|([KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[KLD:253],[AER:167],[AER:194],[AER:194],[AER:194],[AER:194],[KLD:258],[KLD:258],[KLD:258],[KLD:258],[KLD:258],[KLD:258],[KLD:258],[KLD:258],[KLD:258],[KLD:258])([AER:143],[AER:143],[AER:163],[AER:178],[AER:178])([KLD:74],[KLD:74],[AER:192],[AER:192],[AER:192],[AER:192])([KLD:80],[AER:156],[AER:156],[AER:193],[AER:193],[AER:193],[AER:138],[AER:138])([KLD:207],[AER:41],[AER:177])([AER:151],[AER:42],[AER:191],[AER:191])([AER:30],[AER:30],[AER:65],[AER:190],[AER:50],[AER:50])([AER:144],[AER:58])
LAYOUT SIDEBOARD:(0,0)(NONE,false,50)|

View file

@ -25,7 +25,7 @@ SB: 1 [KTK:174] Duneblast
SB: 1 [M15:103] Liliana Vess
SB: 2 [KTK:81] Murderous Cut
SB: 1 [KTK:8] End Hostilities
SB: 1 [BNG:143] Unravel the AEther
SB: 1 [BNG:143] Unravel the Aether
SB: 3 [BNG:65] Drown in Sorrow
SB: 1 [M15:18] Mass Calcify
SB: 2 [M15:187] Nissa, Worldwaker

View file

@ -3,7 +3,7 @@
3 [MMA:198] Arcbound Ravager
1 [HOP:136] Seat of the Synod
4 [MRD:62] Disciple of the Vault
4 [DST:91] AEther Vial
4 [DST:91] Aether Vial
2 [MRD:286] Vault of Whispers
1 [FNMP:105] Myr Enforcer
1 [DDF:40] Arcbound Worker

View file

@ -13,7 +13,7 @@
21 [UNH:137] Island
4 [THS:66] Thassa, God of the Sea
SB: 1 [RTR:231] Pithing Needle
SB: 2 [DGM:11] AEtherling
SB: 2 [DGM:11] Aetherling
SB: 2 [M14:215] Ratchet Bomb
SB: 1 [THS:71] Triton Tactics
SB: 3 [M15:83] Wall of Frost

View file

@ -15,7 +15,7 @@
SB: 1 [THS:57] Omenspeaker
SB: 1 [THS:47] Dissolve
SB: 3 [THS:49] Gainsay
SB: 2 [DGM:11] AEtherling
SB: 2 [DGM:11] Aetherling
SB: 3 [GTC:44] Rapid Hybridization
SB: 3 [RTR:44] Jace, Architect of Thought
SB: 2 [M15:71] Negate

View file

@ -8,7 +8,7 @@
3 [RTR:200] Sphinx's Revelation
4 [RTR:145] Azorius Charm
1 [RTR:155] Detention Sphere
1 [DGM:11] AEtherling
1 [DGM:11] Aetherling
4 [THS:90] Hero's Downfall
4 [M14:96] Doom Blade
4 [RTR:44] Jace, Architect of Thought
@ -20,7 +20,7 @@
SB: 2 [RTR:155] Detention Sphere
SB: 2 [DGM:57] Blood Baron of Vizkopa
SB: 1 [THS:49] Gainsay
SB: 1 [DGM:11] AEtherling
SB: 1 [DGM:11] Aetherling
SB: 1 [THS:107] Thoughtseize
SB: 2 [M15:71] Negate
SB: 2 [DGM:103] Sin Collector

View file

@ -16,7 +16,7 @@
2 [THS:188] Ashiok, Nightmare Weaver
1 [BNG:163] Temple of Enlightenment
1 [BNG:65] Drown in Sorrow
1 [M15:44] AEtherspouts
1 [M15:44] Aetherspouts
1 [DTK:124] Ultimate Price
3 [M15:224] Perilous Vault
4 [FRF:168] Dismal Backwater
@ -25,7 +25,7 @@
2 [JOU:82] Silence the Believers
3 [M15:245] Radiant Fountain
SB: 1 [JOU:43] Interpret the Signs
SB: 1 [M15:44] AEtherspouts
SB: 1 [M15:44] Aetherspouts
SB: 1 [KTK:49] Pearl Lake Ancient
SB: 1 [FRF:87] Tasigur, the Golden Fang
SB: 1 [KTK:218] Cranial Archive

View file

@ -1,7 +1,7 @@
XMage.de 1 (Europe/Germany) fast :xmage.de:17171
woogerworks (North America/USA) :xmage.woogerworks.com:17171
XMage Testserver (Europe/France) 1.4.8v0 :176.31.186.181:17171
XMage BR (South America/Brazil) :ec2-54-233-67-0.sa-east-1.compute.amazonaws.com:17171
old xmage.de (Europe/Germany) :185.3.232.200:17171
xmage.us (North America/USA) :xmage.us:17171
XMage Players MTG:xmageplayersmtg.ddns.net:17171
XMage.tahiti :xmage.tahiti.one:443
Seedds Server (Asia) :115.29.203.80:17171
localhost -> connect to your local server (must be started):localhost:17171

Binary file not shown.

View file

@ -26,8 +26,8 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="desktopPane" alignment="0" max="32767" attributes="0"/>
<Component id="mageToolbar" alignment="0" pref="697" max="32767" attributes="0"/>
<Component id="desktopPane" alignment="0" pref="769" max="32767" attributes="0"/>
<Component id="mageToolbar" alignment="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
@ -78,9 +78,13 @@
<SubComponents>
<Component class="javax.swing.JButton" name="btnPreferences">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/preferences.png"/>
</Property>
<Property name="text" type="java.lang.String" value="Preferences"/>
<Property name="toolTipText" type="java.lang.String" value="By changing the settings in the preferences window you can adjust the look and behaviour of xmage."/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
@ -91,35 +95,29 @@
</Component>
<Component class="javax.swing.JButton" name="btnConnect">
<Properties>
<Property name="text" type="java.lang.String" value="Connect"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/connect.png"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Connect to or disconnect from a XMage server."/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnConnectActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
</Component>
<Component class="javax.swing.JButton" name="btnGames">
<Properties>
<Property name="text" type="java.lang.String" value="Games"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnGamesActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator1">
</Component>
<Component class="javax.swing.JButton" name="btnDeckEditor">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/deck_editor.png"/>
</Property>
<Property name="text" type="java.lang.String" value="Deck Editor"/>
<Property name="toolTipText" type="java.lang.String" value="Start the deck editor to create or modify decks."/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
@ -130,9 +128,13 @@
</Component>
<Component class="javax.swing.JButton" name="btnCollectionViewer">
<Properties>
<Property name="text" type="java.lang.String" value="Collection Viewer"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/collection.png"/>
</Property>
<Property name="text" type="java.lang.String" value="Viewer"/>
<Property name="toolTipText" type="java.lang.String" value="Card viewer to show the cards of sets. "/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
@ -143,9 +145,13 @@
</Component>
<Component class="javax.swing.JButton" name="btnSendFeedback">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/feedback.png"/>
</Property>
<Property name="text" type="java.lang.String" value="Feedback"/>
<Property name="toolTipText" type="java.lang.String" value="Send some feedback to the developers."/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
@ -154,11 +160,49 @@
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator6">
</Component>
<Component class="javax.swing.JButton" name="btnSymbols">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/symbol.png"/>
</Property>
<Property name="text" type="java.lang.String" value="Symbols"/>
<Property name="toolTipText" type="java.lang.String" value="&lt;HTML&gt;Load the mana and other card symbols from the internet.&lt;br&gt;&#xa;Otherwise you only see the replacement sequence like {U} for blue mana symbol.&lt;br&gt;&#xa;You need to do that only once."/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnSymbolsActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparatorSymbols">
</Component>
<Component class="javax.swing.JButton" name="btnImages">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/images.png"/>
</Property>
<Property name="text" type="java.lang.String" value="Images"/>
<Property name="toolTipText" type="java.lang.String" value="&lt;HTML&gt;Load card images from external sources."/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnImagesActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparatorImages">
</Component>
<Component class="javax.swing.JButton" name="btnAbout">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/about.png"/>
</Property>
<Property name="text" type="java.lang.String" value="About"/>
<Property name="toolTipText" type="java.lang.String" value="Some information about the developers."/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
@ -167,30 +211,15 @@
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator7">
</Component>
<Component class="javax.swing.JButton" name="btnExit">
<Properties>
<Property name="text" type="java.lang.String" value="Exit"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnExitActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="jMemUsageLabel">
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/menu/memory.png"/>
</Property>
<Property name="text" type="java.lang.String" value="100% Free mem"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_AddingCodePre" type="java.lang.String" value="mageToolbar.add(Box.createHorizontalGlue());"/>
</AuxValues>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator8">
</Component>
<Component class="javax.swing.JLabel" name="lblStatus">
<Properties>
<Property name="text" type="java.lang.String" value="Not connected "/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="4"/>
</Properties>
</Component>
</SubComponents>

File diff suppressed because it is too large Load diff

View file

@ -35,38 +35,32 @@ package mage.client;
import java.awt.AWTEvent;
import java.awt.KeyboardFocusManager;
import java.beans.PropertyVetoException;
import javax.swing.plaf.basic.BasicInternalFrameUI;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public abstract class MagePane extends javax.swing.JInternalFrame {
public abstract class MagePane extends javax.swing.JLayeredPane {
private String title = "no title set";
/**
* Creates new form MagePane
*/
public MagePane() {
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
initComponents();
hideTitle();
}
private void hideTitle() {
if (ui instanceof BasicInternalFrameUI) {
((BasicInternalFrameUI) ui).setNorthPane(null);
}
}
public void changeGUISize() {
}
@Override
public void updateUI() {
super.updateUI();
hideTitle();
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void hideFrame() {
@ -75,11 +69,6 @@ public abstract class MagePane extends javax.swing.JInternalFrame {
public void removeFrame() {
KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
try {
this.setClosed(true);
} catch (PropertyVetoException ex) {
}
MageFrame.deactivate(this);
MageFrame.getDesktop().remove(this);
}
@ -106,18 +95,6 @@ public abstract class MagePane extends javax.swing.JInternalFrame {
setBorder(null);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 765, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 476, Short.MAX_VALUE)
);
pack();
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables

View file

@ -0,0 +1,340 @@
package mage.client;
import java.util.*;
import mage.cards.decks.DeckCardLists;
import mage.client.chat.LocalCommands;
import mage.client.dialog.PreferencesDialog;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
import mage.game.match.MatchOptions;
import mage.game.tournament.TournamentOptions;
import mage.players.PlayerType;
import mage.players.net.UserData;
import mage.remote.Connection;
import mage.remote.MageRemoteException;
import mage.remote.Session;
import mage.remote.SessionImpl;
import mage.view.*;
/**
* Created by IGOUDT on 15-9-2016.
*/
public final class SessionHandler {
private static Session session;
public static void startSession(MageFrame mageFrame) {
session = new SessionImpl(mageFrame);
session.setJsonLogActive("true".equals(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_LOG_AUTO_SAVE, "true")));
}
public static void ping() {
session.ping();
}
public static Session getSession() {
return session;
}
public static boolean isConnected() {
return session.isConnected();
}
public static String getVersionInfo() {
return session.getVersionInfo();
}
public static boolean connect(Connection connection) {
return session.connect(connection);
}
public static boolean stopConnecting() {
return session.stopConnecting();
}
public static void disconnect(boolean showmessage) {
session.disconnect(showmessage);
}
public static void sendPlayerAction(PlayerAction playerAction, UUID gameId, Object relatedUserId) {
session.sendPlayerAction(playerAction, gameId, relatedUserId);
}
public static void quitTournament(UUID tournamentId) {
session.quitTournament(tournamentId);
}
public static void quitDraft(UUID tournamentId) {
session.quitDraft(tournamentId);
}
public static void quitMatch(UUID gameId) {
session.quitMatch(gameId);
}
public static void stopWatching(UUID gameId) {
session.stopWatching(gameId);
}
public static void removeTable(UUID roomId, UUID tableId) {
session.removeTable(roomId, tableId);
}
public static void stopReplay(UUID gameId) {
session.stopReplay(gameId);
}
public static void sendPlayerUUID(UUID gameId, UUID id) {
session.sendPlayerUUID(gameId, id);
}
public static void sendPlayerBoolean(UUID gameId, boolean b) {
session.sendPlayerBoolean(gameId, b);
}
public static PlayerType[] getPlayerTypes() {
return session.getPlayerTypes();
}
public static boolean joinTournamentTable(UUID roomId, UUID tableId, String text, PlayerType selectedItem, Integer integer, DeckCardLists deckCardLists, String s) {
return session.joinTournamentTable(roomId, tableId, text, selectedItem, integer, deckCardLists, s);
}
public static void sendPlayerInteger(UUID gameId, int data) {
session.sendPlayerInteger(gameId, data);
}
public static void sendPlayerString(UUID gameId, String data) {
session.sendPlayerString(gameId, data);
}
public static boolean sendFeedback(String title, String type, String message, String email) {
return session.sendFeedback(title, type, message, email);
}
public static void swapSeats(UUID roomId, UUID tableId, int row, int targetrow) {
session.swapSeats(roomId, tableId, row, targetrow);
}
public static boolean leaveTable(UUID roomId, UUID tableId) {
return session.leaveTable(roomId, tableId);
}
public static void updatePreferencesForServer(UserData userData) {
session.updatePreferencesForServer(userData);
}
public static boolean isTableOwner(UUID roomId, UUID tableId) {
return session.isTableOwner(roomId, tableId);
}
public static Optional<UUID> getTableChatId(UUID tableId) {
return session.getTableChatId(tableId);
}
public static boolean startTournament(UUID roomId, UUID tableId) {
return session.startTournament(roomId, tableId);
}
public static boolean startMatch(UUID roomId, UUID tableId) {
return session.startMatch(roomId, tableId);
}
public static Optional<UUID> getGameChatId(UUID gameId) {
return session.getGameChatId(gameId);
}
public static boolean joinGame(UUID gameId) {
return session.joinGame(gameId);
}
public static boolean startReplay(UUID gameId) {
return session.startReplay(gameId);
}
public static void watchTournamentTable(UUID tableId) {
session.watchTournamentTable(tableId);
}
public static boolean joinTournament(UUID tournamentId) {
return session.joinTournament(tournamentId);
}
public static Optional<UUID> getTournamentChatId(UUID tournamentId) {
return session.getTournamentChatId(tournamentId);
}
public static TournamentView getTournament(UUID tournamentId) {
try {
return session.getTournament(tournamentId);
} catch (MageRemoteException e) {
e.printStackTrace();
return null;
}
}
public static String getUserName() {
return session.getUserName();
}
public static boolean watchGame(UUID gameId) {
return session.watchGame(gameId);
}
public static void nextPlay(UUID gameId) {
session.nextPlay(gameId);
}
public static void previousPlay(UUID gameId) {
session.previousPlay(gameId);
}
public static void skipForward(UUID gameId, int i) {
session.skipForward(gameId, i);
}
public static boolean isTestMode() {
return session.isTestMode();
}
public static void cheat(UUID gameId, UUID playerId, DeckCardLists deckCardLists) {
session.cheat(gameId, playerId, deckCardLists);
}
public static String getSessionId() {
return session.getSessionId();
}
public static List<TournamentTypeView> getTournamentTypes() {
return session.getTournamentTypes();
}
public static boolean submitDeck(UUID tableId, DeckCardLists deckCardLists) {
return session.submitDeck(tableId, deckCardLists);
}
public static String[] getDeckTypes() {
return session.getDeckTypes();
}
public static String[] getDraftCubes() {
return session.getDraftCubes();
}
public static List<GameTypeView> getTournamentGameTypes() {
return session.getTournamentGameTypes();
}
public static TableView createTournamentTable(UUID roomId, TournamentOptions tOptions) {
return session.createTournamentTable(roomId, tOptions);
}
public static TableView createTable(UUID roomId, MatchOptions options) {
return session.createTable(roomId, options);
}
public static boolean joinTable(UUID roomId, UUID tableId, String playerName, PlayerType human, int skill, DeckCardLists deckCardLists, String text) {
return session.joinTable(roomId, tableId, playerName, human, skill, deckCardLists, text);
}
public static List<GameTypeView> getGameTypes() {
return session.getGameTypes();
}
public static boolean joinDraft(UUID draftId) {
return session.joinDraft(draftId);
}
public static DraftPickView sendCardPick(UUID draftId, UUID id, Set<UUID> cardsHidden) {
return session.sendCardPick(draftId, id, cardsHidden);
}
public static void sendCardMark(UUID draftId, UUID id) {
session.sendCardMark(draftId, id);
}
public static Optional<UUID> getRoomChatId(UUID roomId) {
return session.getRoomChatId(roomId);
}
public static Collection<RoomUsersView> getRoomUsers(UUID roomId) {
try {
return session.getRoomUsers(roomId);
} catch (MageRemoteException e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public static Collection<MatchView> getFinishedMatches(UUID roomId) {
try {
return session.getFinishedMatches(roomId);
} catch (MageRemoteException e) {
e.printStackTrace();
return new ArrayList<>();
}
}
public static void replayGame(UUID id) {
session.replayGame(id);
}
public static void watchTable(UUID roomId, UUID tableId) {
session.watchTable(roomId, tableId);
}
public static Collection<TableView> getTables(UUID roomId) {
try {
return session.getTables(roomId);
} catch (MageRemoteException e) {
e.printStackTrace();
return new ArrayList<>();
}
}
public static List<String> getServerMessages() {
return session.getServerMessages();
}
public static boolean joinChat(UUID chatId) {
return session.joinChat(chatId);
}
public static boolean leaveChat(UUID chatId) {
return session.leaveChat(chatId);
}
public static boolean sendChatMessage(UUID chatId, String text) {
if (!LocalCommands.handleLocalCommands(chatId, text)) {
return session.sendChatMessage(chatId, text);
} else {
return false;
}
}
public static boolean sendPlayerManaType(UUID gameId, UUID playerId, ManaType data) {
return session.sendPlayerManaType(gameId, playerId, data);
}
public static Optional<TableView> getTable(UUID roomId, UUID tableId) {
return session.getTable(roomId, tableId);
}
public static void updateDeck(UUID tableId, DeckCardLists deckCardLists) {
session.updateDeck(tableId, deckCardLists);
}
public static boolean emailAuthToken(Connection connection) {
return session.emailAuthToken(connection);
}
public static boolean resetPassword(Connection connection) {
return session.resetPassword(connection);
}
public static boolean register(Connection connection) {
return session.register(connection);
}
}

View file

@ -81,7 +81,7 @@ public class BigCard extends JComponent {
public BigCard(boolean rotated) {
initComponents();
if (!Plugins.getInstance().isCardPluginLoaded()) {
if (!Plugins.instance.isCardPluginLoaded()) {
initBounds(rotated);
}
setDoubleBuffered(true);
@ -111,7 +111,7 @@ public class BigCard extends JComponent {
image = TransformedImageCache.getResizedImage((BufferedImage)image, getWidth(), getHeight());
}
if (this.cardId == null || !enlargeMode.equals(this.enlargeMode) || !this.cardId.equals(cardId)) {
if (this.cardId == null || enlargeMode != this.enlargeMode || !this.cardId.equals(cardId)) {
if (this.panel != null) {
remove(this.panel);
}
@ -141,7 +141,7 @@ public class BigCard extends JComponent {
try {
for (String line : strings) {
doc.insertString(doc.getLength(), line + "\n", doc.getStyle("regular"));
doc.insertString(doc.getLength(), line + '\n', doc.getStyle("regular"));
}
} catch (BadLocationException ble) {
}

View file

@ -33,52 +33,12 @@
*/
package mage.client.cards;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;
import mage.cards.CardDimensions;
import mage.cards.MagePermanent;
import mage.cards.Sets;
import mage.cards.TextPopup;
import mage.cards.action.ActionCallback;
import mage.client.MageFrame;
import static mage.client.constants.Constants.CONTENT_MAX_XOFFSET;
import static mage.client.constants.Constants.FRAME_MAX_HEIGHT;
import static mage.client.constants.Constants.FRAME_MAX_WIDTH;
import static mage.client.constants.Constants.NAME_FONT_MAX_SIZE;
import static mage.client.constants.Constants.NAME_MAX_YOFFSET;
import static mage.client.constants.Constants.POWBOX_TEXT_MAX_LEFT;
import static mage.client.constants.Constants.POWBOX_TEXT_MAX_TOP;
import static mage.client.constants.Constants.SYMBOL_MAX_XOFFSET;
import static mage.client.constants.Constants.SYMBOL_MAX_YOFFSET;
import static mage.client.constants.Constants.TYPE_MAX_YOFFSET;
import mage.client.game.PlayAreaPanel;
import mage.client.util.Config;
import mage.client.util.DefaultActionCallback;
@ -86,12 +46,21 @@ import mage.client.util.ImageHelper;
import mage.client.util.gui.ArrowBuilder;
import mage.constants.CardType;
import mage.constants.EnlargeMode;
import mage.remote.Session;
import mage.view.AbilityView;
import mage.view.CardView;
import mage.view.CounterView;
import mage.view.PermanentView;
import mage.view.StackAbilityView;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.view.*;
import org.apache.log4j.Logger;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import static mage.client.constants.Constants.*;
/**
*
@ -100,11 +69,9 @@ import mage.view.StackAbilityView;
@SuppressWarnings("serial")
public class Card extends MagePermanent implements MouseMotionListener, MouseListener, FocusListener, ComponentListener {
protected static Session session = MageFrame.getSession();
protected static DefaultActionCallback callback = DefaultActionCallback.getInstance();
protected Point p;
protected CardDimensions dimension;
protected final CardDimensions dimension;
protected final UUID gameId;
protected final BigCard bigCard;
@ -112,10 +79,10 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
protected Popup tooltipPopup;
protected boolean tooltipShowing;
protected TextPopup tooltipText = new TextPopup();
protected final TextPopup tooltipText = new TextPopup();
protected BufferedImage background;
protected BufferedImage image = new BufferedImage(FRAME_MAX_WIDTH, FRAME_MAX_HEIGHT, BufferedImage.TYPE_INT_RGB);
protected BufferedImage small;
protected final BufferedImage image = new BufferedImage(FRAME_MAX_WIDTH, FRAME_MAX_HEIGHT, BufferedImage.TYPE_INT_RGB);
protected final BufferedImage small;
protected String backgroundName;
// if this is set, it's opened if the user right clicks on the card panel
@ -182,7 +149,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
gImage.setColor(Color.BLACK);
gImage.drawImage(background, 0, 0, this);
if (card.getManaCost().size() > 0) {
if (!card.getManaCost().isEmpty()) {
ImageHelper.drawCosts(card.getManaCost(), gImage, FRAME_MAX_WIDTH - SYMBOL_MAX_XOFFSET, SYMBOL_MAX_YOFFSET, this);
}
@ -191,28 +158,28 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
gSmall.drawImage(ImageHelper.scaleImage(image, Config.dimensions.frameWidth, Config.dimensions.frameHeight), 0, 0, this);
gImage.setFont(new Font("Arial", Font.PLAIN, NAME_FONT_MAX_SIZE));
gImage.drawString(card.getName(), CONTENT_MAX_XOFFSET, NAME_MAX_YOFFSET);
if (card.getCardTypes().contains(CardType.CREATURE)) {
gImage.drawString(card.getPower() + "/" + card.getToughness(), POWBOX_TEXT_MAX_LEFT, POWBOX_TEXT_MAX_TOP);
} else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
gImage.drawString(card.getName()+"TEST", CONTENT_MAX_XOFFSET, NAME_MAX_YOFFSET);
if (card.isCreature()) {
gImage.drawString(card.getPower() + '/' + card.getToughness(), POWBOX_TEXT_MAX_LEFT, POWBOX_TEXT_MAX_TOP);
} else if (card.isPlanesWalker()) {
gImage.drawString(card.getLoyalty(), POWBOX_TEXT_MAX_LEFT, POWBOX_TEXT_MAX_TOP);
}
if (card.getCardTypes().size() > 0) {
if (!card.getCardTypes().isEmpty()) {
gImage.drawString(cardType, CONTENT_MAX_XOFFSET, TYPE_MAX_YOFFSET);
}
gImage.dispose();
gSmall.setFont(new Font("Arial", Font.PLAIN, Config.dimensions.nameFontSize));
gSmall.drawString(card.getName(), Config.dimensions.contentXOffset, Config.dimensions.nameYOffset);
if (card.getCardTypes().contains(CardType.CREATURE)) {
gSmall.drawString(card.getPower() + "/" + card.getToughness(), Config.dimensions.powBoxTextLeft, Config.dimensions.powBoxTextTop);
} else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
gSmall.drawString(card.getName()+"TEST2", Config.dimensions.contentXOffset, Config.dimensions.nameYOffset);
if (card.isCreature()) {
gSmall.drawString(card.getPower() + "/-/" + card.getToughness(), Config.dimensions.powBoxTextLeft, Config.dimensions.powBoxTextTop);
} else if (card.isPlanesWalker()) {
gSmall.drawString(card.getLoyalty(), Config.dimensions.powBoxTextLeft, Config.dimensions.powBoxTextTop);
}
if (card.getCardTypes().size() > 0) {
if (!card.getCardTypes().isEmpty()) {
gSmall.drawString(cardType, Config.dimensions.contentXOffset, Config.dimensions.typeYOffset);
}
drawText();
@ -221,7 +188,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
}
@Override
public void updateImage() {
public void updateArtImage() {
}
@ -229,27 +196,27 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
StringBuilder sb = new StringBuilder();
if (card instanceof StackAbilityView || card instanceof AbilityView) {
for (String rule : getRules()) {
sb.append("\n").append(rule);
sb.append('\n').append(rule);
}
} else {
sb.append(card.getName());
if (card.getManaCost().size() > 0) {
sb.append("\n").append(card.getManaCost());
if (!card.getManaCost().isEmpty()) {
sb.append('\n').append(card.getManaCost());
}
sb.append("\n").append(cardType);
sb.append('\n').append(cardType);
if (card.getColor().hasColor()) {
sb.append("\n").append(card.getColor().toString());
sb.append('\n').append(card.getColor().toString());
}
if (card.getCardTypes().contains(CardType.CREATURE)) {
sb.append("\n").append(card.getPower()).append("/").append(card.getToughness());
} else if (card.getCardTypes().contains(CardType.PLANESWALKER)) {
sb.append("\n").append(card.getLoyalty());
if (card.isCreature()) {
sb.append('\n').append(card.getPower()).append('/').append(card.getToughness());
} else if (card.isPlanesWalker()) {
sb.append('\n').append(card.getLoyalty());
}
for (String rule : getRules()) {
sb.append("\n").append(rule);
sb.append('\n').append(rule);
}
if (card.getExpansionSetCode() != null && card.getExpansionSetCode().length() > 0) {
sb.append("\n").append(card.getCardNumber()).append(" - ");
if (card.getExpansionSetCode() != null && !card.getExpansionSetCode().isEmpty()) {
sb.append('\n').append(card.getCardNumber()).append(" - ");
sb.append(Sets.getInstance().get(card.getExpansionSetCode()).getName()).append(" - ");
sb.append(card.getRarity().toString());
}
@ -263,9 +230,9 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
return "effect";
}
StringBuilder sb = new StringBuilder();
if (card.getCardTypes().contains(CardType.LAND)) {
if (card.isLand()) {
sb.append("land").append(card.getSuperTypes()).append(card.getSubTypes());
} else if (card.getCardTypes() != null && (card.getCardTypes().contains(CardType.CREATURE) || card.getCardTypes().contains(CardType.PLANESWALKER))) {
} else if (card.getCardTypes() != null && (card.isCreature() || card.isPlanesWalker())) {
sb.append("creature");
}
sb.append(card.getColor()).append(card.getRarity()).append(card.getExpansionSetCode());
@ -278,7 +245,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
try {
for (String rule : getRules()) {
doc.insertString(doc.getLength(), rule + "\n", doc.getStyle("small"));
doc.insertString(doc.getLength(), rule + '\n', doc.getStyle("small"));
}
} catch (BadLocationException e) {
}
@ -301,23 +268,36 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
protected String getType(CardView card) {
StringBuilder sbType = new StringBuilder();
for (String superType : card.getSuperTypes()) {
sbType.append(superType).append(" ");
for (SuperType superType : card.getSuperTypes()) {
sbType.append(superType).append(' ');
}
for (CardType cardType : card.getCardTypes()) {
sbType.append(cardType.toString()).append(" ");
sbType.append(cardType.toString()).append(' ');
}
if (card.getSubTypes().size() > 0) {
if (!card.getSubTypes().isEmpty()) {
sbType.append("- ");
for (String subType : card.getSubTypes()) {
sbType.append(subType).append(" ");
for (SubType subType : card.getSubTypes()) {
sbType.append(subType).append(' ');
}
}
return sbType.toString();
}
protected void drawDetailed(Graphics2D g) {
// Get the size of the card
int width = getWidth();
int height = getHeight();
g.setColor(Color.black);
g.drawRoundRect(0, 0, width, height, 4, 4);
g.setColor(Color.white);
g.setFont(new Font("Arial", Font.PLAIN, NAME_FONT_MAX_SIZE));
g.drawString(card.getName(), 0, 0);
Logger.getLogger(Card.class).info("Drawing");
}
/**
* This method is called from within the constructor to initialize the form.
@ -355,6 +335,8 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override
public void paintComponent(Graphics graphics) {
drawDetailed((Graphics2D)graphics);
/*
Graphics2D g2 = (Graphics2D) graphics;
g2.drawImage(small, 0, 0, this);
@ -365,6 +347,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
g2.setColor(Color.BLACK);
}
g2.drawRect(0, 0, Config.dimensions.frameWidth - 1, Config.dimensions.frameHeight - 1);
*/
}
@Override
@ -384,7 +367,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
@Override
public void mousePressed(MouseEvent e) {
requestFocusInWindow();
callback.mouseClicked(e, gameId, session, card);
DefaultActionCallback.instance.mouseClicked(gameId, card);
}
@Override
@ -440,6 +423,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
tooltipShowing = false;
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.TARGET);
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.PAIRED);
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.BANDED);
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.SOURCE);
ArrowBuilder.getBuilder().removeArrowsByType(gameId, ArrowBuilder.Type.ENCHANT_PLAYERS);
}
@ -579,7 +563,7 @@ public class Card extends MagePermanent implements MouseMotionListener, MouseLis
}
@Override
public void setTextOffset(int yOffset) {
public void setCardCaptionTopOffset(int yOffsetPercent) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

View file

@ -27,20 +27,9 @@
*/
package mage.client.cards;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import java.util.UUID;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import mage.cards.MageCard;
import mage.client.plugins.impl.Plugins;
import mage.client.util.ClientEventType;
import mage.client.util.Event;
import mage.client.util.GUISizeHelper;
import mage.client.util.Listener;
@ -50,14 +39,21 @@ import mage.view.CardsView;
import mage.view.SimpleCardView;
import org.mage.card.arcane.CardPanel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;
import java.util.UUID;
public class CardArea extends JPanel implements MouseListener {
protected CardEventSource cardEventSource = new CardEventSource();
protected final CardEventSource cardEventSource = new CardEventSource();
private boolean reloaded = false;
private final javax.swing.JLayeredPane cardArea;
private final javax.swing.JScrollPane scrollPane;
private int yTextOffset;
private int yCardCaptionOffsetPercent = 0; // card caption offset (use for moving card caption view center, below mana icons -- for more good UI)
private Dimension cardDimension;
private int verticalCardOffset;
@ -72,8 +68,6 @@ public class CardArea extends JPanel implements MouseListener {
setGUISize();
cardArea = new JLayeredPane();
scrollPane.setViewportView(cardArea);
yTextOffset = 10;
}
public void cleanUp() {
@ -89,7 +83,7 @@ public class CardArea extends JPanel implements MouseListener {
setGUISize();
for (Component component : cardArea.getComponents()) {
if (component instanceof CardPanel) {
((CardPanel) component).setBounds(0, 0, cardDimension.width, cardDimension.height);
component.setBounds(0, 0, cardDimension.width, cardDimension.height);
}
}
}
@ -107,10 +101,10 @@ public class CardArea extends JPanel implements MouseListener {
this.reloaded = true;
cardArea.removeAll();
if (showCards != null && showCards.size() < 10) {
yTextOffset = 10;
yCardCaptionOffsetPercent = 8; // TODO: need to test
loadCardsFew(showCards, bigCard, gameId);
} else {
yTextOffset = 0;
yCardCaptionOffsetPercent = 0;
loadCardsMany(showCards, bigCard, gameId);
}
cardArea.revalidate();
@ -122,8 +116,10 @@ public class CardArea extends JPanel implements MouseListener {
public void loadCardsNarrow(CardsView showCards, BigCard bigCard, UUID gameId) {
this.reloaded = true;
cardArea.removeAll();
yTextOffset = 0;
yCardCaptionOffsetPercent = 0; // TODO: need to test
loadCardsMany(showCards, bigCard, gameId);
cardArea.revalidate();
this.revalidate();
@ -148,7 +144,7 @@ public class CardArea extends JPanel implements MouseListener {
tmp.setAbility(card); // cross-reference, required for ability picker
card = tmp;
}
MageCard cardPanel = Plugins.getInstance().getMageCard(card, bigCard, cardDimension, gameId, true);
MageCard cardPanel = Plugins.instance.getMageCard(card, bigCard, cardDimension, gameId, true, true);
cardPanel.setBounds(rectangle);
cardPanel.addMouseListener(this);
@ -156,14 +152,17 @@ public class CardArea extends JPanel implements MouseListener {
cardArea.moveToFront(cardPanel);
cardPanel.update(card);
cardPanel.setCardBounds(rectangle.x, rectangle.y, cardDimension.width, cardDimension.height);
cardPanel.setTextOffset(yTextOffset);
// new card have same settings as current view
cardPanel.setCardCaptionTopOffset(yCardCaptionOffsetPercent);
cardPanel.showCardTitle();
}
private void loadCardsMany(CardsView showCards, BigCard bigCard, UUID gameId) {
int rowsOfCards = 20;
int columns = 1;
if (showCards != null && showCards.size() > 0) {
if (showCards != null && !showCards.isEmpty()) {
Rectangle rectangle = new Rectangle(cardDimension.width, cardDimension.height);
int count = 0;
for (CardView card : showCards.values()) {
@ -240,15 +239,15 @@ public class CardArea extends JPanel implements MouseListener {
e.consume();
if (obj instanceof Card) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((Card) obj).getOriginal(), "alt-double-click");
cardEventSource.fireEvent(((Card) obj).getOriginal(), ClientEventType.ALT_DOUBLE_CLICK);
} else {
cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click");
cardEventSource.fireEvent(((Card) obj).getOriginal(), ClientEventType.DOUBLE_CLICK);
}
} else if (obj instanceof MageCard) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((MageCard) obj).getOriginal(), "alt-double-click");
cardEventSource.fireEvent(((MageCard) obj).getOriginal(), ClientEventType.ALT_DOUBLE_CLICK);
} else {
cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click");
cardEventSource.fireEvent(((MageCard) obj).getOriginal(),ClientEventType.DOUBLE_CLICK);
}
}
}
@ -270,14 +269,14 @@ public class CardArea extends JPanel implements MouseListener {
checkMenu(e, null);
}
} else {
cardEventSource.actionConsumedEvent("action-consumed");
cardEventSource.fireEvent(ClientEventType.ACTION_CONSUMED);
}
}
private void checkMenu(MouseEvent Me, SimpleCardView card) {
if (Me.isPopupTrigger()) {
Me.consume();
cardEventSource.showPopupMenuEvent(card, Me.getComponent(), Me.getX(), Me.getY(), "show-popup-menu");
cardEventSource.fireEvent(card, Me.getComponent(), Me.getX(), Me.getY(), ClientEventType.SHOW_POP_UP_MENU);
}
}

View file

@ -0,0 +1,176 @@
package mage.client.cards;
import mage.cards.MageCard;
import mage.client.MagePane;
import mage.client.plugins.impl.Plugins;
import mage.view.CardView;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
/**
* Created by StravantUser on 2016-09-22.
*/
public class CardDraggerGlassPane implements MouseListener, MouseMotionListener {
private final DragCardSource source;
private Component dragComponent;
private JRootPane currentRoot;
private JComponent glassPane;
private ArrayList<CardView> currentCards;
private MageCard dragView;
private DragCardTarget currentDragTarget;
private boolean isDragging;
// This should not be strictly needed, but for some reason I can't figure out getDeepestComponentAt and
// getComponentAt do not seem to work correctly for our setup if called on the root MageFrame.
private MagePane currentEventRootMagePane;
public CardDraggerGlassPane(DragCardSource source) {
this.source = source;
}
public void beginDrag(Component c, MouseEvent e) {
// Start drag
if (isDragging) {
return;
}
isDragging = true;
// Record what we are dragging on
dragComponent = c;
currentRoot = SwingUtilities.getRootPane(c);
// Pane
glassPane = (JComponent)currentRoot.getGlassPane();
glassPane.setLayout(null);
glassPane.setOpaque(false);
glassPane.setVisible(true);
// Get root mage pane to handle drag targeting in
Component rootMagePane = c;
while (rootMagePane != null && !(rootMagePane instanceof MagePane)) {
rootMagePane = rootMagePane.getParent();
}
if (rootMagePane == null) {
throw new RuntimeException("CardDraggerGlassPane::beginDrag not in a MagePane?");
} else {
currentEventRootMagePane = (MagePane)rootMagePane;
}
// Hook up events
c.addMouseListener(this);
c.addMouseMotionListener(this);
// Event to local space
e = SwingUtilities.convertMouseEvent(c, e, glassPane);
// Get the cards to drag
currentCards = new ArrayList<>(source.dragCardList());
// Make a view for the first one and add it to us
dragView = Plugins.instance.getMageCard(currentCards.get(0), null, new Dimension(100, 140), null, true, false);
for (MouseListener l: dragView.getMouseListeners()) {
dragView.removeMouseListener(l);
}
for (MouseMotionListener l : dragView.getMouseMotionListeners()) {
dragView.removeMouseMotionListener(l);
}
dragView.setLocation(e.getX(), e.getY());
glassPane.add(dragView);
// Notify the sounce
source.dragCardBegin();
// Update the target
currentDragTarget = null;
updateCurrentTarget(SwingUtilities.convertMouseEvent(glassPane, e, currentEventRootMagePane), false);
}
// e is relative to currentRoot
private void updateCurrentTarget(MouseEvent e, boolean isEnding) {
Component mouseOver = SwingUtilities.getDeepestComponentAt(currentEventRootMagePane, e.getX(), e.getY());
while (mouseOver != null) {
if (mouseOver instanceof DragCardTarget) {
DragCardTarget target = (DragCardTarget)mouseOver;
MouseEvent targetEvent = SwingUtilities.convertMouseEvent(currentEventRootMagePane, e, mouseOver);
if (target != currentDragTarget) {
if (currentDragTarget != null) {
MouseEvent oldTargetEvent = SwingUtilities.convertMouseEvent(currentEventRootMagePane, e, (Component) currentDragTarget);
currentDragTarget.dragCardExit(oldTargetEvent);
}
currentDragTarget = target;
currentDragTarget.dragCardEnter(targetEvent);
}
if (isEnding) {
currentDragTarget.dragCardExit(targetEvent);
currentDragTarget.dragCardDrop(targetEvent, source, currentCards);
} else {
currentDragTarget.dragCardMove(targetEvent);
}
return;
}
mouseOver = mouseOver.getParent();
}
if (currentDragTarget != null) {
MouseEvent oldTargetEvent = SwingUtilities.convertMouseEvent(currentEventRootMagePane, e, (Component)currentDragTarget);
currentDragTarget.dragCardExit(oldTargetEvent);
}
currentDragTarget = null;
}
public boolean isDragging() {
return isDragging;
}
/**
* Mouse released -> we are done the drag
*/
@Override
public void mouseReleased(MouseEvent e) {
// No longer dragging
isDragging = false;
// Remove listeners
dragComponent.removeMouseListener(this);
dragComponent.removeMouseMotionListener(this);
// Convert the event into root coords
e = SwingUtilities.convertMouseEvent(dragComponent, e, currentEventRootMagePane);
// Remove the drag card
glassPane.remove(dragView);
glassPane.repaint();
// Let the drag source know
source.dragCardEnd(currentDragTarget);
// Update the target, and do the drop
updateCurrentTarget(e, true);
}
@Override
public void mouseDragged(MouseEvent e) {
// Update the view
MouseEvent glassE = SwingUtilities.convertMouseEvent(dragComponent, e, glassPane);
dragView.setLocation(glassE.getX(), glassE.getY());
dragView.repaint();
// Convert the event into root coords and update target
e = SwingUtilities.convertMouseEvent(dragComponent, e, currentEventRootMagePane);
updateCurrentTarget(e, false);
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseMoved(MouseEvent e) {}
}

View file

@ -27,14 +27,13 @@
*/
package mage.client.cards;
import java.awt.Component;
import java.io.Serializable;
import mage.client.util.*;
import mage.client.util.Event;
import mage.client.util.EventDispatcher;
import mage.client.util.EventSource;
import mage.client.util.Listener;
import mage.view.SimpleCardView;
import java.awt.*;
import java.io.Serializable;
/**
*
* @author BetaSteward_at_googlemail.com
@ -49,34 +48,22 @@ public class CardEventSource implements EventSource<Event>, Serializable {
dispatcher.addListener(listener);
}
public void setNumber(SimpleCardView card, String message, int number) {
dispatcher.fireEvent(new Event(card, message, number));
public void fireEvent(SimpleCardView card, ClientEventType eventType, int number){
dispatcher.fireEvent(new Event(card, eventType, number));
}
public void doubleClick(SimpleCardView card, String message) {
dispatcher.fireEvent(new Event(card, message));
public void fireEvent(ClientEventType eventType){
dispatcher.fireEvent(new Event(null, eventType));
}
public void altDoubleClick(SimpleCardView card, String message) {
dispatcher.fireEvent(new Event(card, message));
public void fireEvent(SimpleCardView card, ClientEventType eventType){
dispatcher.fireEvent(new Event(card, eventType));
}
public void removeFromMainEvent(String message) {
dispatcher.fireEvent(new Event(null, message));
}
public void removeFromSideboardEvent(String message) {
dispatcher.fireEvent(new Event(null, message));
}
public void showPopupMenuEvent(SimpleCardView card, Component component, int x, int y, String message) {
public void fireEvent(SimpleCardView card, Component component, int x, int y, ClientEventType message) {
dispatcher.fireEvent(new Event(card, message, x, y, component));
}
public void actionConsumedEvent(String message) {
dispatcher.fireEvent(new Event(null, message));
}
@Override
public void clearListeners() {
dispatcher.clearListeners();

View file

@ -33,23 +33,10 @@
*/
package mage.client.cards;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
import mage.cards.MageCard;
import mage.client.deckeditor.SortSetting;
import mage.client.plugins.impl.Plugins;
import mage.client.util.ClientEventType;
import mage.client.util.Event;
import mage.client.util.GUISizeHelper;
import mage.client.util.Listener;
@ -58,13 +45,20 @@ import mage.view.CardView;
import mage.view.CardsView;
import org.mage.card.arcane.CardPanel;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.*;
import java.util.List;
import java.util.Map.Entry;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public class CardGrid extends javax.swing.JLayeredPane implements MouseListener, ICardGrid {
protected CardEventSource cardEventSource = new CardEventSource();
protected final CardEventSource cardEventSource = new CardEventSource();
protected BigCard bigCard;
protected UUID gameId;
private final Map<UUID, MageCard> cards = new HashMap<>();
@ -128,13 +122,12 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
addCard(card, bigCard, gameId, drawImage);
}
}
// System.gc();
drawCards(sortSetting);
this.setVisible(true);
}
private void addCard(CardView card, BigCard bigCard, UUID gameId, boolean drawImage) {
MageCard cardImg = Plugins.getInstance().getMageCard(card, bigCard, cardDimension, gameId, drawImage);
MageCard cardImg = Plugins.instance.getMageCard(card, bigCard, cardDimension, gameId, drawImage, true);
cards.put(card.getId(), cardImg);
cardImg.addMouseListener(this);
add(cardImg);
@ -149,24 +142,27 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
int numColumns = maxWidth / cardDimension.width;
int curColumn = 0;
int curRow = 0;
if (cards.size() > 0) {
if (!cards.isEmpty()) {
Rectangle rectangle = new Rectangle(cardDimension.width, cardDimension.height);
List<MageCard> sortedCards = new ArrayList<>(cards.values());
switch (sortSetting.getSortBy()) {
case NAME:
Collections.sort(sortedCards, new CardNameComparator());
sortedCards.sort(new CardNameComparator());
break;
case CARD_TYPE:
sortedCards.sort(new CardTypeComparator());
break;
case RARITY:
Collections.sort(sortedCards, new CardRarityComparator());
sortedCards.sort(new CardRarityComparator());
break;
case COLOR:
Collections.sort(sortedCards, new CardColorComparator());
sortedCards.sort(new CardColorComparator());
break;
case COLOR_IDENTITY:
Collections.sort(sortedCards, new CardColorDetailedIdentity());
sortedCards.sort(new CardColorDetailedIdentity());
break;
case CASTING_COST:
Collections.sort(sortedCards, new CardCostComparator());
sortedCards.sort(new CardCostComparator());
break;
}
@ -183,8 +179,14 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
curRow = 0;
}
break;
case CARD_TYPE:
if (!cardImg.getOriginal().getCardTypes().equals(lastCard.getOriginal().getCardTypes())) {
curColumn++;
curRow = 0;
}
break;
case RARITY:
if (!cardImg.getOriginal().getRarity().equals(lastCard.getOriginal().getRarity())) {
if (cardImg.getOriginal().getRarity() != lastCard.getOriginal().getRarity()) {
curColumn++;
curRow = 0;
}
@ -313,15 +315,15 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
Object obj = e.getSource();
if (obj instanceof Card) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((Card) obj).getOriginal(), "alt-double-click");
cardEventSource.fireEvent(((Card) obj).getOriginal(), ClientEventType.ALT_DOUBLE_CLICK);
} else {
cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click");
cardEventSource.fireEvent(((Card) obj).getOriginal(), ClientEventType.DOUBLE_CLICK);
}
} else if (obj instanceof MageCard) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((MageCard) obj).getOriginal(), "alt-double-click");
cardEventSource.fireEvent(((MageCard) obj).getOriginal(), ClientEventType.ALT_DOUBLE_CLICK);
} else {
cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click");
cardEventSource.fireEvent(((MageCard) obj).getOriginal(), ClientEventType.DOUBLE_CLICK);
}
}
}
@ -400,7 +402,7 @@ class CardCostComparator implements Comparator<MageCard> {
@Override
public int compare(MageCard o1, MageCard o2) {
int val = Integer.valueOf(o1.getOriginal().getConvertedManaCost()).compareTo(Integer.valueOf(o2.getOriginal().getConvertedManaCost()));
int val = Integer.valueOf(o1.getOriginal().getConvertedManaCost()).compareTo(o2.getOriginal().getConvertedManaCost());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
} else {
@ -438,3 +440,17 @@ class CardColorDetailedIdentity implements Comparator<MageCard> {
}
}
class CardTypeComparator implements Comparator<MageCard> {
@Override
public int compare(MageCard o1, MageCard o2) {
int val = o1.getOriginal().getCardTypes().toString().compareTo(o2.getOriginal().getCardTypes().toString());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
} else {
return val;
}
}
}

View file

@ -37,8 +37,6 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
@ -100,7 +98,7 @@ public class Cards extends javax.swing.JPanel {
jScrollPane1.getViewport().setOpaque(false);
jScrollPane1.setBorder(EMPTY_BORDER);
}
if (Plugins.getInstance().isCardPluginLoaded()) {
if (Plugins.instance.isCardPluginLoaded()) {
cardArea.setLayout(null);
}
cardArea.setBorder(EMPTY_BORDER);
@ -114,7 +112,7 @@ public class Cards extends javax.swing.JPanel {
setGUISize();
for (MageCard mageCard : cards.values()) {
mageCard.setCardBounds(0, 0, getCardDimension().width, getCardDimension().height);
mageCard.updateImage();
mageCard.updateArtImage();
mageCard.doLayout();
}
layoutCards();
@ -210,7 +208,7 @@ public class Cards extends javax.swing.JPanel {
tmp.setIsAbility(true);
tmp.overrideTargets(card.getTargets());
tmp.overrideId(card.getId());
tmp.setAbilityType(((StackAbilityView) card).getAbilityType());
tmp.setAbilityType(card.getAbilityType());
card = tmp;
} else {
card.setAbilityType(null);
@ -227,7 +225,7 @@ public class Cards extends javax.swing.JPanel {
}
if (!isVisibleIfEmpty) {
cardArea.setVisible(cards.size() > 0);
cardArea.setVisible(!cards.isEmpty());
}
sizeCards(getCardDimension());
@ -258,14 +256,14 @@ public class Cards extends javax.swing.JPanel {
this.cardDimension = dimension;
for (Component component : cardArea.getComponents()) {
if (component instanceof CardPanel) {
((CardPanel) component).setBounds(0, 0, dimension.width, dimension.height);
component.setBounds(0, 0, dimension.width, dimension.height);
}
}
layoutCards();
}
private void addCard(CardView card, BigCard bigCard, UUID gameId) {
MageCard mageCard = Plugins.getInstance().getMageCard(card, bigCard, getCardDimension(), gameId, true);
MageCard mageCard = Plugins.instance.getMageCard(card, bigCard, getCardDimension(), gameId, true, true);
if (zone != null) {
mageCard.setZone(zone);
}
@ -358,12 +356,7 @@ public class Cards extends javax.swing.JPanel {
}
}
// sort the cards
Collections.sort(cardsToLayout, new Comparator<CardPanel>() {
@Override
public int compare(CardPanel cp1, CardPanel cp2) {
return Integer.valueOf(cp1.getLocation().x).compareTo(cp2.getLocation().x);
}
});
cardsToLayout.sort((cp1, cp2) -> Integer.valueOf(cp1.getLocation().x).compareTo(cp2.getLocation().x));
// relocate the cards
int dx = 0;
for (Component component : cardsToLayout) {

View file

@ -34,21 +34,16 @@
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="1" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="panelControl" pref="703" max="32767" attributes="0"/>
<Component id="panelCardArea" max="32767" attributes="0"/>
</Group>
</Group>
<Component id="panelControl" alignment="0" pref="467" max="32767" attributes="0"/>
<Component id="panelCardArea" alignment="0" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="panelControl" min="-2" pref="25" max="-2" attributes="0"/>
<EmptySpace min="0" pref="0" max="-2" attributes="0"/>
<Component id="panelCardArea" pref="86" max="32767" attributes="0"/>
<Component id="panelControl" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="2" max="-2" attributes="0"/>
<Component id="panelCardArea" pref="179" max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
@ -81,15 +76,7 @@
<Component id="lblLandCount" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="lblCreatureCount" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="lblSorceryCount" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="lblInstantCount" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="lblEnchantmentCount" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="4" max="-2" attributes="0"/>
<Component id="lblArtifactCount" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<EmptySpace min="-2" max="-2" attributes="0"/>
<Component id="chkPiles" min="-2" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<Component id="cbSortBy" min="-2" max="-2" attributes="0"/>
@ -97,7 +84,7 @@
<Component id="jToggleListView" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jToggleCardView" min="-2" max="-2" attributes="0"/>
<EmptySpace min="0" pref="62" max="32767" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
@ -109,11 +96,7 @@
<Component id="lblCount" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblLandCount" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblCreatureCount" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblSorceryCount" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblInstantCount" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblEnchantmentCount" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="chkPiles" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="lblArtifactCount" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="cbSortBy" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="jToggleListView" min="-2" max="-2" attributes="0"/>
@ -177,60 +160,6 @@
<Property name="verifyInputWhenFocusTarget" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblSorceryCount">
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/buttons/type_sorcery.png"/>
</Property>
<Property name="text" type="java.lang.String" value="999"/>
<Property name="toolTipText" type="java.lang.String" value="Number of sorceries."/>
<Property name="verticalAlignment" type="int" value="1"/>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Default Cursor"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="inheritsPopupMenu" type="boolean" value="false"/>
<Property name="requestFocusEnabled" type="boolean" value="false"/>
<Property name="verifyInputWhenFocusTarget" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblInstantCount">
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/buttons/type_instant.png"/>
</Property>
<Property name="text" type="java.lang.String" value="999"/>
<Property name="toolTipText" type="java.lang.String" value="Number of instants."/>
<Property name="verticalAlignment" type="int" value="1"/>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Default Cursor"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="inheritsPopupMenu" type="boolean" value="false"/>
<Property name="requestFocusEnabled" type="boolean" value="false"/>
<Property name="verifyInputWhenFocusTarget" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblEnchantmentCount">
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/buttons/type_enchantment.png"/>
</Property>
<Property name="text" type="java.lang.String" value="999"/>
<Property name="toolTipText" type="java.lang.String" value="Number of enchantments."/>
<Property name="verticalAlignment" type="int" value="1"/>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Default Cursor"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="inheritsPopupMenu" type="boolean" value="false"/>
<Property name="requestFocusEnabled" type="boolean" value="false"/>
<Property name="verifyInputWhenFocusTarget" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="chkPiles">
<Properties>
<Property name="text" type="java.lang.String" value="Piles"/>
@ -324,24 +253,6 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jToggleCardViewActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JLabel" name="lblArtifactCount">
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/buttons/type_artifact.png"/>
</Property>
<Property name="text" type="java.lang.String" value="999"/>
<Property name="toolTipText" type="java.lang.String" value="Number of artifacts"/>
<Property name="verticalAlignment" type="int" value="1"/>
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
<Color id="Default Cursor"/>
</Property>
<Property name="focusable" type="boolean" value="false"/>
<Property name="inheritsPopupMenu" type="boolean" value="false"/>
<Property name="requestFocusEnabled" type="boolean" value="false"/>
<Property name="verifyInputWhenFocusTarget" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JScrollPane" name="panelCardArea">

View file

@ -33,26 +33,6 @@
*/
package mage.client.cards;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.Beans;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import mage.cards.MageCard;
import mage.client.constants.Constants.DeckEditorMode;
import mage.client.constants.Constants.SortBy;
@ -61,28 +41,33 @@ import mage.client.deckeditor.table.TableModel;
import mage.client.deckeditor.table.UpdateCountsCallback;
import mage.client.dialog.PreferencesDialog;
import mage.client.plugins.impl.Plugins;
import mage.client.util.CardViewColorComparator;
import mage.client.util.CardViewColorIdentityComparator;
import mage.client.util.CardViewCostComparator;
import mage.client.util.CardViewNameComparator;
import mage.client.util.CardViewRarityComparator;
import mage.client.util.*;
import mage.client.util.Event;
import mage.client.util.GUISizeHelper;
import mage.client.util.Listener;
import mage.client.util.gui.TableSpinnerEditor;
import mage.constants.CardType;
import mage.view.CardView;
import mage.view.CardsView;
import mage.view.SimpleCardView;
import org.mage.card.arcane.CardPanel;
import org.mage.card.arcane.ManaSymbolsCellRenderer;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.Beans;
import java.util.*;
import java.util.List;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public class CardsList extends javax.swing.JPanel implements MouseListener, ICardGrid {
protected CardEventSource cardEventSource = new CardEventSource();
protected final CardEventSource cardEventSource = new CardEventSource();
private Dimension cardDimension;
private int rowHeight;
private CardsView cards;
@ -180,6 +165,9 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
mainTable.getColumnModel().getColumn(6).setPreferredWidth(15);
mainTable.getColumnModel().getColumn(7).setPreferredWidth(15);
// new mana render (svg support)
mainTable.getColumnModel().getColumn(mainModel.COLUMN_INDEX_COST).setCellRenderer(new ManaSymbolsCellRenderer());
if (PreferencesDialog.getCachedValue(PreferencesDialog.KEY_DRAFT_VIEW, "cardView").equals("listView")) {
jToggleListView.setSelected(true);
panelCardArea.setViewportView(mainTable);
@ -211,12 +199,12 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
}
});
mainModel.setUpdateCountsCallback(new UpdateCountsCallback(lblCount, lblCreatureCount, lblLandCount, lblSorceryCount, lblInstantCount, lblEnchantmentCount, lblArtifactCount));
mainModel.setUpdateCountsCallback(new UpdateCountsCallback(lblCount, lblCreatureCount, lblLandCount, null, null, null, null));
}
// if you use the deck ediot to build a free deck, numbers can be set directly in deck and sideboard
public void setDeckEditorMode(DeckEditorMode mode) {
if (mode.equals(DeckEditorMode.FREE_BUILDING)) {
if (mode == DeckEditorMode.FREE_BUILDING) {
// activate spinner for card number change
mainModel.setNumberEditable(true);
TableColumnModel tcm = mainTable.getColumnModel();
@ -321,7 +309,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
cardArea.remove(card);
}
if (cards != null && cards.size() > 0) {
if (cards != null && !cards.isEmpty()) {
Rectangle rectangle = new Rectangle(cardDimension.width, cardDimension.height);
List<CardView> sortedCards = new ArrayList<>(cards.values());
switch (sortSetting.getSortBy()) {
@ -331,6 +319,9 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
case RARITY:
comparator = new CardViewRarityComparator();
break;
case CARD_TYPE:
comparator = new CardViewCardTypeComparator();
break;
case COLOR:
comparator = new CardViewColorComparator();
break;
@ -342,8 +333,8 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
break;
}
if (comparator != null) {
Collections.sort(sortedCards, new CardViewNameComparator());
Collections.sort(sortedCards, comparator);
sortedCards.sort(new CardViewNameComparator());
sortedCards.sort(comparator);
}
CardView lastCard = null;
for (CardView card : sortedCards) {
@ -392,24 +383,24 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
int instantCount = 0;
int enchantmentCount = 0;
int artifactCount = 0;
for (CardView card : cards.values()) {
if (card.getCardTypes().contains(CardType.LAND)) {
if (card.isLand()) {
landCount++;
}
if (card.getCardTypes().contains(CardType.CREATURE)) {
if (card.isCreature()) {
creatureCount++;
}
if (card.getCardTypes().contains(CardType.SORCERY)) {
if (card.isSorcery()) {
sorceryCount++;
}
if (card.getCardTypes().contains(CardType.INSTANT)) {
if (card.isInstant()) {
instantCount++;
}
if (card.getCardTypes().contains(CardType.ENCHANTMENT)) {
if (card.isEnchantment()) {
enchantmentCount++;
}
if (card.getCardTypes().contains(CardType.ARTIFACT)) {
if (card.isArtifact()) {
artifactCount++;
}
}
@ -418,14 +409,10 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
this.lblCount.setText(Integer.toString(count));
this.lblCreatureCount.setText(Integer.toString(creatureCount));
this.lblLandCount.setText(Integer.toString(landCount));
this.lblSorceryCount.setText(Integer.toString(sorceryCount));
this.lblInstantCount.setText(Integer.toString(instantCount));
this.lblEnchantmentCount.setText(Integer.toString(enchantmentCount));
this.lblArtifactCount.setText(Integer.toString(artifactCount));
}
private MageCard addCard(CardView card, BigCard bigCard, UUID gameId) {
MageCard cardImg = Plugins.getInstance().getMageCard(card, bigCard, cardDimension, gameId, true);
MageCard cardImg = Plugins.instance.getMageCard(card, bigCard, cardDimension, gameId, true, true);
cardArea.add(cardImg);
cardImg.update(card);
cardImg.addMouseListener(this);
@ -482,22 +469,18 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
lblCount = new javax.swing.JLabel();
lblLandCount = new javax.swing.JLabel();
lblCreatureCount = new javax.swing.JLabel();
lblSorceryCount = new javax.swing.JLabel();
lblInstantCount = new javax.swing.JLabel();
lblEnchantmentCount = new javax.swing.JLabel();
chkPiles = new javax.swing.JCheckBox();
cbSortBy = new javax.swing.JComboBox();
jToggleListView = new javax.swing.JToggleButton();
jToggleCardView = new javax.swing.JToggleButton();
lblArtifactCount = new javax.swing.JLabel();
panelCardArea = new javax.swing.JScrollPane();
cardArea = new javax.swing.JLayeredPane();
setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
setMinimumSize(new java.awt.Dimension(30, 30));
setPreferredSize((!Beans.isDesignTime())?
(GUISizeHelper.editorCardDimension)
:(new Dimension(600, 600)));
setPreferredSize((!Beans.isDesignTime()) ?
(GUISizeHelper.editorCardDimension)
: (new Dimension(600, 600)));
setRequestFocusEnabled(false);
panelControl.setMaximumSize(new java.awt.Dimension(32767, 23));
@ -537,60 +520,19 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
lblCreatureCount.setRequestFocusEnabled(false);
lblCreatureCount.setVerifyInputWhenFocusTarget(false);
lblSorceryCount.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lblSorceryCount.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_sorcery.png"))); // NOI18N
lblSorceryCount.setText("999");
lblSorceryCount.setToolTipText("Number of sorceries.");
lblSorceryCount.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lblSorceryCount.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
lblSorceryCount.setFocusable(false);
lblSorceryCount.setInheritsPopupMenu(false);
lblSorceryCount.setRequestFocusEnabled(false);
lblSorceryCount.setVerifyInputWhenFocusTarget(false);
lblInstantCount.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lblInstantCount.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_instant.png"))); // NOI18N
lblInstantCount.setText("999");
lblInstantCount.setToolTipText("Number of instants.");
lblInstantCount.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lblInstantCount.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
lblInstantCount.setFocusable(false);
lblInstantCount.setInheritsPopupMenu(false);
lblInstantCount.setRequestFocusEnabled(false);
lblInstantCount.setVerifyInputWhenFocusTarget(false);
lblEnchantmentCount.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lblEnchantmentCount.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_enchantment.png"))); // NOI18N
lblEnchantmentCount.setText("999");
lblEnchantmentCount.setToolTipText("Number of enchantments.");
lblEnchantmentCount.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lblEnchantmentCount.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
lblEnchantmentCount.setFocusable(false);
lblEnchantmentCount.setInheritsPopupMenu(false);
lblEnchantmentCount.setRequestFocusEnabled(false);
lblEnchantmentCount.setVerifyInputWhenFocusTarget(false);
chkPiles.setText("Piles");
chkPiles.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
chkPiles.setMargin(new java.awt.Insets(3, 2, 2, 2));
chkPiles.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
chkPilesActionPerformed(evt);
}
});
chkPiles.addActionListener(evt -> chkPilesActionPerformed(evt));
cbSortBy.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "SortBy" }));
cbSortBy.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"SortBy"}));
cbSortBy.setToolTipText("Sort the cards if card view is active.");
cbSortBy.setMaximumSize(new java.awt.Dimension(120, 20));
cbSortBy.setMinimumSize(new java.awt.Dimension(120, 20));
cbSortBy.setName("SortBy"); // NOI18N
cbSortBy.setOpaque(false);
cbSortBy.setPreferredSize(new java.awt.Dimension(120, 20));
cbSortBy.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cbSortByActionPerformed(evt);
}
});
cbSortBy.addActionListener(evt -> cbSortByActionPerformed(evt));
bgView.add(jToggleListView);
jToggleListView.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/list_panel.png"))); // NOI18N
@ -601,11 +543,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
jToggleListView.setMaximumSize(new java.awt.Dimension(37, 25));
jToggleListView.setMinimumSize(new java.awt.Dimension(37, 25));
jToggleListView.setPreferredSize(new java.awt.Dimension(44, 22));
jToggleListView.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jToggleListViewActionPerformed(evt);
}
});
jToggleListView.addActionListener(evt -> jToggleListViewActionPerformed(evt));
bgView.add(jToggleCardView);
jToggleCardView.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/card_panel.png"))); // NOI18N
@ -613,68 +551,41 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
jToggleCardView.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
jToggleCardView.setMargin(new java.awt.Insets(2, 6, 2, 6));
jToggleCardView.setPreferredSize(new java.awt.Dimension(40, 22));
jToggleCardView.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jToggleCardViewActionPerformed(evt);
}
});
lblArtifactCount.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
lblArtifactCount.setIcon(new javax.swing.ImageIcon(getClass().getResource("/buttons/type_artifact.png"))); // NOI18N
lblArtifactCount.setText("999");
lblArtifactCount.setToolTipText("Number of artifacts");
lblArtifactCount.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lblArtifactCount.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
lblArtifactCount.setFocusable(false);
lblArtifactCount.setInheritsPopupMenu(false);
lblArtifactCount.setRequestFocusEnabled(false);
lblArtifactCount.setVerifyInputWhenFocusTarget(false);
jToggleCardView.addActionListener(evt -> jToggleCardViewActionPerformed(evt));
javax.swing.GroupLayout panelControlLayout = new javax.swing.GroupLayout(panelControl);
panelControl.setLayout(panelControlLayout);
panelControlLayout.setHorizontalGroup(
panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelControlLayout.createSequentialGroup()
.addComponent(lblCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblLandCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblCreatureCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblSorceryCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblInstantCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblEnchantmentCount)
.addGap(4, 4, 4)
.addComponent(lblArtifactCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(chkPiles)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(cbSortBy, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jToggleListView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jToggleCardView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 62, Short.MAX_VALUE))
panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelControlLayout.createSequentialGroup()
.addComponent(lblCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblLandCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblCreatureCount)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(chkPiles)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(cbSortBy, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jToggleListView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jToggleCardView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
panelControlLayout.setVerticalGroup(
panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelControlLayout.createSequentialGroup()
.addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblCount)
.addComponent(lblLandCount)
.addComponent(lblCreatureCount)
.addComponent(lblSorceryCount)
.addComponent(lblInstantCount)
.addComponent(lblEnchantmentCount)
.addComponent(chkPiles)
.addComponent(lblArtifactCount))
.addComponent(cbSortBy, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jToggleListView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jToggleCardView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, 0))
panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelControlLayout.createSequentialGroup()
.addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelControlLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(lblCount)
.addComponent(lblLandCount)
.addComponent(lblCreatureCount)
.addComponent(chkPiles))
.addComponent(cbSortBy, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jToggleListView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jToggleCardView, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(0, 0, 0))
);
jToggleListView.getAccessibleContext().setAccessibleDescription("Switch between image and table view.");
@ -685,22 +596,28 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(1, 1, 1)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panelControl, javax.swing.GroupLayout.DEFAULT_SIZE, 703, Short.MAX_VALUE)
.addComponent(panelCardArea)))
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panelControl, javax.swing.GroupLayout.PREFERRED_SIZE, 467, Short.MAX_VALUE)
.addComponent(panelCardArea)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(panelControl, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
.addComponent(panelCardArea, javax.swing.GroupLayout.DEFAULT_SIZE, 86, Short.MAX_VALUE))
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(panelControl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(2, 2, 2)
.addComponent(panelCardArea, javax.swing.GroupLayout.DEFAULT_SIZE, 179, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void jToggleCardViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleCardViewActionPerformed
currentView = this;
panelCardArea.setViewportView(cardArea);
cbSortBy.setEnabled(true);
chkPiles.setEnabled(true);
PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "cardView");
redrawCards();
}//GEN-LAST:event_jToggleCardViewActionPerformed
private void jToggleListViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleListViewActionPerformed
currentView = mainModel;
panelCardArea.setViewportView(mainTable);
@ -720,15 +637,6 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
drawCards(sortSetting);
}//GEN-LAST:event_chkPilesActionPerformed
private void jToggleCardViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleCardViewActionPerformed
currentView = this;
panelCardArea.setViewportView(cardArea);
cbSortBy.setEnabled(true);
chkPiles.setEnabled(true);
PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "cardView");
redrawCards();
}//GEN-LAST:event_jToggleCardViewActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.ButtonGroup bgView;
private javax.swing.JLayeredPane cardArea;
@ -736,13 +644,9 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
private javax.swing.JCheckBox chkPiles;
private javax.swing.JToggleButton jToggleCardView;
private javax.swing.JToggleButton jToggleListView;
private javax.swing.JLabel lblArtifactCount;
private javax.swing.JLabel lblCount;
private javax.swing.JLabel lblCreatureCount;
private javax.swing.JLabel lblEnchantmentCount;
private javax.swing.JLabel lblInstantCount;
private javax.swing.JLabel lblLandCount;
private javax.swing.JLabel lblSorceryCount;
private javax.swing.JScrollPane panelCardArea;
private javax.swing.JPanel panelControl;
// End of variables declaration//GEN-END:variables
@ -759,15 +663,15 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
e.consume();
if (obj instanceof Card) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((Card) obj).getOriginal(), "alt-double-click");
cardEventSource.fireEvent(((Card) obj).getOriginal(), ClientEventType.ALT_DOUBLE_CLICK);
} else {
cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click");
cardEventSource.fireEvent(((Card) obj).getOriginal(), ClientEventType.DOUBLE_CLICK);
}
} else if (obj instanceof MageCard) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((MageCard) obj).getOriginal(), "alt-double-click");
cardEventSource.fireEvent(((MageCard) obj).getOriginal(), ClientEventType.ALT_DOUBLE_CLICK);
} else {
cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click");
cardEventSource.fireEvent(((MageCard) obj).getOriginal(), ClientEventType.DOUBLE_CLICK);
}
}
}
@ -794,7 +698,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
private void checkMenu(MouseEvent Me, SimpleCardView card) {
if (Me.isPopupTrigger()) {
Me.consume();
cardEventSource.showPopupMenuEvent(card, Me.getComponent(), Me.getX(), Me.getY(), "show-popup-menu");
cardEventSource.fireEvent(card, Me.getComponent(), Me.getX(), Me.getY(), ClientEventType.SHOW_POP_UP_MENU);
}
}

View file

@ -34,18 +34,11 @@
package mage.client.cards;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import mage.cards.CardDimensions;
import mage.cards.MageCard;
import mage.client.plugins.impl.Plugins;
import mage.client.util.CardViewRarityComparator;
import mage.client.util.ClientEventType;
import mage.client.util.Event;
import mage.client.util.Listener;
import mage.client.util.audio.AudioManager;
@ -54,6 +47,12 @@ import mage.view.CardView;
import mage.view.CardsView;
import org.apache.log4j.Logger;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author BetaSteward_at_googlemail.com
@ -62,7 +61,7 @@ public class DraftGrid extends javax.swing.JPanel implements MouseListener {
private static final Logger logger = Logger.getLogger(DraftGrid.class);
protected CardEventSource cardEventSource = new CardEventSource();
protected final CardEventSource cardEventSource = new CardEventSource();
protected BigCard bigCard;
protected MageCard markedCard;
protected boolean emptyGrid;
@ -85,7 +84,7 @@ public class DraftGrid extends javax.swing.JPanel implements MouseListener {
}
public void loadBooster(CardsView booster, BigCard bigCard) {
if (booster instanceof CardsView && booster.size() == 0) {
if (booster instanceof CardsView && booster.isEmpty()) {
emptyGrid = true;
} else {
if (!emptyGrid) {
@ -126,9 +125,9 @@ public class DraftGrid extends javax.swing.JPanel implements MouseListener {
Dimension dimension = new Dimension(cardDimension.frameWidth, cardDimension.frameHeight);
List<CardView> sortedCards = new ArrayList<>(booster.values());
Collections.sort(sortedCards, new CardViewRarityComparator());
sortedCards.sort(new CardViewRarityComparator());
for (CardView card: sortedCards) {
MageCard cardImg = Plugins.getInstance().getMageCard(card, bigCard, dimension, null, true);
MageCard cardImg = Plugins.instance.getMageCard(card, bigCard, dimension, null, true, true);
cardImg.addMouseListener(this);
add(cardImg);
cardImg.update(card);
@ -157,7 +156,7 @@ public class DraftGrid extends javax.swing.JPanel implements MouseListener {
}
private void hidePopup() {
Plugins.getInstance().getActionCallback().mouseExited(null, null);
Plugins.instance.getActionCallback().mouseExited(null, null);
}
/** This method is called from within the constructor to
@ -187,7 +186,7 @@ public class DraftGrid extends javax.swing.JPanel implements MouseListener {
if (e.getButton() == MouseEvent.BUTTON1) {
Object obj = e.getSource();
if (obj instanceof MageCard) {
this.cardEventSource.doubleClick(((MageCard)obj).getOriginal(), "pick-a-card");
this.cardEventSource.fireEvent(((MageCard)obj).getOriginal(), ClientEventType.PICK_A_CARD);
this.hidePopup();
AudioManager.playOnDraftSelect();
}
@ -204,7 +203,7 @@ public class DraftGrid extends javax.swing.JPanel implements MouseListener {
if (this.markedCard != null) {
markedCard.setSelected(false);
}
this.cardEventSource.doubleClick(((MageCard)obj).getOriginal(), "mark-a-card");
this.cardEventSource.fireEvent(((MageCard)obj).getOriginal(), ClientEventType.MARK_A_CARD);
markedCard = ((MageCard)obj);
markedCard.setSelected(true);
repaint();

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
package mage.client.cards;
import mage.view.CardView;
import java.util.Collection;
/**
* Created by StravantUser on 2016-09-22.
*/
public interface DragCardSource {
Collection<CardView> dragCardList();
void dragCardBegin();
void dragCardEnd(DragCardTarget target);
}

View file

@ -0,0 +1,16 @@
package mage.client.cards;
import mage.view.CardView;
import java.awt.event.MouseEvent;
import java.util.Collection;
/**
* Created by StravantUser on 2016-09-22.
*/
public interface DragCardTarget {
void dragCardEnter(MouseEvent e);
void dragCardMove(MouseEvent e);
void dragCardExit(MouseEvent e);
void dragCardDrop(MouseEvent e, DragCardSource source, Collection<CardView> cards);
}

View file

@ -0,0 +1,84 @@
package mage.client.cards;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import javax.swing.JComponent;
class Slice {
double value;
Color color;
public Slice(double value, Color color) {
this.value = value;
this.color = color;
}
}
public class ManaPieChart extends JComponent {
ArrayList<Slice> slices = new ArrayList<Slice>();
ManaPieChart() {
}
ManaPieChart(Integer w, Integer u, Integer b, Integer r, Integer g, Integer c) {
if (w != null && w > 0) {
slices.add(new Slice(w, Color.WHITE));
}
if (u != null && u > 0) {
slices.add(new Slice(u, Color.BLUE));
}
if (b != null && b > 0) {
slices.add(new Slice(b, Color.BLACK));
}
if (r != null && r > 0) {
slices.add(new Slice(r, Color.RED));
}
if (g != null && g > 0) {
slices.add(new Slice(g, Color.GREEN));
}
if (c != null && c > 0) {
slices.add(new Slice(c, Color.LIGHT_GRAY));
}
}
@Override
public Dimension getPreferredSize() {
Dimension preferred = super.getPreferredSize();
Dimension minimum = getMinimumSize();
Dimension maximum = getMaximumSize();
preferred.width = Math.min(Math.max(preferred.width, minimum.width), maximum.width);
preferred.height = Math.min(Math.max(preferred.height, minimum.height), maximum.height);
return preferred;
}
public void paint(Graphics g) {
drawPie((Graphics2D) g, getBounds(), slices.toArray(new Slice[slices.size()]));
}
void drawPie(Graphics2D g, Rectangle area, Slice[] slices) {
double total = 0.0D;
for (int i = 0; i < slices.length; i++) {
total += slices[i].value;
}
double curValue = 0.0D;
int startAngle = 0;
int lastAngle = 0;
for (int i = 0; i < slices.length; i++) {
startAngle = lastAngle;
int arcAngle = (int) (slices[i].value * 360 / total);
g.setColor(slices[i].color);
g.fillArc(area.x, area.y, area.width - 20, area.height - 20, startAngle, arcAngle);
curValue += slices[i].value;
lastAngle += arcAngle;
}
}
}

View file

@ -34,30 +34,24 @@
package mage.client.cards;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import mage.cards.CardDimensions;
import mage.cards.MagePermanent;
import mage.cards.Sets;
import mage.client.util.Config;
import mage.client.util.TransformedImageCache;
import mage.view.CounterView;
import mage.view.PermanentView;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.swing.PopupFactory;
import mage.cards.CardDimensions;
import mage.cards.MagePermanent;
import mage.cards.Sets;
import static mage.client.constants.Constants.DAMAGE_MAX_LEFT;
import static mage.client.constants.Constants.POWBOX_TEXT_MAX_TOP;
import mage.client.util.Config;
import mage.client.util.ImageHelper;
import mage.constants.CardType;
import mage.view.CounterView;
import mage.view.PermanentView;
import org.mage.plugins.card.images.ImageCache;
import mage.client.util.TransformedImageCache;
/**
*
@ -67,9 +61,9 @@ public class Permanent extends Card {
protected PermanentView permanent;
protected List<MagePermanent> links = new ArrayList<>();
protected final List<MagePermanent> links = new ArrayList<>();
protected boolean linked;
protected BufferedImage tappedImage;
protected final BufferedImage tappedImage;
protected BufferedImage flippedImage;
/** Creates new form Permanent
@ -108,25 +102,25 @@ public class Permanent extends Card {
if (permanent.getOriginal() != null) {
sb.append("\n----- Originally -------\n");
sb.append(permanent.getOriginal().getName());
if (permanent.getOriginal().getManaCost().size() > 0) {
sb.append("\n").append(permanent.getOriginal().getManaCost());
if (!permanent.getOriginal().getManaCost().isEmpty()) {
sb.append('\n').append(permanent.getOriginal().getManaCost());
}
sb.append("\n").append(getType(permanent.getOriginal()));
sb.append('\n').append(getType(permanent.getOriginal()));
if (permanent.getOriginal().getColor().hasColor()) {
sb.append("\n").append(permanent.getOriginal().getColor().toString());
sb.append('\n').append(permanent.getOriginal().getColor().toString());
}
if (permanent.getOriginal().getCardTypes().contains(CardType.CREATURE)) {
sb.append("\n").append(permanent.getOriginal().getPower()).append("/").append(permanent.getOriginal().getToughness());
if (permanent.getOriginal().isCreature()) {
sb.append('\n').append(permanent.getOriginal().getPower()).append('/').append(permanent.getOriginal().getToughness());
}
else if (permanent.getOriginal().getCardTypes().contains(CardType.PLANESWALKER)) {
sb.append("\n").append(permanent.getOriginal().getLoyalty());
else if (permanent.getOriginal().isPlanesWalker()) {
sb.append('\n').append(permanent.getOriginal().getLoyalty());
}
for (String rule: getRules()) {
sb.append("\n").append(rule);
sb.append('\n').append(rule);
}
if (permanent.getOriginal().getExpansionSetCode().length() > 0) {
sb.append("\n").append(permanent.getCardNumber()).append(" - ");
sb.append("\n").append(Sets.getInstance().get(permanent.getOriginal().getExpansionSetCode()).getName()).append(" - ");
if (!permanent.getOriginal().getExpansionSetCode().isEmpty()) {
sb.append('\n').append(permanent.getCardNumber()).append(" - ");
sb.append('\n').append(Sets.getInstance().get(permanent.getOriginal().getExpansionSetCode()).getName()).append(" - ");
sb.append(permanent.getOriginal().getRarity().toString());
}
// sb.append("\n").append(card.getId());

Some files were not shown because too many files have changed in this diff Show more