mirror of
https://github.com/correl/mage.git
synced 2024-12-26 11:09:27 +00:00
commit
5a65e729c2
1297 changed files with 49758 additions and 3771 deletions
148
.gitignore
vendored
148
.gitignore
vendored
|
@ -1,73 +1,75 @@
|
|||
syntax: glob
|
||||
Mage.Client/*.dck
|
||||
Mage.Client/db
|
||||
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.Plugins/Mage.Deck.Constructed/target
|
||||
Mage.Server.Plugins/Mage.Deck.Limited/target
|
||||
Mage.Server.Plugins/Mage.Game.CommanderDuel/target
|
||||
Mage.Server.Plugins/Mage.Game.FreeForAll/target
|
||||
Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target
|
||||
Mage.Server.Plugins/Mage.Player.AI/target
|
||||
Mage.Server.Plugins/Mage.Player.AIMinimax/target
|
||||
Mage.Server.Plugins/Mage.Player.AI.MA/target
|
||||
Mage.Server.Plugins/Mage.Player.AIMCTS/target
|
||||
Mage.Server.Plugins/Mage.Player.Human/target
|
||||
Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target
|
||||
Mage.Server.Plugins/Mage.Tournament.BoosterDraft/target
|
||||
Mage.Server.Plugins/Mage.Tournament.Sealed/target
|
||||
Mage.Server.Plugins/Mage.Player.AI.DraftBot/target
|
||||
Mage.Server/config/init.txt
|
||||
Mage.Server/saved
|
||||
Mage.Server/target
|
||||
Mage.Server/db
|
||||
Mage.Server/cache
|
||||
Mage.Server/mageserver.log
|
||||
Mage.Sets/target
|
||||
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
|
||||
.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.Server.Plugins/Mage.Draft.8PlayerBooster/target
|
||||
\.orig\..*$
|
||||
\.orig$
|
||||
\.chg\..*$
|
||||
\.rej$
|
||||
\.conflict\~$
|
||||
/Mage.Server.Plugins/Mage.Player.AIMCTS/target/
|
||||
/Mage.Server.Console/target/
|
||||
*.classpath
|
||||
*.iml
|
||||
/submitted
|
||||
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.Plugins/Mage.Deck.Constructed/target
|
||||
Mage.Server.Plugins/Mage.Deck.Limited/target
|
||||
Mage.Server.Plugins/Mage.Game.CommanderDuel/target
|
||||
Mage.Server.Plugins/Mage.Game.FreeForAll/target
|
||||
Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target
|
||||
Mage.Server.Plugins/Mage.Player.AI/target
|
||||
Mage.Server.Plugins/Mage.Player.AIMinimax/target
|
||||
Mage.Server.Plugins/Mage.Player.AI.MA/target
|
||||
Mage.Server.Plugins/Mage.Player.AIMCTS/target
|
||||
Mage.Server.Plugins/Mage.Player.Human/target
|
||||
Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target
|
||||
Mage.Server.Plugins/Mage.Tournament.BoosterDraft/target
|
||||
/Mage.Server.Plugins/Mage.Tournament.Constructed/target
|
||||
Mage.Server.Plugins/Mage.Tournament.Sealed/target
|
||||
Mage.Server.Plugins/Mage.Player.AI.DraftBot/target
|
||||
Mage.Server/config/init.txt
|
||||
Mage.Server/saved
|
||||
Mage.Server/target
|
||||
Mage.Server/db
|
||||
Mage.Server/cache
|
||||
Mage.Server/mageserver.log
|
||||
Mage.Sets/target
|
||||
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
|
||||
.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.Server.Plugins/Mage.Draft.8PlayerBooster/target
|
||||
\.orig\..*$
|
||||
\.orig$
|
||||
\.chg\..*$
|
||||
\.rej$
|
||||
\.conflict\~$
|
||||
/Mage.Server.Plugins/Mage.Player.AIMCTS/target/
|
||||
/Mage.Server.Console/target/
|
||||
*.classpath
|
||||
*.iml
|
||||
/submitted
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
NAME:Heroes
|
||||
1 [DDL:26] Undying Rage
|
||||
1 [DDL:27] Battle Mastery
|
||||
1 [DDL:28] Griffin Guide
|
||||
1 [DDL:29] Smite the Monstrous
|
||||
1 [DDL:21] Stand Firm
|
||||
1 [THS:2] Cavalry Pegasus
|
||||
11 [THS:242] Mountain
|
||||
1 [DDL:20] Righteousness
|
||||
1 [THS:128] Magma Jet
|
||||
1 [DDL:25] Moment of Heroism
|
||||
1 [DDL:24] Bonds of Faith
|
||||
2 [DDL:12] Armory Guard
|
||||
1 [THS:186] Anax and Cymede
|
||||
1 [DDL:13] Gustcloak Sentinel
|
||||
1 [DDL:14] Dawnstrike Paladin
|
||||
2 [DDL:10] Freewind Equenaut
|
||||
1 [DDL:32] Pyrokinesis
|
||||
1 [DDL:31] Winds of Rath
|
||||
1 [DDL:19] Pay No Heed
|
||||
9 [THS:230] Plains
|
||||
1 [DDL:30] Miraculous Recovery
|
||||
1 [DDL:9] Auramancer
|
||||
1 [DDL:8] Truefire Paladin
|
||||
1 [THS:131] Ordeal of Purphoros
|
||||
1 [DDL:16] Kamahl, Pit Fighter
|
||||
2 [DDL:7] Stun Sniper
|
||||
1 [DDL:15] Nobilis of War
|
||||
1 [DDL:6] Thraben Valiant
|
||||
1 [DDL:5] Fencing Ace
|
||||
2 [DDL:34] New Benalia
|
||||
1 [DDL:18] Daily Regimen
|
||||
2 [DDL:33] Boros Guildgate
|
||||
2 [DDL:17] Condemn
|
||||
1 [DDL:3] Figure of Destiny
|
||||
1 [DDL:2] Somberwald Vigilante
|
||||
1 [DDL:1] Sun Titan
|
|
@ -0,0 +1,34 @@
|
|||
NAME:Monsters
|
||||
1 [DDL:48] Zhur-Taa Druid
|
||||
2 [DDL:49] Blood Ogre
|
||||
2 [DDL:45] Deadly Recluse
|
||||
1 [DDL:44] Orcish Lumberjack
|
||||
10 [THS:242] Mountain
|
||||
1 [DDL:46] Kavu Predator
|
||||
1 [THS:192] Destructive Revelry
|
||||
1 [THS:174] Satyr Hedonist
|
||||
11 [THS:246] Forest
|
||||
1 [DDL:60] Skarrgan Skybreaker
|
||||
1 [DDL:61] Shower of Sparks
|
||||
1 [THS:172] Polukranos, World Eater
|
||||
2 [DDL:62] Prey Upon
|
||||
1 [DDL:63] Pyroclasm
|
||||
1 [DDL:64] Regrowth
|
||||
1 [DDL:65] Terrifying Presence
|
||||
1 [DDL:67] Dragon Blood
|
||||
2 [DDL:68] Volt Charge
|
||||
1 [DDL:69] Beast Within
|
||||
1 [DDL:59] Krosan Tusker
|
||||
2 [DDL:58] Valley Rannet
|
||||
1 [DDL:57] Skarrgan Firebird
|
||||
1 [DDL:56] Crater Hellion
|
||||
1 [DDL:55] Conquering Manticore
|
||||
1 [DDL:54] Deus of Calamity
|
||||
2 [DDL:71] Kazandu Refuge
|
||||
1 [DDL:53] Ghor-Clan Savage
|
||||
2 [DDL:72] Llanowar Reborn
|
||||
2 [DDL:52] Gorehorn Minotaurs
|
||||
1 [DDL:70] Fires of Yavimaya
|
||||
1 [DDL:51] Crowned Ceratok
|
||||
1 [DDL:50] Troll Ascetic
|
||||
1 [DDL:73] Skarrg, the Rage Pits
|
|
@ -0,0 +1,32 @@
|
|||
NAME:Inspiring Heroics
|
||||
3 [RTR:214] Dryad Militant
|
||||
2 [THS:58] Ordeal of Thassa
|
||||
2 [RTR:155] Detention Sphere
|
||||
1 [THS:32] Soldier of the Pantheon
|
||||
4 [DGM:146] Azorius Guildgate
|
||||
3 [THS:189] Battlewise Hoplite
|
||||
3 [RTR:179] Lyev Skyknight
|
||||
1 [RTR:17] Precinct Captain
|
||||
1 [DGM:80] Lavinia of the Tenth
|
||||
14 [THS:230] Plains
|
||||
1 [RTR:181] New Prahv Guildmage
|
||||
2 [DGM:53] Ascended Lawmage
|
||||
1 [GTC:12] Frontline Medic
|
||||
1 [RTR:196] Skymark Roc
|
||||
5 [THS:234] Island
|
||||
2 [THS:6] Dauntless Onslaught
|
||||
2 [M14:7] Banisher Priest
|
||||
2 [M14:22] Imposing Sovereign
|
||||
1 [THS:25] Ordeal of Heliod
|
||||
1 [THS:12] Fabled Hero
|
||||
2 [M14:25] Pacifism
|
||||
3 [THS:19] Hopeful Eidolon
|
||||
2 [THS:16] Gods Willing
|
||||
1 [RTR:241] Hallowed Fountain
|
||||
SB: 2 [RTR:3] Arrest
|
||||
SB: 2 [GTC:219] Gift of Orzhova
|
||||
SB: 2 [THS:49] Gainsay
|
||||
SB: 3 [M14:36] Solemn Offering
|
||||
SB: 2 [THS:15] Glare of Heresy
|
||||
SB: 2 [THS:71] Triton Tactics
|
||||
SB: 2 [M14:64] Negate
|
|
@ -0,0 +1,25 @@
|
|||
NAME:Anthousa's Army
|
||||
1 [THS:35] Vanquish the Foul
|
||||
1 [THS:30] Setessan Griffin
|
||||
2 [THS:36] Wingsteed Rider
|
||||
2 [M14:168] Deadly Recluse
|
||||
2 [M14:169] Elvish Mystic
|
||||
1 [THS:151] Artisan's Sorrow
|
||||
2 [THS:179] Staunch-Hearted Warrior
|
||||
1 [THS:153] Bow of Nylea
|
||||
12 [THS:230] Plains
|
||||
1 [THS:149] Anthousa, Setessan Hero
|
||||
2 [THS:154] Centaur Battlemaster
|
||||
2 [THS:181] Time to Feed
|
||||
2 [THS:1] Battlewise Valor
|
||||
2 [THS:184] Warriors' Lesson
|
||||
2 [THS:6] Dauntless Onslaught
|
||||
13 [THS:246] Forest
|
||||
1 [THS:171] Pheres-Band Centaurs
|
||||
2 [M14:193] Rumbling Baloth
|
||||
2 [M14:174] Giant Growth
|
||||
2 [THS:190] Chronicler of Heroes
|
||||
2 [M14:25] Pacifism
|
||||
1 [THS:13] Favored Hoplite
|
||||
1 [THS:26] Phalanx Leader
|
||||
1 [THS:29] Setessan Battle Priest
|
|
@ -0,0 +1,26 @@
|
|||
NAME:Blazing Beasts of Myth
|
||||
2 [THS:130] Minotaur Skullcleaver
|
||||
1 [THS:175] Satyr Piper
|
||||
2 [THS:163] Nemesis of Mortals
|
||||
1 [THS:198] Polis Crusher
|
||||
1 [THS:151] Artisan's Sorrow
|
||||
1 [M14:201] Windstorm
|
||||
2 [THS:137] Rage of Purphoros
|
||||
14 [THS:242] Mountain
|
||||
2 [THS:164] Nessian Asp
|
||||
2 [THS:128] Magma Jet
|
||||
1 [THS:119] Dragon Mantle
|
||||
1 [THS:165] Nessian Courser
|
||||
2 [THS:182] Voyaging Satyr
|
||||
1 [THS:192] Destructive Revelry
|
||||
2 [THS:174] Satyr Hedonist
|
||||
1 [THS:133] Portent of Betrayal
|
||||
2 [THS:142] Stoneshock Giant
|
||||
11 [THS:246] Forest
|
||||
1 [M14:192] Rootwalla
|
||||
1 [THS:120] Ember Swallower
|
||||
2 [THS:127] Lightning Strike
|
||||
2 [THS:139] Satyr Rambler
|
||||
2 [THS:114] Borderland Minotaur
|
||||
2 [M14:160] Volcanic Geyser
|
||||
1 [THS:125] Ill-Tempered Cyclops
|
|
@ -0,0 +1,27 @@
|
|||
NAME:Devotion to Darkness
|
||||
1 [THS:58] Ordeal of Thassa
|
||||
2 [M14:89] Child of Night
|
||||
2 [THS:79] Blood-Toll Harpy
|
||||
2 [THS:89] Gray Merchant of Asphodel
|
||||
2 [M14:58] Glimpse the Future
|
||||
2 [THS:97] Mogis's Marauder
|
||||
1 [THS:96] March of the Returned
|
||||
1 [THS:222] Witches' Eye
|
||||
1 [THS:94] Lash of the Whip
|
||||
2 [M14:119] Undead Minotaur
|
||||
9 [THS:234] Island
|
||||
2 [THS:84] Disciple of Phenax
|
||||
1 [M14:107] Minotaur Abomination
|
||||
2 [THS:106] Sip of Hemlock
|
||||
2 [THS:92] Insatiable Harpy
|
||||
1 [THS:110] Whip of Erebos
|
||||
1 [THS:73] Voyage's End
|
||||
16 [THS:238] Swamp
|
||||
2 [THS:104] Returned Phalanx
|
||||
1 [THS:61] Sea God's Revenge
|
||||
1 [THS:80] Boon of Erebos
|
||||
1 [THS:102] Rescue from the Underworld
|
||||
1 [THS:50] Griptide
|
||||
1 [THS:100] Pharika's Cure
|
||||
2 [THS:51] Horizon Scholar
|
||||
1 [THS:75] Abhorrent Overlord
|
|
@ -0,0 +1,29 @@
|
|||
NAME:Favors From Nyx
|
||||
1 [THS:202] Sentry of the Underworld
|
||||
2 [THS:99] Ordeal of Erebos
|
||||
1 [THS:3] Celestial Archon
|
||||
1 [M14:86] Blightcaster
|
||||
1 [M14:6] Auramancer
|
||||
1 [M14:107] Minotaur Abomination
|
||||
1 [M14:7] Banisher Priest
|
||||
2 [THS:24] Observant Alseid
|
||||
1 [THS:25] Ordeal of Heliod
|
||||
1 [THS:27] Ray of Dissolution
|
||||
2 [THS:100] Pharika's Cure
|
||||
1 [THS:28] Scholar of Athreos
|
||||
2 [THS:35] Vanquish the Foul
|
||||
2 [THS:22] Last Breath
|
||||
2 [THS:21] Lagonna-Band Elder
|
||||
2 [THS:34] Traveling Philosopher
|
||||
1 [THS:37] Yoked Ox
|
||||
1 [THS:78] Baleful Eidolon
|
||||
1 [THS:86] Erebos's Emissary
|
||||
1 [M14:96] Doom Blade
|
||||
16 [THS:230] Plains
|
||||
1 [THS:81] Cavern Lampad
|
||||
1 [THS:14] Gift of Immortality
|
||||
9 [THS:238] Swamp
|
||||
1 [M14:25] Pacifism
|
||||
2 [THS:18] Heliod's Emissary
|
||||
2 [THS:19] Hopeful Eidolon
|
||||
1 [M14:28] Pillarfield Ox
|
|
@ -0,0 +1,26 @@
|
|||
NAME:Manipulative Monstrosities
|
||||
2 [THS:57] Omenspeaker
|
||||
1 [THS:47] Dissolve
|
||||
2 [M14:155] Shock
|
||||
1 [THS:46] Curse of the Swine
|
||||
2 [THS:45] Crackling Triton
|
||||
1 [M14:78] Wall of Frost
|
||||
2 [M14:43] Archaeomancer
|
||||
1 [M14:51] Disperse
|
||||
1 [THS:213] Burnished Hart
|
||||
2 [M14:49] Coral Merfolk
|
||||
2 [THS:137] Rage of Purphoros
|
||||
10 [THS:242] Mountain
|
||||
1 [THS:128] Magma Jet
|
||||
1 [M14:80] Water Servant
|
||||
1 [THS:131] Ordeal of Purphoros
|
||||
16 [THS:234] Island
|
||||
2 [THS:142] Stoneshock Giant
|
||||
1 [THS:61] Sea God's Revenge
|
||||
1 [THS:52] Lost in a Labyrinth
|
||||
2 [THS:62] Sealock Monster
|
||||
2 [THS:127] Lightning Strike
|
||||
2 [THS:50] Griptide
|
||||
1 [THS:63] Shipbreaker Kraken
|
||||
1 [M14:160] Volcanic Geyser
|
||||
2 [THS:125] Ill-Tempered Cyclops
|
|
@ -0,0 +1,34 @@
|
|||
NAME:Dan Unwin's BG Souls - 2nd place
|
||||
2 [ROE:115] Inquisition of Kozilek
|
||||
4 [ISD:105] Liliana of the Veil
|
||||
4 [RTR:213] Deathrite Shaman
|
||||
2 [RTR:243] Overgrown Tomb
|
||||
4 [WWK:145] Tectonic Edge
|
||||
4 [MMA:166] Tarmogoyf
|
||||
1 [EVE:180] Twilight Mire
|
||||
1 [RTR:248] Temple Garden
|
||||
1 [GTC:242] Godless Shrine
|
||||
4 [MMA:75] Dark Confidant
|
||||
1 [MBS:43] Go for the Throat
|
||||
4 [DKA:12] Lingering Souls
|
||||
2 [MMA:180] Maelstrom Pulse
|
||||
3 [M14:195] Scavenging Ooze
|
||||
4 [ZEN:219] Marsh Flats
|
||||
2 [NPH:57] Dismember
|
||||
3 [THS:107] Thoughtseize
|
||||
1 [THS:246] Forest
|
||||
2 [THS:238] Swamp
|
||||
1 [HOP:36] Phyrexian Arena
|
||||
2 [RTR:141] Abrupt Decay
|
||||
4 [10E:361] Treetop Village
|
||||
4 [ZEN:229] Verdant Catacombs
|
||||
SB: 2 [DKA:149] Grafdigger's Cage
|
||||
SB: 1 [SHM:227] Fracturing Gust
|
||||
SB: 1 [NPH:57] Dismember
|
||||
SB: 1 [THS:107] Thoughtseize
|
||||
SB: 1 [MMA:25] Path to Exile
|
||||
SB: 4 [SHM:188] Fulminator Mage
|
||||
SB: 2 [ISD:36] Stony Silence
|
||||
SB: 1 [MBS:92] Thrun, the Last Troll
|
||||
SB: 1 [MMA:217] Sword of Light and Shadow
|
||||
SB: 1 [HOP:36] Phyrexian Arena
|
|
@ -0,0 +1,27 @@
|
|||
NAME:Garry Wong's Tron - 5th place
|
||||
4 [10E:302] Sylvan Scrying
|
||||
4 [ROE:174] Ancient Stirrings
|
||||
4 [CMD:254] Oblivion Stone
|
||||
4 [9ED:329] Urza's Tower
|
||||
4 [9ED:327] Urza's Mine
|
||||
4 [9ED:328] Urza's Power Plant
|
||||
1 [ISD:240] Ghost Quarter
|
||||
1 [WWK:136] Eye of Ugin
|
||||
4 [ZEN:201] Expedition Map
|
||||
4 [NPH:1] Karn Liberated
|
||||
2 [THS:246] Forest
|
||||
4 [FUT:176] Grove of the Burnwillows
|
||||
4 [MRD:151] Chromatic Sphere
|
||||
4 [DDL:63] Pyroclasm
|
||||
4 [10E:314] Chromatic Star
|
||||
1 [ROE:4] Emrakul, the Aeons Torn
|
||||
4 [MMA:213] Relic of Progenitus
|
||||
3 [SOM:223] Wurmcoil Engine
|
||||
SB: 4 [WWK:108] Nature's Claim
|
||||
SB: 3 [NPH:159] Spellskite
|
||||
SB: 2 [NPH:162] Torpor Orb
|
||||
SB: 1 [DST:146] Sundering Titan
|
||||
SB: 1 [CMD:199] Firespout
|
||||
SB: 1 [ISD:240] Ghost Quarter
|
||||
SB: 2 [SOM:176] Mindslaver
|
||||
SB: 1 [SOM:223] Wurmcoil Engine
|
|
@ -0,0 +1,34 @@
|
|||
NAME:Justin Cheung's Jund - 3rd place
|
||||
3 [ROE:115] Inquisition of Kozilek
|
||||
4 [ISD:105] Liliana of the Veil
|
||||
4 [RTR:213] Deathrite Shaman
|
||||
2 [CMD:231] Terminate
|
||||
2 [RTR:243] Overgrown Tomb
|
||||
4 [MMA:166] Tarmogoyf
|
||||
1 [ZEN:220] Misty Rainforest
|
||||
4 [M11:149] Lightning Bolt
|
||||
1 [RTR:238] Blood Crypt
|
||||
3 [WWK:141] Raging Ravine
|
||||
4 [MMA:75] Dark Confidant
|
||||
1 [GTC:247] Stomping Ground
|
||||
2 [MMA:180] Maelstrom Pulse
|
||||
2 [M14:195] Scavenging Ooze
|
||||
3 [ZEN:219] Marsh Flats
|
||||
3 [THS:107] Thoughtseize
|
||||
1 [THS:246] Forest
|
||||
2 [THS:238] Swamp
|
||||
1 [M13:150] Thundermaw Hellkite
|
||||
2 [DKA:140] Huntmaster of the Fells
|
||||
1 [RTR:141] Abrupt Decay
|
||||
4 [SOM:224] Blackcleave Cliffs
|
||||
2 [10E:361] Treetop Village
|
||||
4 [ZEN:229] Verdant Catacombs
|
||||
SB: 2 [BOK:118] Sowing Salt
|
||||
SB: 2 [M11:188] Obstinate Baloth
|
||||
SB: 2 [DKA:149] Grafdigger's Cage
|
||||
SB: 2 [10E:229] Shatterstorm
|
||||
SB: 1 [NPH:162] Torpor Orb
|
||||
SB: 3 [SHM:188] Fulminator Mage
|
||||
SB: 1 [ISD:127] Ancient Grudge
|
||||
SB: 1 [RTR:141] Abrupt Decay
|
||||
SB: 1 [ISD:215] Olivia Voldaren
|
|
@ -0,0 +1,25 @@
|
|||
NAME:Justin Robb's Affinity - 1th place
|
||||
4 [DDF:71] Thoughtcast
|
||||
4 [HOP:110] Cranial Plating
|
||||
4 [MMA:220] Blinkmoth Nexus
|
||||
4 [DDF:72] Darksteel Citadel
|
||||
4 [LRW:261] Springleaf Drum
|
||||
4 [MBS:131] Signal Pest
|
||||
4 [SOM:179] Mox Opal
|
||||
4 [MBS:145] Inkmoth Nexus
|
||||
4 [SOM:91] Galvanic Blast
|
||||
4 [NPH:76] Vault Skirge
|
||||
3 [SOM:154] Etched Champion
|
||||
4 [MMA:198] Arcbound Ravager
|
||||
1 [THS:234] Island
|
||||
4 [M11:211] Ornithopter
|
||||
3 [DDF:44] Steel Overseer
|
||||
3 [MMA:223] Glimmervoid
|
||||
2 [SOM:174] Memnite
|
||||
SB: 2 [NPH:102] Whipflare
|
||||
SB: 1 [DGM:135] Wear // Tear
|
||||
SB: 3 [MMA:106] Blood Moon
|
||||
SB: 2 [NPH:159] Spellskite
|
||||
SB: 2 [THS:107] Thoughtseize
|
||||
SB: 3 [ISD:127] Ancient Grudge
|
||||
SB: 2 [NPH:7] Dispatch
|
|
@ -0,0 +1,16 @@
|
|||
NAME:Brian Geddes's Mono-Black Control
|
||||
4 [M14:96] Doom Blade
|
||||
2 [THS:85] Erebos, God of the Dead
|
||||
4 [RTR:73] Pack Rat
|
||||
2 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [M14:118] Tenacious Dead
|
||||
3 [M14:87] Blood Bairn
|
||||
4 [THS:107] Thoughtseize
|
||||
1 [M14:93] Dark Prophecy
|
||||
2 [M14:209] Elixir of Immortality
|
||||
20 [THS:238] Swamp
|
||||
3 [GTC:222] Nightveil Specter
|
||||
2 [THS:102] Rescue from the Underworld
|
||||
2 [M14:102] Liliana of the Dark Realms
|
||||
4 [THS:89] Gray Merchant of Asphodel
|
||||
3 [GTC:61] Crypt Ghast
|
|
@ -0,0 +1,16 @@
|
|||
NAME:David Spindola's Hammer Red
|
||||
3 [M14:134] Chandra's Phoenix
|
||||
2 [GTC:97] Legion Loyalist
|
||||
1 [M14:132] Chandra, Pyromaster
|
||||
3 [M14:139] Flames of the Firebrand
|
||||
4 [RTR:86] Ash Zealot
|
||||
4 [RTR:220] Rakdos Cackler
|
||||
3 [THS:135] Purphoros, God of the Forge
|
||||
19 [THS:242] Mountain
|
||||
4 [THS:128] Magma Jet
|
||||
4 [GTC:216] Burning-Tree Emissary
|
||||
4 [GTC:215] Boros Reckoner
|
||||
3 [GTC:92] Foundry Street Denizen
|
||||
1 [RTR:101] Mizzium Mortars
|
||||
2 [M14:228] Mutavault
|
||||
3 [THS:124] Hammer of Purphoros
|
|
@ -0,0 +1,13 @@
|
|||
NAME:Gavin Verhey's Big Game Hunter
|
||||
3 [M14:195] Scavenging Ooze
|
||||
3 [THS:166] Nylea, God of the Hunt
|
||||
4 [M14:182] Kalonian Tusker
|
||||
2 [M14:181] Kalonian Hydra
|
||||
2 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [THS:173] Reverent Hunter
|
||||
4 [GTC:119] Experiment One
|
||||
4 [GTC:216] Burning-Tree Emissary
|
||||
22 [THS:246] Forest
|
||||
4 [THS:172] Polukranos, World Eater
|
||||
4 [M14:169] Elvish Mystic
|
||||
4 [THS:152] Boon Satyr
|
|
@ -0,0 +1,17 @@
|
|||
NAME:Gavin Verhey's Orzhov Humans
|
||||
4 [M14:123] Xathrid Necromancer
|
||||
2 [DGM:153] Orzhov Guildgate
|
||||
4 [GTC:242] Godless Shrine
|
||||
4 [GTC:150] Cartel Aristocrat
|
||||
1 [THS:89] Gray Merchant of Asphodel
|
||||
3 [RTR:17] Precinct Captain
|
||||
3 [M14:96] Doom Blade
|
||||
8 [THS:230] Plains
|
||||
4 [GTC:182] Obzedat, Ghost Council
|
||||
4 [DGM:103] Sin Collector
|
||||
3 [THS:107] Thoughtseize
|
||||
3 [THS:110] Whip of Erebos
|
||||
4 [M14:22] Imposing Sovereign
|
||||
7 [THS:238] Swamp
|
||||
2 [GTC:185] Orzhov Charm
|
||||
4 [THS:227] Temple of Silence
|
|
@ -0,0 +1,16 @@
|
|||
NAME:Gavin Verhey's Reaniwhip
|
||||
3 [RTR:213] Deathrite Shaman
|
||||
4 [RTR:243] Overgrown Tomb
|
||||
4 [RTR:165] Grisly Salvage
|
||||
3 [RTR:177] Lotleth Troll
|
||||
4 [M14:169] Elvish Mystic
|
||||
4 [DGM:149] Golgari Guildgate
|
||||
4 [THS:98] Nighthowler
|
||||
4 [THS:155] Commune with the Gods
|
||||
4 [THS:180] Sylvan Caryatid
|
||||
9 [THS:246] Forest
|
||||
4 [THS:110] Whip of Erebos
|
||||
5 [THS:238] Swamp
|
||||
2 [M14:115] Shadowborn Demon
|
||||
2 [GTC:188] Prime Speaker Zegana
|
||||
4 [THS:75] Abhorrent Overlord
|
|
@ -0,0 +1,15 @@
|
|||
NAME:Jim Boulter's Manaburst Green
|
||||
4 [GTC:123] Gyre Sage
|
||||
4 [GTC:115] Burst of Strength
|
||||
4 [M14:169] Elvish Mystic
|
||||
4 [M14:198] Vastwood Hydra
|
||||
3 [THS:160] Karametra's Acolyte
|
||||
1 [THS:153] Bow of Nylea
|
||||
1 [THS:166] Nylea, God of the Hunt
|
||||
4 [M14:181] Kalonian Hydra
|
||||
3 [THS:180] Sylvan Caryatid
|
||||
3 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [THS:173] Reverent Hunter
|
||||
18 [THS:246] Forest
|
||||
4 [GTC:216] Burning-Tree Emissary
|
||||
3 [THS:172] Polukranos, World Eater
|
|
@ -0,0 +1,13 @@
|
|||
NAME:Joshua Bader's Return of the Caba
|
||||
4 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [M14:118] Tenacious Dead
|
||||
4 [THS:107] Thoughtseize
|
||||
4 [M14:93] Dark Prophecy
|
||||
4 [M14:115] Shadowborn Demon
|
||||
20 [THS:238] Swamp
|
||||
4 [GTC:222] Nightveil Specter
|
||||
4 [THS:101] Read the Bones
|
||||
4 [M14:99] Gnawing Zombie
|
||||
2 [M14:102] Liliana of the Dark Realms
|
||||
4 [THS:89] Gray Merchant of Asphodel
|
||||
2 [THS:75] Abhorrent Overlord
|
|
@ -0,0 +1,14 @@
|
|||
NAME:Kevin's White Weenie
|
||||
4 [RTR:214] Dryad Militant
|
||||
4 [M14:10] Brave the Elements
|
||||
4 [GTC:7] Boros Elite
|
||||
2 [RTR:218] Judge's Familiar
|
||||
4 [RTR:17] Precinct Captain
|
||||
18 [THS:230] Plains
|
||||
2 [M14:7] Banisher Priest
|
||||
4 [GTC:215] Boros Reckoner
|
||||
4 [M14:22] Imposing Sovereign
|
||||
4 [M14:18] Fiendslayer Paladin
|
||||
2 [THS:16] Gods Willing
|
||||
4 [M14:228] Mutavault
|
||||
4 [THS:17] Heliod, God of the Sun
|
|
@ -0,0 +1,16 @@
|
|||
NAME:Kyle's Assemble the Forge
|
||||
4 [GTC:142] Assemble the Legion
|
||||
2 [GTC:144] Aurelia's Fury
|
||||
4 [RTR:215] Frostburn Weird
|
||||
4 [DGM:147] Boros Guildgate
|
||||
4 [GTC:245] Sacred Foundry
|
||||
4 [THS:135] Purphoros, God of the Forge
|
||||
3 [GTC:227] Boros Keyrune
|
||||
5 [THS:230] Plains
|
||||
10 [THS:242] Mountain
|
||||
1 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [THS:4] Chained to the Rocks
|
||||
4 [GTC:215] Boros Reckoner
|
||||
3 [RTR:101] Mizzium Mortars
|
||||
4 [THS:16] Gods Willing
|
||||
4 [THS:124] Hammer of Purphoros
|
|
@ -0,0 +1,15 @@
|
|||
NAME:Ryan Schwenk's Mono-Red Devotion
|
||||
4 [M14:134] Chandra's Phoenix
|
||||
2 [M14:132] Chandra, Pyromaster
|
||||
4 [RTR:86] Ash Zealot
|
||||
4 [M14:155] Shock
|
||||
4 [RTR:220] Rakdos Cackler
|
||||
2 [THS:135] Purphoros, God of the Forge
|
||||
18 [THS:242] Mountain
|
||||
2 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [THS:128] Magma Jet
|
||||
4 [GTC:215] Boros Reckoner
|
||||
4 [M14:163] Young Pyromancer
|
||||
2 [M14:160] Volcanic Geyser
|
||||
2 [M14:228] Mutavault
|
||||
4 [RTR:101] Mizzium Mortars
|
|
@ -0,0 +1,17 @@
|
|||
NAME:Sam Pate's Devotion to Smashy Smashy
|
||||
2 [GTC:156] Domri Rade
|
||||
3 [GTC:224] Rubblebelt Raiders
|
||||
4 [GTC:247] Stomping Ground
|
||||
3 [THS:160] Karametra's Acolyte
|
||||
3 [THS:153] Bow of Nylea
|
||||
2 [THS:166] Nylea, God of the Hunt
|
||||
2 [THS:135] Purphoros, God of the Forge
|
||||
10 [THS:242] Mountain
|
||||
2 [THS:223] Nykthos, Shrine to Nyx
|
||||
3 [THS:138] Rageblood Shaman
|
||||
3 [THS:173] Reverent Hunter
|
||||
4 [THS:174] Satyr Hedonist
|
||||
8 [THS:246] Forest
|
||||
4 [GTC:216] Burning-Tree Emissary
|
||||
4 [GTC:215] Boros Reckoner
|
||||
3 [THS:124] Hammer of Purphoros
|
|
@ -0,0 +1,17 @@
|
|||
NAME:Anil Yigit Filiz's Heroic Tokens
|
||||
2 [M14:147] Molten Birth
|
||||
4 [RTR:98] Guttersnipe
|
||||
2 [GTC:148] Boros Charm
|
||||
3 [THS:186] Anax and Cymede
|
||||
4 [GTC:245] Sacred Foundry
|
||||
2 [DGM:116] Warleader's Helix
|
||||
2 [THS:135] Purphoros, God of the Forge
|
||||
8 [THS:230] Plains
|
||||
8 [THS:242] Mountain
|
||||
4 [THS:128] Magma Jet
|
||||
4 [M14:163] Young Pyromancer
|
||||
1 [THS:9] Elspeth, Sun's Champion
|
||||
4 [THS:111] Akroan Crusader
|
||||
4 [GTC:175] Martial Glory
|
||||
4 [THS:228] Temple of Triumph
|
||||
4 [THS:16] Gods Willing
|
|
@ -0,0 +1,17 @@
|
|||
NAME:Bill Cheng's Artemis
|
||||
2 [GTC:156] Domri Rade
|
||||
4 [GTC:169] Gruul Charm
|
||||
3 [GTC:224] Rubblebelt Raiders
|
||||
3 [M14:169] Elvish Mystic
|
||||
4 [GTC:247] Stomping Ground
|
||||
3 [THS:152] Boon Satyr
|
||||
2 [THS:153] Bow of Nylea
|
||||
4 [M14:182] Kalonian Tusker
|
||||
2 [THS:166] Nylea, God of the Hunt
|
||||
3 [M14:181] Kalonian Hydra
|
||||
6 [THS:242] Mountain
|
||||
3 [THS:224] Temple of Abandon
|
||||
10 [THS:246] Forest
|
||||
4 [GTC:119] Experiment One
|
||||
4 [M14:202] Witchstalker
|
||||
3 [DGM:128] Flesh // Blood
|
|
@ -0,0 +1,19 @@
|
|||
NAME:Cameron Hensel's Trash and Dash
|
||||
3 [M14:148] Ogre Battledriver
|
||||
4 [GTC:167] Ghor-Clan Rampager
|
||||
4 [RTR:243] Overgrown Tomb
|
||||
4 [RTR:238] Blood Crypt
|
||||
3 [RTR:165] Grisly Salvage
|
||||
4 [RTR:177] Lotleth Troll
|
||||
4 [GTC:220] Immortal Servitude
|
||||
4 [GTC:247] Stomping Ground
|
||||
3 [THS:135] Purphoros, God of the Forge
|
||||
4 [THS:180] Sylvan Caryatid
|
||||
4 [THS:242] Mountain
|
||||
1 [THS:224] Temple of Abandon
|
||||
1 [THS:246] Forest
|
||||
4 [DGM:38] Rubblebelt Maaka
|
||||
3 [THS:238] Swamp
|
||||
4 [M14:161] Wild Guess
|
||||
4 [THS:121] Fanatic of Mogis
|
||||
2 [DGM:98] Rot Farm Skeleton
|
|
@ -0,0 +1,16 @@
|
|||
NAME:Carlos McMartin's Paint It Black
|
||||
4 [M14:96] Doom Blade
|
||||
3 [THS:98] Nighthowler
|
||||
3 [THS:85] Erebos, God of the Dead
|
||||
4 [RTR:63] Desecration Demon
|
||||
2 [RTR:82] Ultimate Price
|
||||
4 [THS:223] Nykthos, Shrine to Nyx
|
||||
3 [THS:107] Thoughtseize
|
||||
1 [M14:93] Dark Prophecy
|
||||
2 [THS:110] Whip of Erebos
|
||||
20 [THS:238] Swamp
|
||||
4 [M14:101] Lifebane Zombie
|
||||
2 [THS:76] Agent of the Fates
|
||||
3 [M14:102] Liliana of the Dark Realms
|
||||
2 [GTC:61] Crypt Ghast
|
||||
3 [THS:75] Abhorrent Overlord
|
|
@ -0,0 +1,22 @@
|
|||
NAME:Devin Carter's Duskmantle Seer
|
||||
4 [GTC:159] Duskmantle Seer
|
||||
4 [THS:57] Omenspeaker
|
||||
4 [RTR:145] Azorius Charm
|
||||
2 [RTR:35] Cyclonic Rift
|
||||
1 [RTR:200] Sphinx's Revelation
|
||||
1 [GTC:242] Godless Shrine
|
||||
2 [THS:188] Ashiok, Nightmare Weaver
|
||||
3 [M14:96] Doom Blade
|
||||
2 [DGM:57] Blood Baron of Vizkopa
|
||||
3 [THS:225] Temple of Deceit
|
||||
2 [GTC:219] Gift of Orzhova
|
||||
2 [M14:55] Essence Scatter
|
||||
3 [THS:234] Island
|
||||
4 [THS:107] Thoughtseize
|
||||
6 [THS:238] Swamp
|
||||
2 [THS:73] Voyage's End
|
||||
4 [GTC:249] Watery Grave
|
||||
2 [RTR:54] Syncopate
|
||||
2 [M14:228] Mutavault
|
||||
4 [RTR:241] Hallowed Fountain
|
||||
3 [THS:227] Temple of Silence
|
|
@ -0,0 +1,13 @@
|
|||
NAME:Fuhe Xu's Mono-Red Minotaurs
|
||||
2 [THS:135] Purphoros, God of the Forge
|
||||
20 [THS:242] Mountain
|
||||
4 [M14:132] Chandra, Pyromaster
|
||||
2 [THS:128] Magma Jet
|
||||
4 [THS:138] Rageblood Shaman
|
||||
4 [RTR:86] Ash Zealot
|
||||
4 [RTR:221] Rakdos Shred-Freak
|
||||
4 [THS:143] Stormbreath Dragon
|
||||
4 [GTC:215] Boros Reckoner
|
||||
4 [THS:121] Fanatic of Mogis
|
||||
4 [THS:127] Lightning Strike
|
||||
4 [M14:228] Mutavault
|
|
@ -0,0 +1,19 @@
|
|||
NAME:Gavin Verhey's Project C
|
||||
4 [THS:57] Omenspeaker
|
||||
4 [RTR:155] Detention Sphere
|
||||
4 [RTR:248] Temple Garden
|
||||
1 [DGM:146] Azorius Guildgate
|
||||
4 [GTC:240] Breeding Pool
|
||||
4 [GTC:162] Fathom Mage
|
||||
4 [M14:169] Elvish Mystic
|
||||
2 [THS:199] Prophet of Kruphix
|
||||
4 [THS:226] Temple of Mystery
|
||||
3 [THS:230] Plains
|
||||
4 [THS:180] Sylvan Caryatid
|
||||
4 [THS:193] Fleecemane Lion
|
||||
4 [THS:194] Horizon Chimera
|
||||
4 [M14:5] Archangel of Thune
|
||||
4 [THS:246] Forest
|
||||
2 [GTC:188] Prime Speaker Zegana
|
||||
4 [RTR:241] Hallowed Fountain
|
||||
SB: 4 [M14:36] Solemn Offering
|
|
@ -0,0 +1,19 @@
|
|||
NAME:Ingvi Oernolfsson's Aggro-Rock
|
||||
4 [RTR:243] Overgrown Tomb
|
||||
4 [RTR:248] Temple Garden
|
||||
4 [GTC:242] Godless Shrine
|
||||
4 [RTR:178] Loxodon Smiter
|
||||
4 [M14:169] Elvish Mystic
|
||||
4 [THS:201] Reaper of the Wilds
|
||||
2 [GTC:63] Devour Flesh
|
||||
2 [BOK:68] Hero's Demise
|
||||
1 [M14:96] Doom Blade
|
||||
3 [DGM:57] Blood Baron of Vizkopa
|
||||
4 [THS:193] Fleecemane Lion
|
||||
3 [THS:180] Sylvan Caryatid
|
||||
3 [GTC:219] Gift of Orzhova
|
||||
2 [M14:3] Angelic Accord
|
||||
9 [THS:246] Forest
|
||||
3 [DGM:111] Unflinching Courage
|
||||
2 [DGM:132] Ready // Willing
|
||||
4 [THS:227] Temple of Silence
|
|
@ -0,0 +1,17 @@
|
|||
NAME:Isaachaze's WBR Burn
|
||||
4 [M14:134] Chandra's Phoenix
|
||||
4 [RTR:213] Deathrite Shaman
|
||||
2 [DGM:154] Rakdos Guildgate
|
||||
4 [M14:155] Shock
|
||||
4 [RTR:238] Blood Crypt
|
||||
4 [GTC:148] Boros Charm
|
||||
4 [GTC:242] Godless Shrine
|
||||
4 [GTC:245] Sacred Foundry
|
||||
4 [DGM:116] Warleader's Helix
|
||||
4 [THS:128] Magma Jet
|
||||
4 [DGM:106] Spike Jester
|
||||
4 [GTC:106] Skullcrack
|
||||
4 [GTC:215] Boros Reckoner
|
||||
4 [THS:127] Lightning Strike
|
||||
4 [THS:228] Temple of Triumph
|
||||
2 [THS:227] Temple of Silence
|
|
@ -0,0 +1,16 @@
|
|||
NAME:Itou Kazunari's Boros Heroic Legion
|
||||
2 [GTC:142] Assemble the Legion
|
||||
2 [THS:33] Spear of Heliod
|
||||
4 [GTC:148] Boros Charm
|
||||
4 [RTR:9] Ethereal Armor
|
||||
2 [THS:186] Anax and Cymede
|
||||
4 [RTR:11] Fencing Ace
|
||||
4 [GTC:245] Sacred Foundry
|
||||
4 [RTR:17] Precinct Captain
|
||||
15 [THS:230] Plains
|
||||
2 [M14:224] Strionic Resonator
|
||||
5 [THS:242] Mountain
|
||||
4 [THS:13] Favored Hoplite
|
||||
4 [THS:26] Phalanx Leader
|
||||
2 [M14:26] Path of Bravery
|
||||
2 [THS:17] Heliod, God of the Sun
|
|
@ -0,0 +1,21 @@
|
|||
NAME:Jacob Smith's Bant Chimera
|
||||
4 [RTR:248] Temple Garden
|
||||
4 [GTC:240] Breeding Pool
|
||||
4 [GTC:162] Fathom Mage
|
||||
3 [M14:169] Elvish Mystic
|
||||
3 [GTC:50] Simic Manipulator
|
||||
3 [THS:199] Prophet of Kruphix
|
||||
2 [GTC:209] Zameck Guildmage
|
||||
4 [THS:226] Temple of Mystery
|
||||
1 [THS:230] Plains
|
||||
4 [THS:180] Sylvan Caryatid
|
||||
2 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [THS:194] Horizon Chimera
|
||||
2 [M14:172] Garruk, Caller of Beasts
|
||||
3 [THS:234] Island
|
||||
4 [M14:5] Archangel of Thune
|
||||
2 [THS:246] Forest
|
||||
2 [THS:42] Bident of Thassa
|
||||
2 [GTC:188] Prime Speaker Zegana
|
||||
3 [THS:66] Thassa, God of the Sea
|
||||
4 [RTR:241] Hallowed Fountain
|
|
@ -0,0 +1,10 @@
|
|||
NAME:James's Abhorrent Demons
|
||||
4 [THS:98] Nighthowler
|
||||
4 [M14:123] Xathrid Necromancer
|
||||
2 [THS:107] Thoughtseize
|
||||
16 [M14:114] Shadowborn Apostle
|
||||
4 [GTC:71] Lord of the Void
|
||||
4 [THS:90] Hero's Downfall
|
||||
20 [THS:238] Swamp
|
||||
4 [GTC:220] Immortal Servitude
|
||||
4 [THS:75] Abhorrent Overlord
|
|
@ -0,0 +1,14 @@
|
|||
NAME:Luke Maudlin's Purphoros's Legion
|
||||
4 [GTC:142] Assemble the Legion
|
||||
4 [M14:147] Molten Birth
|
||||
4 [GTC:148] Boros Charm
|
||||
4 [M14:155] Shock
|
||||
4 [GTC:245] Sacred Foundry
|
||||
4 [DGM:116] Warleader's Helix
|
||||
4 [THS:135] Purphoros, God of the Forge
|
||||
5 [THS:230] Plains
|
||||
11 [THS:242] Mountain
|
||||
4 [THS:128] Magma Jet
|
||||
4 [M14:163] Young Pyromancer
|
||||
4 [THS:127] Lightning Strike
|
||||
4 [THS:228] Temple of Triumph
|
|
@ -0,0 +1,16 @@
|
|||
NAME:Nathan Kalsch's The God Complex
|
||||
2 [DGM:11] AEtherling
|
||||
4 [THS:56] Nimbus Naiad
|
||||
4 [RTR:215] Frostburn Weird
|
||||
2 [RTR:35] Cyclonic Rift
|
||||
4 [RTR:247] Steam Vents
|
||||
4 [GTC:222] Nightveil Specter
|
||||
4 [THS:135] Purphoros, God of the Forge
|
||||
4 [GTC:45] Realmwright
|
||||
2 [THS:223] Nykthos, Shrine to Nyx
|
||||
4 [M14:73] Tidebinder Mage
|
||||
14 [THS:234] Island
|
||||
2 [THS:42] Bident of Thassa
|
||||
4 [THS:53] Master of Waves
|
||||
2 [M14:228] Mutavault
|
||||
4 [THS:66] Thassa, God of the Sea
|
|
@ -0,0 +1,20 @@
|
|||
NAME:Sam's The Ashen Rider Rides Again!
|
||||
4 [RTR:243] Overgrown Tomb
|
||||
4 [RTR:248] Temple Garden
|
||||
3 [RTR:165] Grisly Salvage
|
||||
4 [GTC:242] Godless Shrine
|
||||
2 [THS:187] Ashen Rider
|
||||
4 [RTR:177] Lotleth Troll
|
||||
2 [DGM:57] Blood Baron of Vizkopa
|
||||
2 [THS:230] Plains
|
||||
2 [THS:85] Erebos, God of the Dead
|
||||
3 [THS:155] Commune with the Gods
|
||||
4 [THS:180] Sylvan Caryatid
|
||||
2 [GTC:182] Obzedat, Ghost Council
|
||||
3 [THS:246] Forest
|
||||
2 [THS:110] Whip of Erebos
|
||||
2 [DGM:89] Obzedat's Aid
|
||||
4 [THS:90] Hero's Downfall
|
||||
2 [DGM:63] Deadbridge Chant
|
||||
8 [THS:238] Swamp
|
||||
3 [THS:102] Rescue from the Underworld
|
|
@ -0,0 +1,18 @@
|
|||
NAME:Stephen Wise's En Garde Auras
|
||||
4 [THS:39] Aqueous Form
|
||||
4 [THS:58] Ordeal of Thassa
|
||||
3 [RTR:155] Detention Sphere
|
||||
4 [RTR:9] Ethereal Armor
|
||||
2 [DGM:146] Azorius Guildgate
|
||||
4 [RTR:11] Fencing Ace
|
||||
2 [THS:189] Battlewise Hoplite
|
||||
2 [M14:1] Ajani, Caller of the Pride
|
||||
10 [THS:230] Plains
|
||||
3 [GTC:219] Gift of Orzhova
|
||||
3 [THS:191] Daxos of Meletis
|
||||
6 [THS:234] Island
|
||||
2 [DGM:17] Runner's Bane
|
||||
3 [THS:12] Fabled Hero
|
||||
4 [THS:13] Favored Hoplite
|
||||
2 [THS:26] Phalanx Leader
|
||||
4 [RTR:241] Hallowed Fountain
|
|
@ -0,0 +1,19 @@
|
|||
NAME:Tkotz's RUG Ordeal of the Gods
|
||||
4 [THS:58] Ordeal of Thassa
|
||||
4 [RTR:247] Steam Vents
|
||||
3 [GTC:160] Elusive Krasis
|
||||
4 [GTC:240] Breeding Pool
|
||||
4 [M14:176] Gladecover Scout
|
||||
4 [GTC:247] Stomping Ground
|
||||
4 [THS:170] Ordeal of Nylea
|
||||
1 [GTC:32] Cloudfin Raptor
|
||||
2 [THS:242] Mountain
|
||||
2 [THS:131] Ordeal of Purphoros
|
||||
3 [THS:234] Island
|
||||
5 [THS:246] Forest
|
||||
4 [GTC:216] Burning-Tree Emissary
|
||||
4 [GTC:119] Experiment One
|
||||
3 [GTC:195] Simic Charm
|
||||
3 [DGM:100] Savageborn Hydra
|
||||
3 [GTC:176] Master Biomancer
|
||||
3 [THS:124] Hammer of Purphoros
|
|
@ -0,0 +1,23 @@
|
|||
NAME:Antonio's Sliver aNAYAlation
|
||||
4 [M14:158] Thorncaster Sliver
|
||||
2 [RTR:248] Temple Garden
|
||||
4 [M14:21] Hive Stirrings
|
||||
4 [GTC:148] Boros Charm
|
||||
3 [M14:128] Battle Sliver
|
||||
2 [M14:230] Plains
|
||||
1 [ISD:239] Gavony Township
|
||||
4 [M14:242] Mountain
|
||||
2 [M14:246] Forest
|
||||
3 [GTC:247] Stomping Ground
|
||||
4 [M14:189] Predatory Sliver
|
||||
3 [GTC:245] Sacred Foundry
|
||||
1 [ISD:174] Creeping Renaissance
|
||||
4 [M14:38] Steelform Sliver
|
||||
1 [GTC:12] Frontline Medic
|
||||
1 [M14:172] Garruk, Caller of Beasts
|
||||
2 [M14:185] Megantic Sliver
|
||||
3 [M14:184] Manaweft Sliver
|
||||
3 [M14:208] Door of Destinies
|
||||
1 [M14:9] Bonescythe Sliver
|
||||
4 [RTR:101] Mizzium Mortars
|
||||
4 [AVR:226] Cavern of Souls
|
|
@ -0,0 +1,14 @@
|
|||
NAME:Connor Gerace's Red Deck Wins
|
||||
4 [M13:147] Searing Spear
|
||||
4 [RTR:220] Rakdos Cackler
|
||||
18 [M14:242] Mountain
|
||||
4 [DKA:93] Hellrider
|
||||
4 [AVR:144] Lightning Mauler
|
||||
4 [ISD:164] Stromkirk Noble
|
||||
4 [GTC:216] Burning-Tree Emissary
|
||||
4 [GTC:215] Boros Reckoner
|
||||
3 [M14:228] Mutavault
|
||||
2 [DKA:101] Pyreheart Wolf
|
||||
2 [M14:130] Burning Earth
|
||||
4 [RTR:101] Mizzium Mortars
|
||||
3 [AVR:149] Pillar of Flame
|
|
@ -0,0 +1,15 @@
|
|||
NAME:David's Essence Tokens
|
||||
4 [M13:160] Arbor Elf
|
||||
4 [M13:173] Fungal Sprouting
|
||||
4 [DKA:8] Gather the Townsfolk
|
||||
3 [M13:174] Garruk, Primal Hunter
|
||||
4 [RTR:19] Rootborn Defenses
|
||||
1 [RTR:206] Trostani, Selesnya's Voice
|
||||
4 [RTR:248] Temple Garden
|
||||
8 [M14:230] Plains
|
||||
4 [M14:169] Elvish Mystic
|
||||
4 [ISD:22] Midnight Haunting
|
||||
8 [M14:246] Forest
|
||||
4 [RTR:194] Selesnya Charm
|
||||
4 [M13:229] Sunpetal Grove
|
||||
4 [ISD:178] Essence of the Wild
|
|
@ -0,0 +1,22 @@
|
|||
NAME:Douglas Scheinberg's Séance Combo
|
||||
1 [AVR:42] Alchemist's Apprentice
|
||||
4 [RTR:1] Angel of Serenity
|
||||
1 [ISD:68] Mirror-Mad Phantasm
|
||||
2 [ISD:248] Sulfur Falls
|
||||
4 [RTR:249] Transguild Promenade
|
||||
3 [RTR:247] Steam Vents
|
||||
1 [AVR:1] Angel of Glory's Rise
|
||||
4 [ISD:122] Unburial Rites
|
||||
4 [RTR:201] Supreme Verdict
|
||||
1 [ISD:55] Forbidden Alchemy
|
||||
1 [ISD:61] Laboratory Maniac
|
||||
3 [ISD:238] Clifftop Retreat
|
||||
3 [ISD:43] Armored Skaab
|
||||
2 [GTC:245] Sacred Foundry
|
||||
4 [M13:69] Sphinx of Uthuun
|
||||
3 [M13:225] Glacial Fortress
|
||||
4 [RTR:172] Izzet Charm
|
||||
2 [AVR:229] Slayers' Stronghold
|
||||
2 [AVR:226] Cavern of Souls
|
||||
4 [DKA:87] Faithless Looting
|
||||
4 [RTR:241] Hallowed Fountain
|
|
@ -0,0 +1,28 @@
|
|||
NAME:Erick Lavandier's Naya Flicker
|
||||
2 [M14:148] Ogre Battledriver
|
||||
2 [GTC:143] Aurelia, the Warleader
|
||||
2 [GTC:148] Boros Charm
|
||||
1 [M14:230] Plains
|
||||
2 [M14:242] Mountain
|
||||
1 [ISD:239] Gavony Township
|
||||
2 [ISD:238] Clifftop Retreat
|
||||
2 [AVR:210] Sigarda, Host of Herons
|
||||
2 [M14:169] Elvish Mystic
|
||||
2 [M14:246] Forest
|
||||
3 [GTC:12] Frontline Medic
|
||||
3 [AVR:169] Borderland Ranger
|
||||
2 [GTC:119] Experiment One
|
||||
2 [M14:18] Fiendslayer Paladin
|
||||
3 [AVR:226] Cavern of Souls
|
||||
4 [AVR:12] Cloudshift
|
||||
4 [RTR:248] Temple Garden
|
||||
4 [AVR:32] Restoration Angel
|
||||
3 [M13:193] Thragtusk
|
||||
2 [GTC:247] Stomping Ground
|
||||
2 [GTC:245] Sacred Foundry
|
||||
1 [ISD:243] Kessig Wolf Run
|
||||
1 [AVR:194] Somberwald Sage
|
||||
4 [ISD:170] Avacyn's Pilgrim
|
||||
2 [ISD:17] Geist-Honored Monk
|
||||
1 [M13:229] Sunpetal Grove
|
||||
2 [DKA:140] Huntmaster of the Fells
|
|
@ -0,0 +1,22 @@
|
|||
NAME:Gavin Verhey's (Mostly) Naya Slivers
|
||||
1 [M14:158] Thorncaster Sliver
|
||||
4 [M14:157] Striking Sliver
|
||||
2 [RTR:248] Temple Garden
|
||||
4 [M14:21] Hive Stirrings
|
||||
1 [RTR:247] Steam Vents
|
||||
3 [M14:128] Battle Sliver
|
||||
4 [M14:129] Blur Sliver
|
||||
1 [ISD:238] Clifftop Retreat
|
||||
1 [M14:30] Sentinel Sliver
|
||||
4 [GTC:247] Stomping Ground
|
||||
4 [M14:189] Predatory Sliver
|
||||
4 [GTC:245] Sacred Foundry
|
||||
2 [M14:57] Galerider Sliver
|
||||
2 [M14:172] Garruk, Caller of Beasts
|
||||
1 [M14:185] Megantic Sliver
|
||||
4 [M14:184] Manaweft Sliver
|
||||
4 [M14:9] Bonescythe Sliver
|
||||
3 [M13:229] Sunpetal Grove
|
||||
3 [RTR:101] Mizzium Mortars
|
||||
4 [AVR:226] Cavern of Souls
|
||||
4 [M14:228] Mutavault
|
|
@ -0,0 +1,20 @@
|
|||
NAME:Glenn Cariaga's Stronic Midrange
|
||||
2 [RTR:1] Angel of Serenity
|
||||
3 [RTR:155] Detention Sphere
|
||||
4 [M13:170] Farseek
|
||||
4 [RTR:248] Temple Garden
|
||||
3 [M13:193] Thragtusk
|
||||
3 [RTR:200] Sphinx's Revelation
|
||||
2 [RTR:201] Supreme Verdict
|
||||
1 [ISD:239] Gavony Township
|
||||
3 [ISD:213] Geist of Saint Traft
|
||||
4 [GTC:240] Breeding Pool
|
||||
4 [ISD:241] Hinterland Harbor
|
||||
3 [M13:22] Oblivion Ring
|
||||
3 [M14:224] Strionic Resonator
|
||||
1 [DGM:92] Progenitor Mimic
|
||||
4 [DGM:114] Voice of Resurgence
|
||||
4 [RTR:194] Selesnya Charm
|
||||
4 [M13:225] Glacial Fortress
|
||||
4 [M13:229] Sunpetal Grove
|
||||
4 [RTR:241] Hallowed Fountain
|
|
@ -0,0 +1,19 @@
|
|||
NAME:Hiroaki Ikeda's Fattie Merfolk
|
||||
2 [AVR:219] Otherworld Atlas
|
||||
3 [M13:170] Farseek
|
||||
3 [ISD:53] Dissipate
|
||||
2 [M14:60] Jace, Memory Adept
|
||||
4 [GTC:240] Breeding Pool
|
||||
4 [DGM:156] Simic Guildgate
|
||||
3 [M13:72] Talrand, Sky Summoner
|
||||
3 [M14:246] Forest
|
||||
4 [ISD:241] Hinterland Harbor
|
||||
3 [GTC:52] Spell Rupture
|
||||
3 [M13:59] Master of the Pearl Trident
|
||||
4 [M14:69] Scroll Thief
|
||||
3 [M14:73] Tidebinder Mage
|
||||
3 [GTC:195] Simic Charm
|
||||
9 [M14:234] Island
|
||||
3 [DGM:115] Vorel of the Hull Clade
|
||||
3 [M14:208] Door of Destinies
|
||||
1 [GTC:188] Prime Speaker Zegana
|
|
@ -0,0 +1,17 @@
|
|||
NAME:Ian Hancock's Expect the Unexpected
|
||||
4 [M13:160] Arbor Elf
|
||||
4 [ISD:248] Sulfur Falls
|
||||
4 [RTR:247] Steam Vents
|
||||
3 [RTR:130] Mana Bloom
|
||||
4 [GTC:147] Borborygmos Enraged
|
||||
4 [GTC:240] Breeding Pool
|
||||
4 [M14:169] Elvish Mystic
|
||||
4 [ISD:241] Hinterland Harbor
|
||||
4 [GTC:247] Stomping Ground
|
||||
3 [M13:55] Index
|
||||
4 [DGM:34] Possibility Storm
|
||||
2 [DGM:84] Melek, Izzet Paragon
|
||||
4 [GTC:203] Unexpected Results
|
||||
4 [DGM:55] Blast of Genius
|
||||
4 [M13:228] Rootbound Crag
|
||||
4 [RTR:140] Worldspine Wurm
|
|
@ -0,0 +1,26 @@
|
|||
NAME:Jake and Trevor's Breaking Rites
|
||||
2 [RTR:238] Blood Crypt
|
||||
3 [ISD:130] Blasphemous Act
|
||||
2 [ISD:238] Clifftop Retreat
|
||||
2 [M13:70] Stormtide Leviathan
|
||||
1 [AVR:106] Griselbrand
|
||||
2 [RTR:183] Niv-Mizzet, Dracogenius
|
||||
2 [M13:199] Nicol Bolas, Planeswalker
|
||||
2 [DGM:89] Obzedat's Aid
|
||||
4 [RTR:163] Goblin Electromancer
|
||||
3 [GTC:249] Watery Grave
|
||||
1 [RTR:241] Hallowed Fountain
|
||||
4 [DKA:87] Faithless Looting
|
||||
1 [AVR:209] Gisela, Blade of Goldnight
|
||||
3 [ISD:248] Sulfur Falls
|
||||
3 [RTR:247] Steam Vents
|
||||
3 [ISD:122] Unburial Rites
|
||||
1 [M13:63] Omniscience
|
||||
4 [ISD:83] Think Twice
|
||||
1 [GTC:245] Sacred Foundry
|
||||
1 [DGM:108] Teysa, Envoy of Ghosts
|
||||
4 [M13:222] Dragonskull Summit
|
||||
3 [DGM:124] Breaking // Entering
|
||||
3 [M13:223] Drowned Catacomb
|
||||
2 [M13:225] Glacial Fortress
|
||||
3 [RTR:172] Izzet Charm
|
|
@ -0,0 +1,15 @@
|
|||
NAME:Jonathan Reynolds's Mythic Rare Fatties
|
||||
4 [RTR:1] Angel of Serenity
|
||||
4 [M13:160] Arbor Elf
|
||||
4 [M13:174] Garruk, Primal Hunter
|
||||
4 [RTR:248] Temple Garden
|
||||
3 [M13:170] Farseek
|
||||
4 [M13:193] Thragtusk
|
||||
4 [ISD:239] Gavony Township
|
||||
4 [M14:169] Elvish Mystic
|
||||
10 [M14:246] Forest
|
||||
4 [M14:181] Kalonian Hydra
|
||||
4 [M14:5] Archangel of Thune
|
||||
4 [ISD:170] Avacyn's Pilgrim
|
||||
4 [M13:229] Sunpetal Grove
|
||||
3 [AVR:226] Cavern of Souls
|
|
@ -0,0 +1,24 @@
|
|||
NAME:Kyle Gascoigne's BUG Advantage
|
||||
4 [RTR:243] Overgrown Tomb
|
||||
3 [M13:170] Farseek
|
||||
3 [ISD:249] Woodland Cemetery
|
||||
4 [M13:193] Thragtusk
|
||||
4 [GTC:240] Breeding Pool
|
||||
3 [M13:88] Disciple of Bolas
|
||||
1 [M14:246] Forest
|
||||
3 [ISD:241] Hinterland Harbor
|
||||
3 [M14:96] Doom Blade
|
||||
3 [DGM:93] Putrefy
|
||||
2 [ISD:181] Garruk Relentless
|
||||
3 [GTC:44] Rapid Hybridization
|
||||
1 [M14:238] Swamp
|
||||
3 [DGM:72] Gaze of Granite
|
||||
1 [M14:190] Primeval Bounty
|
||||
3 [DKA:131] Vorapede
|
||||
3 [M13:223] Drowned Catacomb
|
||||
4 [DGM:127] Far // Away
|
||||
1 [DGM:92] Progenitor Mimic
|
||||
1 [M14:234] Island
|
||||
2 [DKA:134] Young Wolf
|
||||
1 [M13:159] Acidic Slime
|
||||
4 [GTC:249] Watery Grave
|
|
@ -0,0 +1,21 @@
|
|||
NAME:Perikoro's Beck and Stake
|
||||
2 [RTR:159] Epic Experiment
|
||||
2 [ISD:155] Past in Flames
|
||||
4 [RTR:247] Steam Vents
|
||||
3 [M14:242] Mountain
|
||||
3 [M13:139] Krenko's Command
|
||||
4 [ISD:55] Forbidden Alchemy
|
||||
4 [GTC:240] Breeding Pool
|
||||
1 [ISD:61] Laboratory Maniac
|
||||
2 [ISD:241] Hinterland Harbor
|
||||
4 [GTC:247] Stomping Ground
|
||||
2 [M14:64] Negate
|
||||
4 [ISD:148] Infernal Plunge
|
||||
4 [AVR:128] Battle Hymn
|
||||
3 [M14:171] Fog
|
||||
4 [DGM:123] Beck // Call
|
||||
3 [M14:234] Island
|
||||
4 [M14:163] Young Pyromancer
|
||||
1 [AVR:130] Burn at the Stake
|
||||
2 [DKA:104] Shattered Perception
|
||||
4 [DKA:87] Faithless Looting
|
|
@ -0,0 +1,18 @@
|
|||
NAME:Qoarl's Gutterstorm
|
||||
2 [DGM:151] Izzet Guildgate
|
||||
2 [DGM:12] Hidden Strings
|
||||
4 [ISD:248] Sulfur Falls
|
||||
4 [RTR:98] Guttersnipe
|
||||
4 [RTR:247] Steam Vents
|
||||
4 [DKA:52] Thought Scour
|
||||
4 [M14:242] Mountain
|
||||
1 [M13:72] Talrand, Sky Summoner
|
||||
4 [ISD:83] Think Twice
|
||||
4 [M14:68] Quicken
|
||||
1 [DGM:34] Possibility Storm
|
||||
6 [M14:234] Island
|
||||
4 [M14:163] Young Pyromancer
|
||||
4 [AVR:53] Fleeting Distraction
|
||||
4 [RTR:172] Izzet Charm
|
||||
4 [RTR:41] Inaction Injunction
|
||||
4 [DKA:87] Faithless Looting
|
|
@ -0,0 +1,20 @@
|
|||
NAME:Richard Yarmosh's Junk Accord
|
||||
3 [DKA:76] Tragic Slip
|
||||
4 [RTR:243] Overgrown Tomb
|
||||
4 [M13:170] Farseek
|
||||
2 [RTR:248] Temple Garden
|
||||
4 [ISD:249] Woodland Cemetery
|
||||
4 [M13:193] Thragtusk
|
||||
4 [GTC:242] Godless Shrine
|
||||
2 [ISD:239] Gavony Township
|
||||
4 [DKA:12] Lingering Souls
|
||||
4 [ISD:242] Isolated Chapel
|
||||
4 [DGM:57] Blood Baron of Vizkopa
|
||||
2 [DGM:93] Putrefy
|
||||
4 [M14:225] Trading Post
|
||||
4 [M14:3] Angelic Accord
|
||||
4 [M14:205] Bubbling Cauldron
|
||||
1 [DKA:158] Vault of the Archangel
|
||||
1 [M13:217] Staff of Nin
|
||||
3 [M13:229] Sunpetal Grove
|
||||
2 [RTR:141] Abrupt Decay
|
|
@ -0,0 +1,19 @@
|
|||
NAME:Tibalt Adson's Mono-Black
|
||||
2 [ISD:105] Liliana of the Veil
|
||||
1 [ISD:115] Sever the Bloodline
|
||||
4 [M13:112] Vampire Nighthawk
|
||||
4 [M13:110] Sign in Blood
|
||||
1 [ISD:94] Curse of Death's Hold
|
||||
2 [GTC:63] Devour Flesh
|
||||
3 [M13:102] Mutilate
|
||||
3 [M14:96] Doom Blade
|
||||
3 [M14:95] Diabolic Tutor
|
||||
23 [M14:238] Swamp
|
||||
1 [AVR:94] Demonic Rising
|
||||
3 [M14:97] Duress
|
||||
1 [M14:212] Haunted Plate Mail
|
||||
2 [M14:91] Corrupt
|
||||
1 [M14:215] Ratchet Bomb
|
||||
2 [M14:101] Lifebane Zombie
|
||||
1 [M14:102] Liliana of the Dark Realms
|
||||
3 [M14:228] Mutavault
|
|
@ -0,0 +1,17 @@
|
|||
NAME:Tyler Laing's FIRE IN THE HOLE!
|
||||
4 [RTR:213] Deathrite Shaman
|
||||
4 [ISD:144] Geistflame
|
||||
4 [M13:147] Searing Spear
|
||||
4 [RTR:98] Guttersnipe
|
||||
4 [M14:155] Shock
|
||||
4 [RTR:238] Blood Crypt
|
||||
4 [GTC:148] Boros Charm
|
||||
6 [M14:242] Mountain
|
||||
3 [ISD:238] Clifftop Retreat
|
||||
1 [ISD:92] Bump in the Night
|
||||
3 [DKA:12] Lingering Souls
|
||||
4 [GTC:245] Sacred Foundry
|
||||
3 [M13:222] Dragonskull Summit
|
||||
4 [M14:163] Young Pyromancer
|
||||
4 [M14:161] Wild Guess
|
||||
4 [AVR:149] Pillar of Flame
|
|
@ -0,0 +1,22 @@
|
|||
NAME:Vincent's The Bigger the Gravestone, the Higher the Rank
|
||||
4 [DKA:8] Gather the Townsfolk
|
||||
3 [DKA:76] Tragic Slip
|
||||
3 [ISD:117] Skirsdag High Priest
|
||||
4 [M14:123] Xathrid Necromancer
|
||||
2 [ISD:130] Blasphemous Act
|
||||
3 [RTR:238] Blood Crypt
|
||||
4 [GTC:242] Godless Shrine
|
||||
2 [M14:230] Plains
|
||||
1 [M14:242] Mountain
|
||||
4 [GTC:150] Cartel Aristocrat
|
||||
2 [ISD:238] Clifftop Retreat
|
||||
4 [ISD:242] Isolated Chapel
|
||||
3 [GTC:245] Sacred Foundry
|
||||
4 [ISD:6] Champion of the Parish
|
||||
1 [M13:222] Dragonskull Summit
|
||||
1 [GTC:182] Obzedat, Ghost Council
|
||||
2 [M14:238] Swamp
|
||||
3 [DKA:138] Falkenrath Aristocrat
|
||||
4 [ISD:11] Doomed Traveler
|
||||
2 [GTC:185] Orzhov Charm
|
||||
4 [AVR:86] Blood Artist
|
|
@ -0,0 +1,70 @@
|
|||
NAME:Geoff's Daxos of Meletis
|
||||
1 [MBS:104] Darksteel Plate
|
||||
1 [M12:24] Lifelink
|
||||
1 [JUD:31] Unquestioned Authority
|
||||
1 [MRD:144] Banshee's Blade
|
||||
1 [M13:29] Rhox Faithmender
|
||||
1 [ISD:53] Dissipate
|
||||
1 [RTR:9] Ethereal Armor
|
||||
1 [PC2:115] Whispersilk Cloak
|
||||
1 [PC2:112] Quietus Spike
|
||||
1 [M13:211] Ring of Evos Isle
|
||||
1 [M13:22] Oblivion Ring
|
||||
1 [M13:21] Knight of Glory
|
||||
1 [UDS:139] Thran Dynamo
|
||||
1 [M14:5] Archangel of Thune
|
||||
1 [M13:213] Ring of Thune
|
||||
1 [AVR:50] Elgaud Shieldmate
|
||||
1 [RTR:241] Hallowed Fountain
|
||||
1 [GTC:17] Holy Mantle
|
||||
1 [THS:39] Aqueous Form
|
||||
1 [M11:5] Armored Ascension
|
||||
1 [CMD:253] Lightning Greaves
|
||||
1 [ALA:27] Sigiled Paladin
|
||||
1 [M13:18] Guardians of Akrasa
|
||||
1 [ALA:26] Sighted-Caste Sorcerer
|
||||
1 [ISD:49] Curiosity
|
||||
1 [10E:40] Serra's Embrace
|
||||
19 [THS:230] Plains
|
||||
1 [GPT:28] Infiltrator's Magemark
|
||||
1 [DGM:96] Render Silent
|
||||
1 [M13:221] Cathedral of War
|
||||
1 [DKA:148] Executioner's Hood
|
||||
14 [THS:234] Island
|
||||
1 [M13:225] Glacial Fortress
|
||||
1 [7ED:67] Counterspell
|
||||
1 [PC2:10] Mammoth Umbra
|
||||
1 [ARB:3] Ethercaste Knight
|
||||
1 [ARB:1] Ardent Plea
|
||||
1 [MMA:25] Path to Exile
|
||||
1 [CON:2] Asha's Favor
|
||||
1 [M12:73] Ponder
|
||||
1 [DDL:27] Battle Mastery
|
||||
1 [M13:74] Tricks of the Trade
|
||||
1 [CMD:40] Brainstorm
|
||||
1 [DDL:24] Bonds of Faith
|
||||
1 [THS:25] Ordeal of Heliod
|
||||
1 [AVR:36] Silverblade Paladin
|
||||
1 [CMD:265] Azorius Chancery
|
||||
1 [PC2:12] Spirit Mantle
|
||||
1 [UDS:46] Sigil of Sleep
|
||||
1 [GTC:37] Hands of Binding
|
||||
1 [CMD:261] Sol Ring
|
||||
1 [5DN:131] Helm of Kaldra
|
||||
1 [THS:58] Ordeal of Thassa
|
||||
1 [M13:4] Angelic Benediction
|
||||
1 [ISD:229] Mask of Avacyn
|
||||
1 [M13:36] Sublime Archangel
|
||||
1 [M13:6] Aven Squire
|
||||
1 [SHM:150] Steel of the Godhead
|
||||
1 [CHK:65] Hinder
|
||||
1 [5ED:388] Mana Vault
|
||||
1 [M14:210] Fireshrieker
|
||||
1 [DIS:159] Azorius Signet
|
||||
1 [SOM:229] Seachrome Coast
|
||||
1 [THS:14] Gift of Immortality
|
||||
1 [M12:219] Swiftfoot Boots
|
||||
1 [ALA:1] Akrasan Squire
|
||||
1 [M14:23] Indestructibility
|
||||
1 [M13:206] Gilded Lotus
|
||||
SB: 1 [THS:191] Daxos of Meletis
|
BIN
Mage.Client/sounds/OnPlayerLeft.wav
Normal file
BIN
Mage.Client/sounds/OnPlayerLeft.wav
Normal file
Binary file not shown.
BIN
Mage.Client/sounds/OnPlayerLost.wav
Normal file
BIN
Mage.Client/sounds/OnPlayerLost.wav
Normal file
Binary file not shown.
BIN
Mage.Client/sounds/OnPlayerSubmittedDeck.wav
Normal file
BIN
Mage.Client/sounds/OnPlayerSubmittedDeck.wav
Normal file
Binary file not shown.
BIN
Mage.Client/sounds/OnPlayerWon.wav
Normal file
BIN
Mage.Client/sounds/OnPlayerWon.wav
Normal file
Binary file not shown.
|
@ -218,11 +218,6 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
|
|||
tablesPane = new TablesPane();
|
||||
desktopPane.add(tablesPane, javax.swing.JLayeredPane.DEFAULT_LAYER);
|
||||
tablesPane.setMaximum(true);
|
||||
|
||||
collectionViewerPane = new CollectionViewerPane();
|
||||
desktopPane.add(collectionViewerPane, javax.swing.JLayeredPane.DEFAULT_LAYER);
|
||||
collectionViewerPane.setMaximum(true);
|
||||
|
||||
} catch (PropertyVetoException ex) {
|
||||
logger.fatal(null, ex);
|
||||
}
|
||||
|
@ -972,8 +967,22 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
|
|||
}
|
||||
|
||||
public void showCollectionViewer() {
|
||||
this.collectionViewerPane.setVisible(true);
|
||||
setActive(collectionViewerPane);
|
||||
JInternalFrame[] windows = desktopPane.getAllFramesInLayer(JLayeredPane.DEFAULT_LAYER);
|
||||
for (JInternalFrame window : windows) {
|
||||
if (window instanceof CollectionViewerPane) {
|
||||
setActive((MagePane) window);
|
||||
return;
|
||||
}
|
||||
}
|
||||
try {
|
||||
collectionViewerPane = new CollectionViewerPane();
|
||||
desktopPane.add(collectionViewerPane, javax.swing.JLayeredPane.DEFAULT_LAYER);
|
||||
collectionViewerPane.setMaximum(true);
|
||||
this.collectionViewerPane.setVisible(true);
|
||||
setActive(collectionViewerPane);
|
||||
} catch (PropertyVetoException ex) {
|
||||
logger.fatal(null, ex);
|
||||
}
|
||||
}
|
||||
|
||||
static void renderSplashFrame(Graphics2D g) {
|
||||
|
|
|
@ -74,28 +74,39 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
|
|||
* Max amount of cards in card grid for which card images will be drawn.
|
||||
* Done so to solve issue with memory for big piles of cards.
|
||||
*/
|
||||
private static final int MAX_IMAGES = 250;
|
||||
public static final int MAX_IMAGES = 300;
|
||||
|
||||
public CardGrid() {
|
||||
initComponents();
|
||||
setOpaque(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadCards(CardsView showCards, SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId) {
|
||||
this.loadCards(showCards, sortBy, piles, bigCard, gameId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadCards(CardsView showCards, SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId, boolean merge) {
|
||||
boolean drawImage = showCards.size() < MAX_IMAGES;
|
||||
this.bigCard = bigCard;
|
||||
this.gameId = gameId;
|
||||
for (CardView card: showCards.values()) {
|
||||
if (!cards.containsKey(card.getId())) {
|
||||
addCard(card, bigCard, gameId, drawImage);
|
||||
if (merge) {
|
||||
for (CardView card: showCards.values()) {
|
||||
if (!cards.containsKey(card.getId())) {
|
||||
addCard(card, bigCard, gameId, drawImage);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Iterator<Entry<UUID, MageCard>> i = cards.entrySet().iterator(); i.hasNext();) {
|
||||
Entry<UUID, MageCard> entry = i.next();
|
||||
if (!showCards.containsKey(entry.getKey())) {
|
||||
removeCardImg(entry.getKey());
|
||||
i.remove();
|
||||
for (Iterator<Entry<UUID, MageCard>> i = cards.entrySet().iterator(); i.hasNext();) {
|
||||
Entry<UUID, MageCard> entry = i.next();
|
||||
if (!showCards.containsKey(entry.getKey())) {
|
||||
removeCardImg(entry.getKey());
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.clear();
|
||||
for (CardView card: showCards.values()) {
|
||||
addCard(card, bigCard, gameId, drawImage);
|
||||
}
|
||||
}
|
||||
System.gc();
|
||||
|
@ -144,8 +155,9 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
|
|||
MageCard lastCard = null;
|
||||
for (MageCard cardImg: sortedCards) {
|
||||
if (piles) {
|
||||
if (lastCard == null)
|
||||
if (lastCard == null) {
|
||||
lastCard = cardImg;
|
||||
}
|
||||
switch (sortBy) {
|
||||
case NAME:
|
||||
if (!cardImg.getOriginal().getName().equals(lastCard.getOriginal().getName())) {
|
||||
|
@ -203,6 +215,19 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
|
|||
repaint();
|
||||
}
|
||||
|
||||
private void clear() {
|
||||
this.cards.clear();
|
||||
removeAllCardImg();
|
||||
}
|
||||
|
||||
private void removeAllCardImg() {
|
||||
for (Component comp: getComponents()) {
|
||||
if (comp instanceof Card || comp instanceof MageCard) {
|
||||
remove(comp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void removeCardImg(UUID cardId) {
|
||||
for (Component comp: getComponents()) {
|
||||
if (comp instanceof Card) {
|
||||
|
@ -307,6 +332,11 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
|
|||
revalidate();
|
||||
repaint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int cardsSize() {
|
||||
return cards.size();
|
||||
}
|
||||
}
|
||||
|
||||
class CardNameComparator implements Comparator<MageCard> {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.1" encoding="UTF-8" ?>
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<Properties>
|
||||
|
@ -35,7 +35,7 @@
|
|||
<Group type="102" attributes="0">
|
||||
<Component id="jPanel1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane1" pref="305" max="32767" attributes="0"/>
|
||||
<Component id="jScrollPane1" pref="23" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
|
|
@ -163,6 +163,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
|
|||
return list;
|
||||
}
|
||||
|
||||
|
||||
public void loadCards(CardsView showCards, BigCard bigCard, UUID gameId) {
|
||||
this.cards = showCards;
|
||||
this.bigCard = bigCard;
|
||||
|
@ -317,6 +318,11 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
|
|||
|
||||
@Override
|
||||
public void loadCards(CardsView showCards, SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId) {
|
||||
this.loadCards(showCards, sortBy, piles, bigCard, gameId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadCards(CardsView showCards, SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId, boolean merge) {
|
||||
cards = showCards;
|
||||
this.bigCard = bigCard;
|
||||
this.gameId = gameId;
|
||||
|
@ -534,4 +540,9 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
|
|||
public void setDisplayNoCopies(boolean value) {
|
||||
mainModel.setDisplayNoCopies(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int cardsSize() {
|
||||
return cards.size();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,5 +46,7 @@ public interface ICardGrid {
|
|||
void addCardEventListener(Listener<Event> listener);
|
||||
void drawCards(Constants.SortBy sortBy, boolean piles);
|
||||
void loadCards(CardsView showCards, Constants.SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId);
|
||||
void loadCards(CardsView showCards, Constants.SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId, boolean merge);
|
||||
void refresh();
|
||||
int cardsSize();
|
||||
}
|
||||
|
|
|
@ -101,6 +101,7 @@ public class Permanent extends Card {
|
|||
protected String getText(String cardType) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(super.getText(cardType));
|
||||
if (permanent.getOriginal() != null) {
|
||||
sb.append("\n----- Originally -------\n");
|
||||
sb.append(permanent.getOriginal().getName());
|
||||
if (permanent.getOriginal().getManaCost().size() > 0) {
|
||||
|
@ -125,6 +126,7 @@ public class Permanent extends Card {
|
|||
sb.append(permanent.getOriginal().getRarity().toString());
|
||||
}
|
||||
// sb.append("\n").append(card.getId());
|
||||
}
|
||||
return sb.toString();
|
||||
|
||||
}
|
||||
|
|
|
@ -45,6 +45,9 @@ import java.util.Map;
|
|||
import java.util.UUID;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.table.AbstractTableModel;
|
||||
import javax.swing.table.JTableHeader;
|
||||
import javax.swing.table.TableColumn;
|
||||
import javax.swing.table.TableColumnModel;
|
||||
import mage.client.MageFrame;
|
||||
import mage.remote.Session;
|
||||
import mage.view.ChatMessage.MessageColor;
|
||||
|
@ -102,6 +105,18 @@ public class ChatPanel extends javax.swing.JPanel {
|
|||
NONE, GAME, CHAT
|
||||
}
|
||||
|
||||
/**
|
||||
* Controls the output start messages as the chat panel is created
|
||||
*
|
||||
*/
|
||||
private ChatType chatType = ChatType.DEFAULT;
|
||||
|
||||
public enum ChatType {
|
||||
DEFAULT, GAME, TABLES, TOURNAMENT
|
||||
}
|
||||
|
||||
private boolean startMessageDone = false;
|
||||
|
||||
/**
|
||||
* Maps message colors to {@link Color}.
|
||||
*/
|
||||
|
@ -143,6 +158,23 @@ public class ChatPanel extends javax.swing.JPanel {
|
|||
}
|
||||
}
|
||||
|
||||
public ChatType getChatType() {
|
||||
return chatType;
|
||||
}
|
||||
|
||||
public void setChatType(ChatType chatType) {
|
||||
this.chatType = chatType;
|
||||
}
|
||||
|
||||
public boolean isStartMessageDone() {
|
||||
return startMessageDone;
|
||||
}
|
||||
|
||||
public void setStartMessageDone(boolean startMessageDone) {
|
||||
this.startMessageDone = startMessageDone;
|
||||
}
|
||||
|
||||
|
||||
public void connect(UUID chatId) {
|
||||
session = MageFrame.getSession();
|
||||
this.chatId = chatId;
|
||||
|
@ -192,6 +224,10 @@ public class ChatPanel extends javax.swing.JPanel {
|
|||
}
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return txtConversation.getText();
|
||||
}
|
||||
|
||||
public ChatPanel getConnectedChat() {
|
||||
return connectedChat;
|
||||
}
|
||||
|
@ -248,6 +284,11 @@ class TableModel extends AbstractTableModel {
|
|||
|
||||
public void loadData(List<String> players) {
|
||||
this.players = players;
|
||||
JTableHeader th = jTablePlayers.getTableHeader();
|
||||
TableColumnModel tcm = th.getColumnModel();
|
||||
TableColumn tc = tcm.getColumn(0);
|
||||
tc.setHeaderValue(new StringBuilder("Players").append(" (").append(this.players.size()).append(")").toString());
|
||||
th.repaint();
|
||||
this.fireTableDataChanged();
|
||||
}
|
||||
|
||||
|
@ -386,7 +427,7 @@ class TableModel extends AbstractTableModel {
|
|||
boolean update;
|
||||
int size = players.size();
|
||||
List<String> list = new ArrayList<String>(players);
|
||||
Collections.sort(list);
|
||||
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
|
||||
if (size != this.players.size()) {
|
||||
update = true;
|
||||
} else {
|
||||
|
|
|
@ -28,6 +28,7 @@ import mage.cards.repository.CardRepository;
|
|||
import mage.cards.repository.ExpansionInfo;
|
||||
import mage.cards.repository.ExpansionRepository;
|
||||
import mage.client.MageFrame;
|
||||
import mage.client.dialog.PreferencesDialog;
|
||||
import mage.client.util.gui.ColorsChooser;
|
||||
import mage.client.util.sets.ConstructedFormats;
|
||||
import mage.constants.CardType;
|
||||
|
@ -35,6 +36,7 @@ import mage.constants.ColoredManaSymbol;
|
|||
import mage.constants.Rarity;
|
||||
import mage.interfaces.rate.RateCallback;
|
||||
import mage.utils.DeckBuilder;
|
||||
import mage.view.TournamentTypeView;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -93,9 +95,13 @@ public class DeckGenerator {
|
|||
cbSets.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||
jPanel.add(text3);
|
||||
jPanel.add(cbSets);
|
||||
|
||||
p0.add(jPanel);
|
||||
|
||||
String prefSet = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_DECK_GENERATOR_SET, null);
|
||||
if (prefSet != null) {
|
||||
cbSets.setSelectedItem(prefSet);
|
||||
}
|
||||
|
||||
p0.add(Box.createVerticalStrut(5));
|
||||
JPanel jPanel2 = new JPanel();
|
||||
JLabel textDeckSize = new JLabel("Deck size:");
|
||||
|
@ -106,9 +112,13 @@ public class DeckGenerator {
|
|||
cbDeckSize.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||
jPanel2.add(textDeckSize);
|
||||
jPanel2.add(cbDeckSize);
|
||||
|
||||
p0.add(jPanel2);
|
||||
|
||||
String prefSize = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_DECK_GENERATOR_DECK_SIZE, "60");
|
||||
if (prefSet != null) {
|
||||
cbDeckSize.setSelectedItem(prefSize);
|
||||
}
|
||||
|
||||
final JButton btnGenerate = new JButton("Ok");
|
||||
btnGenerate.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
|
@ -135,6 +145,11 @@ public class DeckGenerator {
|
|||
dlg.dispose();
|
||||
|
||||
if (selectedColors != null) {
|
||||
// save values to prefs
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_DECK_GENERATOR_DECK_SIZE, cbDeckSize.getSelectedItem().toString());
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_DECK_GENERATOR_SET, cbSets.getSelectedItem().toString());
|
||||
|
||||
// build deck
|
||||
buildDeck();
|
||||
try {
|
||||
File tmp = File.createTempFile("tempDeck" + UUID.randomUUID().toString(), ".dck");
|
||||
|
|
|
@ -34,7 +34,23 @@
|
|||
|
||||
package mage.client.deckeditor;
|
||||
|
||||
import mage.constants.CardType;
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.ComponentListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import javax.swing.DefaultComboBoxModel;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.JTable;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.table.DefaultTableCellRenderer;
|
||||
import mage.MageObject;
|
||||
import mage.ObjectColor;
|
||||
import mage.cards.Card;
|
||||
|
@ -49,6 +65,7 @@ import mage.client.cards.ICardGrid;
|
|||
import mage.client.constants.Constants.SortBy;
|
||||
import mage.client.deckeditor.table.TableModel;
|
||||
import mage.client.util.sets.ConstructedFormats;
|
||||
import mage.constants.CardType;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.predicate.Predicate;
|
||||
import mage.filter.predicate.Predicates;
|
||||
|
@ -59,12 +76,6 @@ import mage.filter.predicate.other.CardTextPredicate;
|
|||
import mage.filter.predicate.other.ExpansionSetPredicate;
|
||||
import mage.view.CardsView;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.table.DefaultTableCellRenderer;
|
||||
import java.awt.Color;
|
||||
import java.awt.Cursor;
|
||||
import java.awt.event.*;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -92,7 +103,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
currentView = mainModel; // by default we use List View
|
||||
}
|
||||
|
||||
public void makeTransparent() {
|
||||
private void makeTransparent() {
|
||||
this.addComponentListener(this);
|
||||
setOpaque(false);
|
||||
cardGrid.setOpaque(false);
|
||||
|
@ -107,7 +118,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
tbTypes.setOpaque(true); // false = transparent
|
||||
}
|
||||
|
||||
public void initListViewComponents() {
|
||||
private void initListViewComponents() {
|
||||
mainTable = new JTable();
|
||||
|
||||
mainModel = new TableModel();
|
||||
|
@ -135,6 +146,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
chkPiles.setEnabled(false);
|
||||
|
||||
mainTable.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
if (e.getClickCount() == 2 && !e.isConsumed()) {
|
||||
e.consume();
|
||||
|
@ -178,70 +190,73 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
this.btnClear.setVisible(true);
|
||||
this.cbExpansionSet.setVisible(true);
|
||||
cbExpansionSet.setModel(new DefaultComboBoxModel(ConstructedFormats.getTypes()));
|
||||
// Action event on Expansion set triggers loadCards method
|
||||
cbExpansionSet.setSelectedIndex(0);
|
||||
|
||||
filterCards();
|
||||
}
|
||||
|
||||
private FilterCard buildFilter() {
|
||||
FilterCard filter = new FilterCard();
|
||||
ArrayList<Predicate<MageObject>> predicates = new ArrayList<Predicate<MageObject>>();
|
||||
|
||||
if (this.rdoGreen.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.GREEN));
|
||||
}
|
||||
if (this.rdoRed.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.RED));
|
||||
}
|
||||
if (this.rdoBlack.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.BLACK));
|
||||
}
|
||||
if (this.rdoBlue.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.BLUE));
|
||||
}
|
||||
if (this.rdoWhite.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.WHITE));
|
||||
}
|
||||
if (this.rdoColorless.isSelected()) {
|
||||
predicates.add(new ColorlessPredicate());
|
||||
}
|
||||
filter.add(Predicates.or(predicates));
|
||||
|
||||
predicates.clear();
|
||||
if (this.rdoLand.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.LAND));
|
||||
}
|
||||
if (this.rdoArtifacts.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.ARTIFACT));
|
||||
}
|
||||
if (this.rdoCreatures.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.CREATURE));
|
||||
}
|
||||
if (this.rdoEnchantments.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.ENCHANTMENT));
|
||||
}
|
||||
if (this.rdoInstants.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.INSTANT));
|
||||
}
|
||||
if (this.rdoSorceries.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.SORCERY));
|
||||
}
|
||||
if (this.rdoPlaneswalkers.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.PLANESWALKER));
|
||||
}
|
||||
filter.add(Predicates.or(predicates));
|
||||
|
||||
String name = jTextFieldSearch.getText().trim();
|
||||
filter.add(new CardTextPredicate(name));
|
||||
|
||||
if (this.cbExpansionSet.isVisible()) {
|
||||
String expansionSelection = this.cbExpansionSet.getSelectedItem().toString();
|
||||
if (!expansionSelection.equals("- All Sets")) {
|
||||
ArrayList<Predicate<Card>> expansionPredicates = new ArrayList<Predicate<Card>>();
|
||||
for (String setCode : ConstructedFormats.getSetsByFormat(expansionSelection)) {
|
||||
expansionPredicates.add(new ExpansionSetPredicate(setCode));
|
||||
if (limited) {
|
||||
ArrayList<Predicate<MageObject>> predicates = new ArrayList<Predicate<MageObject>>();
|
||||
|
||||
if (this.rdoGreen.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.GREEN));
|
||||
}
|
||||
if (this.rdoRed.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.RED));
|
||||
}
|
||||
if (this.rdoBlack.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.BLACK));
|
||||
}
|
||||
if (this.rdoBlue.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.BLUE));
|
||||
}
|
||||
if (this.rdoWhite.isSelected()) {
|
||||
predicates.add(new ColorPredicate(ObjectColor.WHITE));
|
||||
}
|
||||
if (this.rdoColorless.isSelected()) {
|
||||
predicates.add(new ColorlessPredicate());
|
||||
}
|
||||
filter.add(Predicates.or(predicates));
|
||||
|
||||
predicates.clear();
|
||||
if (this.rdoLand.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.LAND));
|
||||
}
|
||||
if (this.rdoArtifacts.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.ARTIFACT));
|
||||
}
|
||||
if (this.rdoCreatures.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.CREATURE));
|
||||
}
|
||||
if (this.rdoEnchantments.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.ENCHANTMENT));
|
||||
}
|
||||
if (this.rdoInstants.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.INSTANT));
|
||||
}
|
||||
if (this.rdoSorceries.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.SORCERY));
|
||||
}
|
||||
if (this.rdoPlaneswalkers.isSelected()) {
|
||||
predicates.add(new CardTypePredicate(CardType.PLANESWALKER));
|
||||
}
|
||||
filter.add(Predicates.or(predicates));
|
||||
|
||||
|
||||
if (this.cbExpansionSet.isVisible()) {
|
||||
String expansionSelection = this.cbExpansionSet.getSelectedItem().toString();
|
||||
if (!expansionSelection.equals("- All Sets")) {
|
||||
ArrayList<Predicate<Card>> expansionPredicates = new ArrayList<Predicate<Card>>();
|
||||
for (String setCode : ConstructedFormats.getSetsByFormat(expansionSelection)) {
|
||||
expansionPredicates.add(new ExpansionSetPredicate(setCode));
|
||||
}
|
||||
filter.add(Predicates.or(expansionPredicates));
|
||||
}
|
||||
filter.add(Predicates.or(expansionPredicates));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -279,11 +294,6 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
criteria.types(CardType.PLANESWALKER);
|
||||
}
|
||||
|
||||
String text = jTextFieldSearch.getText().trim();
|
||||
if (!text.isEmpty()) {
|
||||
// criteria.rules(text);
|
||||
}
|
||||
|
||||
if (this.cbExpansionSet.isVisible()) {
|
||||
String expansionSelection = this.cbExpansionSet.getSelectedItem().toString();
|
||||
if (!expansionSelection.equals("- All Sets")) {
|
||||
|
@ -314,9 +324,12 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
if (filter.match(card, null)) {
|
||||
filteredCards.add(card);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.currentView.loadCards(new CardsView(filteredCards), (SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected(), bigCard, null);
|
||||
if (currentView instanceof CardGrid && filteredCards.size() > CardGrid.MAX_IMAGES) {
|
||||
this.toggleViewMode();
|
||||
}
|
||||
this.currentView.loadCards(new CardsView(filteredCards), (SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected(), bigCard, null, false);
|
||||
this.cardCount.setText(String.valueOf(filteredCards.size()));
|
||||
}
|
||||
finally {
|
||||
|
@ -328,10 +341,6 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
this.cardCount.setText(String.valueOf(value));
|
||||
}
|
||||
|
||||
public ICardGrid getCardsList() {
|
||||
return this.currentView;
|
||||
}
|
||||
|
||||
public List<ICardGrid> getCardGridComponents() {
|
||||
List<ICardGrid> components = new ArrayList<ICardGrid>();
|
||||
components.add(mainModel);
|
||||
|
@ -807,13 +816,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
}//GEN-LAST:event_rdoPlaneswalkersActionPerformed
|
||||
|
||||
private void cbExpansionSetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbExpansionSetActionPerformed
|
||||
if (this.cbExpansionSet.getSelectedItem().equals("-- Standard")) {
|
||||
filterCards();
|
||||
} else {
|
||||
// auto switch for ListView for "All sets" (too many cards to load)
|
||||
jToggleListView.doClick();
|
||||
jToggleListView.setSelected(true);
|
||||
}
|
||||
filterCards();
|
||||
}//GEN-LAST:event_cbExpansionSetActionPerformed
|
||||
|
||||
private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnClearActionPerformed
|
||||
|
@ -841,35 +844,39 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
}//GEN-LAST:event_btnBoosterActionPerformed
|
||||
|
||||
private void cbSortByActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbSortByActionPerformed
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy)
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy) {
|
||||
this.currentView.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected());
|
||||
}
|
||||
}//GEN-LAST:event_cbSortByActionPerformed
|
||||
|
||||
private void chkPilesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkPilesActionPerformed
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy)
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy) {
|
||||
this.currentView.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected());
|
||||
}
|
||||
}//GEN-LAST:event_chkPilesActionPerformed
|
||||
|
||||
private void jToggleListViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleListViewActionPerformed
|
||||
jToggleCardView.setSelected(false);
|
||||
currentView = mainModel;
|
||||
jScrollPane1.setViewportView(mainTable);
|
||||
cbSortBy.setEnabled(false);
|
||||
chkPiles.setEnabled(false);
|
||||
jButtonAddToMain.setEnabled(true);
|
||||
jButtonAddToSideboard.setEnabled(true);
|
||||
if (!(currentView instanceof TableModel)) {
|
||||
toggleViewMode();
|
||||
} else {
|
||||
jToggleListView.setSelected(true);
|
||||
}
|
||||
filterCards();
|
||||
}//GEN-LAST:event_jToggleListViewActionPerformed
|
||||
|
||||
private void jToggleCardViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleCardViewActionPerformed
|
||||
jToggleListView.setSelected(false);
|
||||
currentView = cardGrid;
|
||||
jScrollPane1.setViewportView(cardGrid);
|
||||
cbSortBy.setEnabled(true);
|
||||
chkPiles.setEnabled(true);
|
||||
jButtonAddToMain.setEnabled(false);
|
||||
jButtonAddToSideboard.setEnabled(false);
|
||||
filterCards();
|
||||
if (currentView.cardsSize() > CardGrid.MAX_IMAGES) {
|
||||
jToggleCardView.setSelected(false);
|
||||
JOptionPane.showMessageDialog(this, new StringBuilder("The card view can't be used for more than ").append(CardGrid.MAX_IMAGES).append(" cards.").toString());
|
||||
|
||||
} else {
|
||||
if (!(currentView instanceof CardGrid)) {
|
||||
toggleViewMode();
|
||||
} else {
|
||||
jToggleCardView.setSelected(true);
|
||||
}
|
||||
filterCards();
|
||||
}
|
||||
}//GEN-LAST:event_jToggleCardViewActionPerformed
|
||||
|
||||
private void jButtonAddToMainActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAddToMainActionPerformed
|
||||
|
@ -881,8 +888,9 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
mainModel.doubleClick(index);
|
||||
}
|
||||
//if (!mode.equals(Constants.DeckEditorMode.Constructed))
|
||||
if (limited)
|
||||
if (limited) {
|
||||
mainModel.fireTableDataChanged();
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_jButtonAddToMainActionPerformed
|
||||
|
||||
|
@ -895,8 +903,9 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
mainModel.shiftDoubleClick(index);
|
||||
}
|
||||
//if (!mode.equals(Constants.DeckEditorMode.Constructed))
|
||||
if (limited)
|
||||
if (limited) {
|
||||
mainModel.fireTableDataChanged();
|
||||
}
|
||||
}
|
||||
}//GEN-LAST:event_jButtonAddToSideboardActionPerformed
|
||||
|
||||
|
@ -918,9 +927,33 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
filterCards();
|
||||
}//GEN-LAST:event_jButtonCleanActionPerformed
|
||||
|
||||
private void toggleViewMode() {
|
||||
if (currentView instanceof CardGrid) {
|
||||
jToggleListView.setSelected(true);
|
||||
jToggleCardView.setSelected(false);
|
||||
currentView = mainModel;
|
||||
jScrollPane1.setViewportView(mainTable);
|
||||
cbSortBy.setEnabled(false);
|
||||
chkPiles.setEnabled(false);
|
||||
jButtonAddToMain.setEnabled(true);
|
||||
jButtonAddToSideboard.setEnabled(true);
|
||||
} else {
|
||||
jToggleCardView.setSelected(true);
|
||||
jToggleListView.setSelected(false);
|
||||
currentView = cardGrid;
|
||||
jScrollPane1.setViewportView(cardGrid);
|
||||
cbSortBy.setEnabled(true);
|
||||
chkPiles.setEnabled(true);
|
||||
jButtonAddToMain.setEnabled(false);
|
||||
jButtonAddToSideboard.setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Integer> asList(final int[] is) {
|
||||
List<Integer> list = new ArrayList<Integer>();
|
||||
for (int i : is) list.add(i);
|
||||
for (int i : is) {
|
||||
list.add(i);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
|
@ -978,26 +1011,30 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
|
|||
|
||||
@Override
|
||||
public void componentResized(ComponentEvent e) {
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy)
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy) {
|
||||
this.currentView.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentMoved(ComponentEvent e) {
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy)
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy) {
|
||||
this.currentView.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentShown(ComponentEvent e) {
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy)
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy) {
|
||||
this.currentView.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentHidden(ComponentEvent e) {
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy)
|
||||
if (cbSortBy.getSelectedItem() instanceof SortBy) {
|
||||
this.currentView.drawCards((SortBy) cbSortBy.getSelectedItem(), chkPiles.isSelected());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -34,16 +34,16 @@
|
|||
|
||||
package mage.client.deckeditor;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import javax.swing.JComponent;
|
||||
import mage.cards.decks.Deck;
|
||||
import mage.client.MagePane;
|
||||
import mage.client.constants.Constants.DeckEditorMode;
|
||||
import mage.client.plugins.impl.Plugins;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -56,8 +56,8 @@ public class DeckEditorPane extends MagePane {
|
|||
|
||||
boolean initialized = false;
|
||||
if (Plugins.getInstance().isThemePluginLoaded()) {
|
||||
Map<String, JComponent> ui = new HashMap<String, JComponent>();
|
||||
JComponent container = Plugins.getInstance().updateTablePanel(ui);
|
||||
Map<String, JComponent> uiMap = new HashMap<String, JComponent>();
|
||||
JComponent container = Plugins.getInstance().updateTablePanel(uiMap);
|
||||
if (container != null) {
|
||||
deckEditorPanel1 = new mage.client.deckeditor.DeckEditorPanel();
|
||||
initComponents(container);
|
||||
|
@ -73,13 +73,16 @@ public class DeckEditorPane extends MagePane {
|
|||
}
|
||||
|
||||
public void show(DeckEditorMode mode, Deck deck, String name, UUID tableId, int time) {
|
||||
if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited)
|
||||
if (mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited) {
|
||||
this.setTitle("Deck Editor - " + tableId.toString());
|
||||
}
|
||||
else {
|
||||
if (deck != null)
|
||||
if (deck != null) {
|
||||
this.setTitle("Deck Editor - " + deck.getName());
|
||||
else
|
||||
}
|
||||
else {
|
||||
this.setTitle("Deck Editor");
|
||||
}
|
||||
}
|
||||
this.deckEditorPanel1.showDeckEditor(mode, deck, tableId, time);
|
||||
this.repaint();
|
||||
|
|
|
@ -104,8 +104,9 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
setTimeout(timeout);
|
||||
}
|
||||
else {
|
||||
if (updateDeckTask != null)
|
||||
if (updateDeckTask != null) {
|
||||
updateDeckTask.cancel(true);
|
||||
}
|
||||
setTimeout(0);
|
||||
countdown.stop();
|
||||
hideDeckEditor();
|
||||
|
@ -116,8 +117,9 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
}
|
||||
|
||||
public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId, int time) {
|
||||
if (deck != null)
|
||||
if (deck != null) {
|
||||
this.deck = deck;
|
||||
}
|
||||
this.tableId = tableId;
|
||||
this.mode = mode;
|
||||
this.btnAddLand.setVisible(false);
|
||||
|
@ -130,8 +132,9 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
this.cardSelector.loadSideboard(new ArrayList<Card>(deck.getSideboard()), this.bigCard);
|
||||
this.btnExit.setVisible(false);
|
||||
this.btnImport.setVisible(false);
|
||||
if (!MageFrame.getSession().isTestMode())
|
||||
if (!MageFrame.getSession().isTestMode()) {
|
||||
this.btnLoad.setVisible(false);
|
||||
}
|
||||
this.deckArea.showSideboard(false);
|
||||
countdown.stop();
|
||||
this.timeout = time;
|
||||
|
@ -150,8 +153,9 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
//this.cardTableSelector.loadCards(this.bigCard);
|
||||
this.btnExit.setVisible(true);
|
||||
this.btnImport.setVisible(true);
|
||||
if (!MageFrame.getSession().isTestMode())
|
||||
if (!MageFrame.getSession().isTestMode()) {
|
||||
this.btnLoad.setVisible(true);
|
||||
}
|
||||
this.deckArea.showSideboard(true);
|
||||
this.txtTimeRemaining.setVisible(false);
|
||||
break;
|
||||
|
@ -282,14 +286,16 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
}
|
||||
|
||||
public void hideDeckEditor() {
|
||||
if (updateDeckTask != null)
|
||||
if (updateDeckTask != null) {
|
||||
updateDeckTask.cancel(true);
|
||||
}
|
||||
Component c = this.getParent();
|
||||
while (c != null && !(c instanceof DeckEditorPane)) {
|
||||
c = c.getParent();
|
||||
}
|
||||
if (c != null)
|
||||
if (c != null) {
|
||||
((DeckEditorPane)c).hideFrame();
|
||||
}
|
||||
}
|
||||
|
||||
private BigCard getBigCard() {
|
||||
|
@ -517,8 +523,9 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
|
||||
private void btnLoadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnLoadActionPerformed
|
||||
String lastFolder = MageFrame.getPreferences().get("lastDeckFolder", "");
|
||||
if (!lastFolder.isEmpty())
|
||||
if (!lastFolder.isEmpty()) {
|
||||
fcSelectDeck.setCurrentDirectory(new File(lastFolder));
|
||||
}
|
||||
int ret = fcSelectDeck.showOpenDialog(this);
|
||||
if (ret == JFileChooser.APPROVE_OPTION) {
|
||||
File file = fcSelectDeck.getSelectedFile();
|
||||
|
@ -543,16 +550,18 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
|
||||
private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSaveActionPerformed
|
||||
String lastFolder = MageFrame.getPreferences().get("lastDeckFolder", "");
|
||||
if (!lastFolder.isEmpty())
|
||||
if (!lastFolder.isEmpty()) {
|
||||
fcSelectDeck.setCurrentDirectory(new File(lastFolder));
|
||||
}
|
||||
deck.setName(this.txtDeckName.getText());
|
||||
int ret = fcSelectDeck.showSaveDialog(this);
|
||||
if (ret == JFileChooser.APPROVE_OPTION) {
|
||||
File file = fcSelectDeck.getSelectedFile();
|
||||
try {
|
||||
String fileName = file.getPath();
|
||||
if (!fileName.endsWith(".dck"))
|
||||
if (!fileName.endsWith(".dck")) {
|
||||
fileName += ".dck";
|
||||
}
|
||||
setCursor(new Cursor(Cursor.WAIT_CURSOR));
|
||||
Sets.saveDeck(fileName, deck.getDeckCardLists());
|
||||
} catch (Exception ex) {
|
||||
|
@ -587,8 +596,9 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
|
||||
private void btnImportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnImportActionPerformed
|
||||
String lastFolder = MageFrame.getPreferences().get("lastImportFolder", "");
|
||||
if (!lastFolder.isEmpty())
|
||||
if (!lastFolder.isEmpty()) {
|
||||
fcImportDeck.setCurrentDirectory(new File(lastFolder));
|
||||
}
|
||||
int ret = fcImportDeck.showOpenDialog(this);
|
||||
if (ret == JFileChooser.APPROVE_OPTION) {
|
||||
File file = fcImportDeck.getSelectedFile();
|
||||
|
@ -613,19 +623,22 @@ public class DeckEditorPanel extends javax.swing.JPanel {
|
|||
}
|
||||
refreshDeck();
|
||||
try {
|
||||
if (file != null)
|
||||
if (file != null) {
|
||||
MageFrame.getPreferences().put("lastImportFolder", file.getCanonicalPath());
|
||||
}
|
||||
} catch (IOException ex) { }
|
||||
}
|
||||
fcImportDeck.setSelectedFile(null);
|
||||
}//GEN-LAST:event_btnImportActionPerformed
|
||||
|
||||
private void btnSubmitActionPerformed(java.awt.event.ActionEvent evt) {
|
||||
if (updateDeckTask != null)
|
||||
if (updateDeckTask != null) {
|
||||
updateDeckTask.cancel(true);
|
||||
}
|
||||
|
||||
if (MageFrame.getSession().submitDeck(tableId, deck.getDeckCardLists()))
|
||||
if (MageFrame.getSession().submitDeck(tableId, deck.getDeckCardLists())) {
|
||||
hideDeckEditor();
|
||||
}
|
||||
}
|
||||
|
||||
private void btnAddLandActionPerformed(java.awt.event.ActionEvent evt) {
|
||||
|
@ -659,8 +672,9 @@ class DeckFilter extends FileFilter {
|
|||
|
||||
@Override
|
||||
public boolean accept(File f) {
|
||||
if (f.isDirectory())
|
||||
if (f.isDirectory()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String ext = null;
|
||||
String s = f.getName();
|
||||
|
@ -682,8 +696,9 @@ class ImportFilter extends FileFilter {
|
|||
|
||||
@Override
|
||||
public boolean accept(File f) {
|
||||
if (f.isDirectory())
|
||||
if (f.isDirectory()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String ext = null;
|
||||
String s = f.getName();
|
||||
|
@ -693,8 +708,9 @@ class ImportFilter extends FileFilter {
|
|||
ext = s.substring(i+1).toLowerCase();
|
||||
}
|
||||
if (ext != null) {
|
||||
if (ext.toLowerCase().equals("dec") || ext.toLowerCase().equals("mwdeck") || ext.toLowerCase().equals("txt"))
|
||||
if (ext.toLowerCase().equals("dec") || ext.toLowerCase().equals("mwdeck") || ext.toLowerCase().equals("txt")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -268,6 +268,7 @@ public class MageBook extends JComponent {
|
|||
private List<CardInfo> getCards(int page, String set) {
|
||||
CardCriteria criteria = new CardCriteria();
|
||||
criteria.setCodes(set).start((long) page * conf.CARDS_PER_PAGE).count((long) conf.CARDS_PER_PAGE + 1);
|
||||
criteria.setOrderBy("cardNumber");
|
||||
List<CardInfo> cards = CardRepository.instance.findCards(criteria);
|
||||
if (cards.size() > conf.CARDS_PER_PAGE) {
|
||||
pageRight.setVisible(true);
|
||||
|
|
|
@ -84,69 +84,84 @@ public class TableModel extends AbstractTableModel implements ICardGrid {
|
|||
|
||||
@Override
|
||||
public void loadCards(CardsView showCards, SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId) {
|
||||
this.loadCards(showCards, sortBy, piles, bigCard, gameId, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadCards(CardsView showCards, SortBy sortBy, boolean piles, BigCard bigCard, UUID gameId, boolean merge) {
|
||||
this.bigCard = bigCard;
|
||||
this.gameId = gameId;
|
||||
int landCount = 0;
|
||||
int creatureCount = 0;
|
||||
for (CardView card : showCards.values()) {
|
||||
if (!cards.containsKey(card.getId())) {
|
||||
if (!merge) {
|
||||
this.clear();
|
||||
for (CardView card : showCards.values()) {
|
||||
addCard(card, bigCard, gameId);
|
||||
}
|
||||
if (updateCountsCallback != null) {
|
||||
if (card.getCardTypes().contains(CardType.LAND))
|
||||
landCount++;
|
||||
if (card.getCardTypes().contains(CardType.CREATURE))
|
||||
creatureCount++;
|
||||
} else {
|
||||
for (CardView card : showCards.values()) {
|
||||
if (!cards.containsKey(card.getId())) {
|
||||
addCard(card, bigCard, gameId);
|
||||
}
|
||||
if (updateCountsCallback != null) {
|
||||
if (card.getCardTypes().contains(CardType.LAND)) {
|
||||
landCount++;
|
||||
}
|
||||
if (card.getCardTypes().contains(CardType.CREATURE)) {
|
||||
creatureCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// not easy logic for merge :)
|
||||
for (Iterator<Entry<UUID, CardView>> i = cards.entrySet().iterator(); i.hasNext();) {
|
||||
Entry<UUID, CardView> entry = i.next();
|
||||
if (!showCards.containsKey(entry.getKey())) {
|
||||
i.remove();
|
||||
if (displayNoCopies) {
|
||||
String key = entry.getValue().getName() + entry.getValue().getExpansionSetCode() + entry.getValue().getCardNumber();
|
||||
if (cardsNoCopies.containsKey(key)) {
|
||||
Integer count = cardsNoCopies.get(key);
|
||||
count--;
|
||||
if (count > 0) {
|
||||
cardsNoCopies.put(key, count);
|
||||
} else {
|
||||
cardsNoCopies.remove(key);
|
||||
}
|
||||
for (int j = 0; j < view.size(); j++) {
|
||||
CardView cv = view.get(j);
|
||||
if (cv.getId().equals(entry.getValue().getId())) {
|
||||
if (count > 0) {
|
||||
// replace by another card with the same name+setCode
|
||||
String key1 = cv.getName()+cv.getExpansionSetCode()+cv.getCardNumber();
|
||||
for (CardView cardView : cards.values()) {
|
||||
String key2 = cardView.getName()+cardView.getExpansionSetCode()+cardView.getCardNumber();
|
||||
if ((key1).equals(key2)) {
|
||||
view.set(j, cardView);
|
||||
break;
|
||||
|
||||
// no easy logic for merge :)
|
||||
for (Iterator<Entry<UUID, CardView>> i = cards.entrySet().iterator(); i.hasNext();) {
|
||||
Entry<UUID, CardView> entry = i.next();
|
||||
if (!showCards.containsKey(entry.getKey())) {
|
||||
i.remove();
|
||||
if (displayNoCopies) {
|
||||
String key = entry.getValue().getName() + entry.getValue().getExpansionSetCode() + entry.getValue().getCardNumber();
|
||||
if (cardsNoCopies.containsKey(key)) {
|
||||
Integer count = cardsNoCopies.get(key);
|
||||
count--;
|
||||
if (count > 0) {
|
||||
cardsNoCopies.put(key, count);
|
||||
} else {
|
||||
cardsNoCopies.remove(key);
|
||||
}
|
||||
for (int j = 0; j < view.size(); j++) {
|
||||
CardView cv = view.get(j);
|
||||
if (cv.getId().equals(entry.getValue().getId())) {
|
||||
if (count > 0) {
|
||||
// replace by another card with the same name+setCode
|
||||
String key1 = cv.getName()+cv.getExpansionSetCode()+cv.getCardNumber();
|
||||
for (CardView cardView : cards.values()) {
|
||||
String key2 = cardView.getName()+cardView.getExpansionSetCode()+cardView.getCardNumber();
|
||||
if ((key1).equals(key2)) {
|
||||
view.set(j, cardView);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
view.remove(j);
|
||||
}
|
||||
} else {
|
||||
view.remove(j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (CardView cv : view) {
|
||||
if (cv.getId().equals(entry.getKey())) {
|
||||
view.remove(cv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (CardView cv : view) {
|
||||
if (cv.getId().equals(entry.getKey())) {
|
||||
view.remove(cv);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (updateCountsCallback != null) {
|
||||
updateCountsCallback.update(cards.size(), creatureCount, landCount);
|
||||
if (updateCountsCallback != null) {
|
||||
updateCountsCallback.update(cards.size(), creatureCount, landCount);
|
||||
}
|
||||
}
|
||||
|
||||
sort(1, true);
|
||||
|
@ -384,4 +399,9 @@ public class TableModel extends AbstractTableModel implements ICardGrid {
|
|||
public void setUpdateCountsCallback(UpdateCountsCallback callback) {
|
||||
this.updateCountsCallback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int cardsSize() {
|
||||
return cards.size();
|
||||
}
|
||||
}
|
|
@ -56,7 +56,7 @@
|
|||
<Component id="tabPane" min="-2" pref="277" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="btnOk" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="25" max="32767" attributes="0"/>
|
||||
<EmptySpace min="0" pref="37" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -155,27 +155,18 @@
|
|||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="lblPlayerInfo" min="-2" pref="90" max="-2" attributes="0"/>
|
||||
<Component id="lblDurationMatch" alignment="0" min="-2" pref="101" max="-2" attributes="0"/>
|
||||
<Component id="lblMatchScore" alignment="0" min="-2" pref="86" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="lblDurationGame" min="-2" pref="101" max="-2" attributes="0"/>
|
||||
<Component id="lblLife" alignment="0" min="-2" pref="71" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Component id="lblPlayerInfo" min="-2" pref="90" max="-2" attributes="0"/>
|
||||
<Component id="lblDurationMatch" alignment="0" min="-2" pref="101" max="-2" attributes="0"/>
|
||||
<Component id="lblMatchScore" alignment="0" min="-2" pref="86" max="-2" attributes="0"/>
|
||||
<Component id="lblDurationGame" min="-2" pref="101" max="-2" attributes="0"/>
|
||||
<Component id="lblLife" alignment="0" min="-2" pref="71" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="txtPlayerInfo" max="32767" attributes="0"/>
|
||||
<Component id="txtDurationGame" alignment="1" pref="489" max="32767" attributes="0"/>
|
||||
<Component id="txtDurationGame" alignment="1" pref="494" max="32767" attributes="0"/>
|
||||
<Component id="txtLife" alignment="1" pref="489" max="32767" attributes="0"/>
|
||||
<Component id="txtDurationMatch" alignment="1" pref="489" max="32767" attributes="0"/>
|
||||
<Component id="txtMatchScore" alignment="1" pref="489" max="32767" attributes="0"/>
|
||||
|
@ -211,7 +202,7 @@
|
|||
<Component id="lblPlayerInfo" alignment="3" min="-2" pref="24" max="-2" attributes="0"/>
|
||||
<Component id="txtPlayerInfo" alignment="3" min="-2" pref="24" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="99" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="105" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
|
|
@ -38,10 +38,16 @@ import java.awt.Color;
|
|||
import java.awt.Image;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.PrintWriter;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JOptionPane;
|
||||
import mage.client.MageFrame;
|
||||
import mage.client.game.GamePanel;
|
||||
import mage.client.util.AudioManager;
|
||||
import mage.client.util.Format;
|
||||
import mage.client.util.ImageHelper;
|
||||
|
@ -75,6 +81,12 @@ public class GameEndDialog extends MageDialog {
|
|||
|
||||
this.lblResultText.setText(gameEndView.getResultMessage());
|
||||
|
||||
String autoSave = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_LOG_AUTO_SAVE, "true");
|
||||
if (autoSave.equals("true")) {
|
||||
this.saveGameLog(gameEndView);
|
||||
}
|
||||
|
||||
|
||||
// game duration
|
||||
txtDurationGame.setText(Format.getDuration(gameEndView.getStartTime(), gameEndView.getEndTime()));
|
||||
txtDurationGame.setToolTipText(new StringBuilder(df.format(gameEndView.getStartTime())).append(" - ").append(df.format(gameEndView.getEndTime())).toString() );
|
||||
|
@ -91,9 +103,9 @@ public class GameEndDialog extends MageDialog {
|
|||
this.txtLife.setText(sb.toString());
|
||||
|
||||
if (gameEndView.hasWon()) {
|
||||
AudioManager.playPlayerJoinedTable();
|
||||
AudioManager.playPlayerWon();
|
||||
} else {
|
||||
AudioManager.playButtonCancel();
|
||||
AudioManager.playPlayerLost();
|
||||
}
|
||||
|
||||
txtMatchScore.setText(gameEndView.getMatchView().getResult());
|
||||
|
@ -112,6 +124,32 @@ public class GameEndDialog extends MageDialog {
|
|||
|
||||
}
|
||||
|
||||
private void saveGameLog(GameEndView gameEndView) {
|
||||
String dir = "gamelogs";
|
||||
File saveDir = new File(dir);
|
||||
//Here comes the existence check
|
||||
if(!saveDir.exists()) {
|
||||
saveDir.mkdirs();
|
||||
}
|
||||
// get game log
|
||||
try {
|
||||
GamePanel gamePanel = MageFrame.getGame(gameEndView.getMatchView().getGames().get(gameEndView.getMatchView().getGames().size()-1));
|
||||
SimpleDateFormat sdf = new SimpleDateFormat();
|
||||
sdf.applyPattern( "yyyyMMdd_HHmmss" );
|
||||
String fileName = new StringBuilder(dir).append(File.separator)
|
||||
.append(sdf.format(gameEndView.getStartTime()))
|
||||
.append("_").append(gameEndView.getMatchView().getGameType())
|
||||
.append("_").append(gameEndView.getMatchView().getGames().size())
|
||||
.append(".txt").toString();
|
||||
PrintWriter out = new PrintWriter(fileName);
|
||||
out.print(gamePanel.getGameLog());
|
||||
out.close();
|
||||
} catch (FileNotFoundException ex) {
|
||||
JOptionPane.showMessageDialog(this, "Error while writing game log to file\n\n" + ex, "Error writing gamelog", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void showDialog() {
|
||||
this.setLocation(100, 100);
|
||||
this.setVisible(true);
|
||||
|
|
|
@ -339,7 +339,7 @@ public class NewTableDialog extends MageDialog {
|
|||
for (TablePlayerPanel player: players) {
|
||||
if (!player.getPlayerType().equals("Human")) {
|
||||
if (!player.joinTable(roomId, table.getTableId())) {
|
||||
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error joining table.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
// error message must be send by the server
|
||||
session.removeTable(roomId, table.getTableId());
|
||||
table = null;
|
||||
return;
|
||||
|
@ -356,7 +356,7 @@ public class NewTableDialog extends MageDialog {
|
|||
} catch (ClassNotFoundException ex) {
|
||||
handleError(ex);
|
||||
}
|
||||
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error joining table.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
// JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error joining table.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
session.removeTable(roomId, table.getTableId());
|
||||
table = null;
|
||||
}//GEN-LAST:event_btnOKActionPerformed
|
||||
|
|
|
@ -113,7 +113,7 @@
|
|||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jLabel5" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pnlPacks" pref="67" max="32767" attributes="0"/>
|
||||
<Component id="pnlPacks" pref="69" max="32767" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="11" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
|
@ -124,7 +124,7 @@
|
|||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="spnNumPlayers" pref="23" max="32767" attributes="1"/>
|
||||
<Component id="spnNumPlayers" pref="25" max="32767" attributes="1"/>
|
||||
<Component id="pnlDraftOptions" max="32767" attributes="1"/>
|
||||
</Group>
|
||||
<EmptySpace min="-2" pref="14" max="-2" attributes="0"/>
|
||||
|
|
|
@ -37,12 +37,11 @@ package mage.client.dialog;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import javax.swing.ComboBoxModel;
|
||||
import javax.swing.DefaultComboBoxModel;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SpinnerNumberModel;
|
||||
import mage.cards.ExpansionSet;
|
||||
import mage.cards.Sets;
|
||||
import mage.cards.repository.ExpansionInfo;
|
||||
import mage.cards.repository.ExpansionRepository;
|
||||
import mage.client.MageFrame;
|
||||
|
@ -92,8 +91,10 @@ public class NewTournamentDialog extends MageDialog {
|
|||
cbTimeLimit.setModel(new DefaultComboBoxModel(MatchTimeLimit.values()));
|
||||
cbDraftTiming.setModel(new DefaultComboBoxModel(DraftOptions.TimingOption.values()));
|
||||
cbAllowSpectators.setSelected(true);
|
||||
|
||||
setTournamentSettingsFromPrefs();
|
||||
|
||||
this.setModal(true);
|
||||
setTournamentOptions();
|
||||
this.setLocation(150, 100);
|
||||
this.setVisible(true);
|
||||
}
|
||||
|
@ -354,7 +355,7 @@ public class NewTournamentDialog extends MageDialog {
|
|||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void cbTournamentTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbTournamentTypeActionPerformed
|
||||
setTournamentOptions();
|
||||
setTournamentOptions((Integer) this.spnNumPlayers.getValue());
|
||||
}//GEN-LAST:event_cbTournamentTypeActionPerformed
|
||||
|
||||
private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed
|
||||
|
@ -388,16 +389,19 @@ public class NewTournamentDialog extends MageDialog {
|
|||
tOptions.getMatchOptions().setAttackOption(MultiplayerAttackOption.LEFT);
|
||||
tOptions.getMatchOptions().setRange(RangeOfInfluence.ALL);
|
||||
tOptions.getMatchOptions().setLimited(true);
|
||||
|
||||
saveTournamentSettingsToPrefs(tOptions);
|
||||
|
||||
table = session.createTournamentTable(roomId, tOptions);
|
||||
if (table == null) {
|
||||
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error creating table.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
// message must be send by server!
|
||||
return;
|
||||
}
|
||||
if (session.joinTournamentTable(roomId, table.getTableId(), this.txtPlayer1Name.getText(), "Human", 1)) {
|
||||
for (TournamentPlayerPanel player: players) {
|
||||
if (!player.getPlayerType().equals("Human")) {
|
||||
if (!player.getPlayerType().toString().equals("Human")) {
|
||||
if (!player.joinTournamentTable(roomId, table.getTableId())) {
|
||||
JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error joining tournament.", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
// error message must be send by sever
|
||||
session.removeTable(roomId, table.getTableId());
|
||||
table = null;
|
||||
return;
|
||||
|
@ -427,11 +431,14 @@ public class NewTournamentDialog extends MageDialog {
|
|||
// TODO add your handling code here:
|
||||
}//GEN-LAST:event_spnNumWinsnumPlayersChanged
|
||||
|
||||
private void setTournamentOptions() {
|
||||
private void setTournamentOptions(int numbPlayers) {
|
||||
TournamentTypeView tournamentType = (TournamentTypeView) cbTournamentType.getSelectedItem();
|
||||
this.spnNumPlayers.setModel(new SpinnerNumberModel(tournamentType.getMinPlayers(), tournamentType.getMinPlayers(), tournamentType.getMaxPlayers(), 1));
|
||||
if (numbPlayers < tournamentType.getMinPlayers() || numbPlayers > tournamentType.getMaxPlayers()) {
|
||||
numbPlayers = tournamentType.getMinPlayers();
|
||||
createPlayers(numbPlayers - 1);
|
||||
}
|
||||
this.spnNumPlayers.setModel(new SpinnerNumberModel(numbPlayers, tournamentType.getMinPlayers(), tournamentType.getMaxPlayers(), 1));
|
||||
this.spnNumPlayers.setEnabled(tournamentType.getMinPlayers() != tournamentType.getMaxPlayers());
|
||||
createPlayers(tournamentType.getMinPlayers() - 1);
|
||||
if (tournamentType.isLimited()) {
|
||||
this.pnlPacks.setVisible(true);
|
||||
createPacks(tournamentType.getNumBoosters());
|
||||
|
@ -440,6 +447,7 @@ public class NewTournamentDialog extends MageDialog {
|
|||
this.pnlPacks.setVisible(false);
|
||||
}
|
||||
this.pnlDraftOptions.setVisible(tournamentType.isDraft());
|
||||
|
||||
}
|
||||
|
||||
private void createPacks(int numPacks) {
|
||||
|
@ -528,6 +536,105 @@ public class NewTournamentDialog extends MageDialog {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set the tournament settings from java prefs
|
||||
*/
|
||||
private void setTournamentSettingsFromPrefs () {
|
||||
int numPlayers;
|
||||
txtName.setText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NAME, "Tournament"));
|
||||
int timeLimit = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_TIME_LIMIT, "1500"));
|
||||
for (MatchTimeLimit mtl :MatchTimeLimit.values()) {
|
||||
if (mtl.getTimeLimit() == timeLimit) {
|
||||
this.cbTimeLimit.setSelectedItem(mtl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
this.spnConstructTime.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_CONSTR_TIME, "600"))/60);
|
||||
String tournamentTypeName = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_TYPE, "Sealed Elimination");
|
||||
for (TournamentTypeView tournamentTypeView : session.getTournamentTypes()) {
|
||||
if (tournamentTypeView.getName().equals(tournamentTypeName)) {
|
||||
cbTournamentType.setSelectedItem(tournamentTypeView);
|
||||
break;
|
||||
}
|
||||
}
|
||||
this.spnFreeMulligans.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_FREE_MULLIGANS, "0")));
|
||||
this.spnNumWins.setValue(Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_WINS, "2")));
|
||||
|
||||
if (cbTournamentType.getSelectedItem().toString().equals("Sealed Elimination")) {
|
||||
numPlayers = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_SEALED, "2"));
|
||||
setTournamentOptions(numPlayers);
|
||||
loadBoosterPacks(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_SEALED, ""));
|
||||
}
|
||||
|
||||
if (cbTournamentType.getSelectedItem().toString().equals("Elimination Booster Draft")) {
|
||||
numPlayers = Integer.parseInt(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_DRAFT, "4"));
|
||||
setTournamentOptions(numPlayers);
|
||||
loadBoosterPacks(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_DRAFT, ""));
|
||||
|
||||
String draftTiming = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_DRAFT_TIMING, "REGULAR");
|
||||
for (TimingOption timingOption : DraftOptions.TimingOption.values()) {
|
||||
if (timingOption.toString().equals(draftTiming)) {
|
||||
cbDraftTiming.setSelectedItem(draftTiming);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.cbAllowSpectators.setSelected(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_NEW_TOURNAMENT_ALLOW_SPECTATORS, "Yes").equals("Yes"));
|
||||
}
|
||||
|
||||
private void loadBoosterPacks(String packString) {
|
||||
if (packString.length()>0) {
|
||||
String[] packsArray = packString.substring(1, packString.length() - 1).split(",");
|
||||
int packNumber = 0;
|
||||
for (String pack : packsArray ){
|
||||
packNumber++;
|
||||
if (this.packs.size() >= packNumber - 1) {
|
||||
JComboBox comboBox = this.packs.get(packNumber-1);
|
||||
ComboBoxModel model = comboBox.getModel();
|
||||
int size = model.getSize();
|
||||
for(int i=0;i<size;i++) {
|
||||
ExpansionInfo element = (ExpansionInfo) model.getElementAt(i);
|
||||
if (element.getCode().equals(pack.trim())) {
|
||||
comboBox.setSelectedIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the settings to java prefs to reload it next time the dialog will be created
|
||||
*
|
||||
* @param tOptions Tournament options
|
||||
|
||||
*/
|
||||
private void saveTournamentSettingsToPrefs(TournamentOptions tOptions) {
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NAME, tOptions.getName());
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_TIME_LIMIT, Integer.toString(tOptions.getMatchOptions().getPriorityTime()));
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_CONSTR_TIME, Integer.toString(tOptions.getLimitedOptions().getConstructionTime()));
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_TYPE, tOptions.getTournamentType());
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_FREE_MULLIGANS, Integer.toString(tOptions.getMatchOptions().getFreeMulligans()));
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_NUMBER_OF_WINS, Integer.toString(tOptions.getMatchOptions().getWinsNeeded()));
|
||||
if (tOptions.getTournamentType().equals("Sealed Elimination")) {
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_SEALED, tOptions.getLimitedOptions().getSetCodes().toString());
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_SEALED, Integer.toString(tOptions.getPlayerTypes().size()));
|
||||
} else if (tOptions.getTournamentType().equals("Elimination Booster Draft")) {
|
||||
DraftOptions draftOptions = (DraftOptions) tOptions.getLimitedOptions();
|
||||
if (draftOptions != null) {
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PACKS_DRAFT, draftOptions.getSetCodes().toString());
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_PLAYERS_DRAFT, Integer.toString(tOptions.getPlayerTypes().size()));
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_DRAFT_TIMING, draftOptions.getTiming().name());
|
||||
}
|
||||
}
|
||||
|
||||
PreferencesDialog.saveValue(PreferencesDialog.KEY_NEW_TOURNAMENT_ALLOW_SPECTATORS, (tOptions.isWatchingAllowed()?"Yes":"No"));
|
||||
}
|
||||
|
||||
|
||||
public TableView getTable() {
|
||||
return table;
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="tabsPanel" alignment="0" max="32767" attributes="0"/>
|
||||
<Component id="tabsPanel" alignment="0" pref="562" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="saveButton" min="-2" max="-2" attributes="0"/>
|
||||
|
@ -65,11 +65,12 @@
|
|||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="main_hand" alignment="1" max="32767" attributes="0"/>
|
||||
<Component id="main_battlefield" alignment="0" max="32767" attributes="0"/>
|
||||
<Component id="main_hand" alignment="0" max="32767" attributes="0"/>
|
||||
<Component id="main_gamelog" alignment="1" pref="574" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
|
@ -80,9 +81,11 @@
|
|||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="main_hand" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="main_battlefield" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="170" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="main_gamelog" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="171" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -101,30 +104,7 @@
|
|||
</Property>
|
||||
</Properties>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="showToolTipsInAnyZone" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="displayBigCardsInHand" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="232" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="showToolTipsInAnyZone" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="displayBigCardsInHand" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="59" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JCheckBox" name="showToolTipsInAnyZone">
|
||||
<Properties>
|
||||
|
@ -134,6 +114,11 @@
|
|||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="showToolTipsInAnyZoneActionPerformed"/>
|
||||
</Events>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="javax.swing.JCheckBox" name="displayBigCardsInHand">
|
||||
<Properties>
|
||||
|
@ -142,6 +127,11 @@
|
|||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="displayBigCardsInHandActionPerformed"/>
|
||||
</Events>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="First"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
|
@ -158,25 +148,7 @@
|
|||
</Property>
|
||||
</Properties>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="nonLandPermanentsInOnePile" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="226" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="nonLandPermanentsInOnePile" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="30" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JCheckBox" name="nonLandPermanentsInOnePile">
|
||||
<Properties>
|
||||
|
@ -189,6 +161,45 @@
|
|||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nonLandPermanentsInOnePileActionPerformed"/>
|
||||
</Events>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="main_gamelog">
|
||||
<Properties>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
|
||||
<TitledBorder title="Game log">
|
||||
<Border PropertyName="innerBorder" info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo">
|
||||
<EtchetBorder/>
|
||||
</Border>
|
||||
</TitledBorder>
|
||||
</Border>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AccessibilityProperties>
|
||||
<Property name="AccessibleContext.accessibleName" type="java.lang.String" value="Game log"/>
|
||||
</AccessibilityProperties>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JCheckBox" name="cbGameLogAutoSave">
|
||||
<Properties>
|
||||
<Property name="selected" type="boolean" value="true"/>
|
||||
<Property name="text" type="java.lang.String" value="Auto save game logs (to "../Mage.Client/gamelogs/" directory)"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbGameLogAutoSaveActionPerformed"/>
|
||||
</Events>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
|
@ -262,7 +273,7 @@
|
|||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace pref="171" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="187" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -334,7 +345,7 @@
|
|||
<Component id="jLabel8" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="checkBoxEndTurnOthers" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="162" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="120" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -449,7 +460,7 @@
|
|||
<Component id="jPanel5" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jPanel23" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="72" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="36" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -471,23 +482,19 @@
|
|||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="24" pref="24" max="-2" attributes="0"/>
|
||||
<Component id="txtImageFolderPath" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="btnBrowseImageLocation" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="cbUseDefaultImageFolder" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cbCheckForNewImages" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cbSaveToZipFiles" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="268" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="txtImageFolderPath" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="btnBrowseImageLocation" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="cbUseDefaultImageFolder" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cbCheckForNewImages" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cbSaveToZipFiles" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -564,34 +571,38 @@
|
|||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="-2" pref="19" max="-2" attributes="0"/>
|
||||
<Component id="jLabel14" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
|
||||
<Component id="jLabel15" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="cbUseDefaultBackground" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="jLabel15" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="txtBattlefieldImagePath" max="32767" attributes="0"/>
|
||||
<Component id="txtBattlefieldImagePath" linkSize="1" min="-2" pref="336" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="btnBrowseBattlefieldImage" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="cbUseDefaultBattleImage" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cbUseRandomBattleImage" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="jLabel14" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="txtBackgroundImagePath" max="32767" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="txtBackgroundImagePath" linkSize="1" min="-2" pref="332" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="btnBrowseBackgroundImage" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="cbUseRandomBattleImage" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cbUseDefaultBattleImage" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="cbUseDefaultBackground" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -714,7 +725,7 @@
|
|||
<Component id="sounds_clips" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="sounds_backgroundMusic" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="262" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="254" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -736,22 +747,7 @@
|
|||
<Property name="AccessibleContext.accessibleDescription" type="java.lang.String" value=""/>
|
||||
</AccessibilityProperties>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="cbEnableSounds" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="410" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="cbEnableSounds" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JCheckBox" name="cbEnableSounds">
|
||||
<Properties>
|
||||
|
@ -761,6 +757,11 @@
|
|||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbEnableSoundsActionPerformed"/>
|
||||
</Events>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
|
||||
<BorderConstraints direction="Center"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
|
@ -782,19 +783,15 @@
|
|||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="jLabel16" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="txtBattlefieldIBGMPath" pref="280" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="btnBattlefieldBGMBrowse" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="cbEnableBattlefieldBGM" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Component id="jLabel16" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="txtBattlefieldIBGMPath" pref="297" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="btnBattlefieldBGMBrowse" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="cbEnableBattlefieldBGM" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -823,6 +820,17 @@
|
|||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbEnableBattlefieldBGMActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="jLabel16">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Playing from folder:"/>
|
||||
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="txtBattlefieldIBGMPath">
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="txtBattlefieldIBGMPathActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="btnBattlefieldBGMBrowse">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Browse..."/>
|
||||
|
@ -831,17 +839,6 @@
|
|||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnBattlefieldBGMBrowseActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="txtBattlefieldIBGMPath">
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="txtBattlefieldIBGMPathActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="jLabel16">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Playing from folder:"/>
|
||||
<Property name="toolTipText" type="java.lang.String" value=""/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
</SubComponents>
|
||||
|
@ -885,7 +882,7 @@
|
|||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="pnlProxySettings" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace pref="178" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="157" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -960,7 +957,7 @@
|
|||
<Component id="txtPasswordField" alignment="0" max="32767" attributes="1"/>
|
||||
<Component id="txtProxyUserName" alignment="0" min="-2" pref="148" max="-2" attributes="1"/>
|
||||
</Group>
|
||||
<Component id="txtProxyServer" alignment="0" pref="366" max="32767" attributes="1"/>
|
||||
<Component id="txtProxyServer" alignment="0" pref="394" max="32767" attributes="1"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
|
@ -1068,12 +1065,12 @@
|
|||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jScrollPane1" alignment="0" pref="505" max="32767" attributes="0"/>
|
||||
<Component id="jScrollPane1" alignment="0" pref="557" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="jScrollPane1" alignment="0" pref="402" max="32767" attributes="0"/>
|
||||
<Component id="jScrollPane1" alignment="0" pref="400" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
|
@ -1131,7 +1128,7 @@
|
|||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace pref="85" max="32767" attributes="0"/>
|
||||
<EmptySpace pref="131" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
|
|
@ -77,6 +77,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
public static final String KEY_SHOW_TOOLTIPS_ANY_ZONE = "showTooltipsInAnyZone";
|
||||
public static final String KEY_HAND_USE_BIG_CARDS = "handUseBigCards";
|
||||
public static final String KEY_PERMANENTS_IN_ONE_PILE = "nonLandPermanentsInOnePile";
|
||||
public static final String KEY_GAME_LOG_AUTO_SAVE = "gameLogAutoSave";
|
||||
|
||||
public static final String KEY_CARD_IMAGES_USE_DEFAULT = "cardImagesUseDefault";
|
||||
public static final String KEY_CARD_IMAGES_PATH = "cardImagesPath";
|
||||
|
@ -111,7 +112,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
public static final String KEY_TOURNAMENT_DIVIDER_LOCATION_1 = "tournamentPanelDividerLocation1";
|
||||
public static final String KEY_TOURNAMENT_DIVIDER_LOCATION_2 = "tournamentPanelDividerLocation2";
|
||||
|
||||
// default setting for new table dialog
|
||||
// pref setting for new table dialog
|
||||
public static final String KEY_NEW_TABLE_NAME = "newTableName";
|
||||
public static final String KEY_NEW_TABLE_DECK_TYPE = "newTableDeckType";
|
||||
public static final String KEY_NEW_TABLE_TIME_LIMIT = "newTableTimeLimit";
|
||||
|
@ -123,6 +124,24 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
public static final String KEY_NEW_TABLE_ATTACK_OPTION = "newTableAttackOption";
|
||||
public static final String KEY_NEW_TABLE_NUMBER_PLAYERS = "newTableNumberPlayers";
|
||||
|
||||
// pref setting for new tournament dialog
|
||||
public static final String KEY_NEW_TOURNAMENT_NAME = "newTournamentName";
|
||||
public static final String KEY_NEW_TOURNAMENT_TIME_LIMIT = "newTournamentTimeLimit";
|
||||
public static final String KEY_NEW_TOURNAMENT_CONSTR_TIME = "newTournamentConstructionTime";
|
||||
public static final String KEY_NEW_TOURNAMENT_TYPE = "newTournamentType";
|
||||
public static final String KEY_NEW_TOURNAMENT_NUMBER_OF_FREE_MULLIGANS = "newTournamentNumberOfFreeMulligans";
|
||||
public static final String KEY_NEW_TOURNAMENT_NUMBER_OF_WINS = "newTournamentNumberOfWins";
|
||||
public static final String KEY_NEW_TOURNAMENT_PACKS_SEALED = "newTournamentPacksSealed";
|
||||
public static final String KEY_NEW_TOURNAMENT_PACKS_DRAFT = "newTournamentPacksDraft";
|
||||
public static final String KEY_NEW_TOURNAMENT_PLAYERS_SEALED = "newTournamentPlayersSealed";
|
||||
public static final String KEY_NEW_TOURNAMENT_PLAYERS_DRAFT = "newTournamentPlayersDraft";
|
||||
public static final String KEY_NEW_TOURNAMENT_DRAFT_TIMING = "newTournamentDraftTiming";
|
||||
public static final String KEY_NEW_TOURNAMENT_ALLOW_SPECTATORS = "newTournamentAllowSpectators";
|
||||
|
||||
// pref setting for deck generator
|
||||
public static final String KEY_NEW_DECK_GENERATOR_DECK_SIZE = "newDeckGeneratorDeckSize";
|
||||
public static final String KEY_NEW_DECK_GENERATOR_SET = "newDeckGeneratorSet";
|
||||
|
||||
// used to save and restore the settings for the cardArea (draft, sideboarding, deck builder)
|
||||
public static final String KEY_DRAFT_VIEW = "draftView";
|
||||
public static final String KEY_DRAFT_PILES_TOGGLE = "draftPilesToggle";
|
||||
|
@ -230,6 +249,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
displayBigCardsInHand = new javax.swing.JCheckBox();
|
||||
main_battlefield = new javax.swing.JPanel();
|
||||
nonLandPermanentsInOnePile = new javax.swing.JCheckBox();
|
||||
main_gamelog = new javax.swing.JPanel();
|
||||
cbGameLogAutoSave = new javax.swing.JCheckBox();
|
||||
tabPhases = new javax.swing.JPanel();
|
||||
jLabel1 = new javax.swing.JLabel();
|
||||
jLabel2 = new javax.swing.JLabel();
|
||||
|
@ -277,9 +298,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
cbEnableSounds = new javax.swing.JCheckBox();
|
||||
sounds_backgroundMusic = new javax.swing.JPanel();
|
||||
cbEnableBattlefieldBGM = new javax.swing.JCheckBox();
|
||||
btnBattlefieldBGMBrowse = new javax.swing.JButton();
|
||||
txtBattlefieldIBGMPath = new javax.swing.JTextField();
|
||||
jLabel16 = new javax.swing.JLabel();
|
||||
txtBattlefieldIBGMPath = new javax.swing.JTextField();
|
||||
btnBattlefieldBGMBrowse = new javax.swing.JButton();
|
||||
tabConnection = new javax.swing.JPanel();
|
||||
lblProxyType = new javax.swing.JLabel();
|
||||
cbProxyType = new javax.swing.JComboBox();
|
||||
|
@ -319,6 +340,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
setTitle("Preferences");
|
||||
|
||||
main_hand.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Hand"));
|
||||
main_hand.setLayout(new java.awt.BorderLayout());
|
||||
|
||||
showToolTipsInAnyZone.setSelected(true);
|
||||
showToolTipsInAnyZone.setText("Show tooltips");
|
||||
|
@ -327,6 +349,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
showToolTipsInAnyZoneActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
main_hand.add(showToolTipsInAnyZone, java.awt.BorderLayout.CENTER);
|
||||
|
||||
displayBigCardsInHand.setText("Use big images (for high resolution screens)");
|
||||
displayBigCardsInHand.addActionListener(new java.awt.event.ActionListener() {
|
||||
|
@ -334,28 +357,10 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
displayBigCardsInHandActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout main_handLayout = new javax.swing.GroupLayout(main_hand);
|
||||
main_hand.setLayout(main_handLayout);
|
||||
main_handLayout.setHorizontalGroup(
|
||||
main_handLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(main_handLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(main_handLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(showToolTipsInAnyZone)
|
||||
.addComponent(displayBigCardsInHand))
|
||||
.addContainerGap(232, Short.MAX_VALUE))
|
||||
);
|
||||
main_handLayout.setVerticalGroup(
|
||||
main_handLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(main_handLayout.createSequentialGroup()
|
||||
.addComponent(showToolTipsInAnyZone)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(displayBigCardsInHand)
|
||||
.addContainerGap(59, Short.MAX_VALUE))
|
||||
);
|
||||
main_hand.add(displayBigCardsInHand, java.awt.BorderLayout.PAGE_START);
|
||||
|
||||
main_battlefield.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Battlefield"));
|
||||
main_battlefield.setLayout(new java.awt.BorderLayout());
|
||||
|
||||
nonLandPermanentsInOnePile.setSelected(true);
|
||||
nonLandPermanentsInOnePile.setLabel("Put non-land permanents in one pile");
|
||||
|
@ -364,34 +369,31 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
nonLandPermanentsInOnePileActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout main_battlefieldLayout = new javax.swing.GroupLayout(main_battlefield);
|
||||
main_battlefield.setLayout(main_battlefieldLayout);
|
||||
main_battlefieldLayout.setHorizontalGroup(
|
||||
main_battlefieldLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(main_battlefieldLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(nonLandPermanentsInOnePile)
|
||||
.addContainerGap(226, Short.MAX_VALUE))
|
||||
);
|
||||
main_battlefieldLayout.setVerticalGroup(
|
||||
main_battlefieldLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(main_battlefieldLayout.createSequentialGroup()
|
||||
.addComponent(nonLandPermanentsInOnePile)
|
||||
.addContainerGap(30, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
main_battlefield.add(nonLandPermanentsInOnePile, java.awt.BorderLayout.CENTER);
|
||||
nonLandPermanentsInOnePile.getAccessibleContext().setAccessibleName("nonLandPermanentsInOnePile");
|
||||
|
||||
main_gamelog.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Game log"));
|
||||
main_gamelog.setLayout(new java.awt.BorderLayout());
|
||||
|
||||
cbGameLogAutoSave.setSelected(true);
|
||||
cbGameLogAutoSave.setText("Auto save game logs (to \"../Mage.Client/gamelogs/\" directory)");
|
||||
cbGameLogAutoSave.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
cbGameLogAutoSaveActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
main_gamelog.add(cbGameLogAutoSave, java.awt.BorderLayout.CENTER);
|
||||
|
||||
javax.swing.GroupLayout tabMainLayout = new javax.swing.GroupLayout(tabMain);
|
||||
tabMain.setLayout(tabMainLayout);
|
||||
tabMainLayout.setHorizontalGroup(
|
||||
tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, tabMainLayout.createSequentialGroup()
|
||||
.addGroup(tabMainLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||
.addComponent(main_battlefield, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(main_hand, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addGroup(tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(main_hand, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(main_battlefield, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE))
|
||||
.addContainerGap())
|
||||
);
|
||||
tabMainLayout.setVerticalGroup(
|
||||
|
@ -399,11 +401,15 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addGroup(tabMainLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(main_hand, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(main_battlefield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap(170, Short.MAX_VALUE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap(171, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
main_gamelog.getAccessibleContext().setAccessibleName("Game log");
|
||||
|
||||
tabsPanel.addTab("Main", tabMain);
|
||||
|
||||
jLabel1.setText("Choose phases MAGE will stop on:");
|
||||
|
@ -474,7 +480,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addGroup(tabPhasesLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jLabel1)))
|
||||
.addContainerGap(171, Short.MAX_VALUE))
|
||||
.addContainerGap(187, Short.MAX_VALUE))
|
||||
);
|
||||
tabPhasesLayout.setVerticalGroup(
|
||||
tabPhasesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
|
@ -529,7 +535,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addComponent(checkBoxEndTurnYou)
|
||||
.addComponent(jLabel8)
|
||||
.addComponent(checkBoxEndTurnOthers))
|
||||
.addContainerGap(162, Short.MAX_VALUE))
|
||||
.addContainerGap(120, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
tabsPanel.addTab("Phases", tabPhases);
|
||||
|
@ -569,18 +575,16 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
jPanel5Layout.setHorizontalGroup(
|
||||
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel5Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGap(24, 24, 24)
|
||||
.addComponent(txtImageFolderPath)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(btnBrowseImageLocation))
|
||||
.addGroup(jPanel5Layout.createSequentialGroup()
|
||||
.addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel5Layout.createSequentialGroup()
|
||||
.addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(cbUseDefaultImageFolder)
|
||||
.addComponent(cbCheckForNewImages)
|
||||
.addComponent(cbSaveToZipFiles))
|
||||
.addContainerGap(268, Short.MAX_VALUE))
|
||||
.addGroup(jPanel5Layout.createSequentialGroup()
|
||||
.addComponent(txtImageFolderPath)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(btnBrowseImageLocation))))
|
||||
.addComponent(cbUseDefaultImageFolder)
|
||||
.addComponent(cbCheckForNewImages)
|
||||
.addComponent(cbSaveToZipFiles))
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
);
|
||||
jPanel5Layout.setVerticalGroup(
|
||||
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
|
@ -656,29 +660,34 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
jPanel23Layout.setHorizontalGroup(
|
||||
jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
.addComponent(cbUseDefaultBackground)
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel23Layout.createSequentialGroup()
|
||||
.addComponent(jLabel15)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(txtBattlefieldImagePath)
|
||||
.addGap(19, 19, 19)
|
||||
.addComponent(jLabel14))
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
.addGap(25, 25, 25)
|
||||
.addComponent(jLabel15)))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
.addComponent(txtBattlefieldImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(btnBrowseBattlefieldImage))
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
.addGroup(jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(cbUseDefaultBattleImage)
|
||||
.addComponent(cbUseRandomBattleImage))
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
.addComponent(jLabel14)
|
||||
.addComponent(txtBackgroundImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 332, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(txtBackgroundImagePath)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(btnBrowseBackgroundImage))))
|
||||
.addComponent(btnBrowseBackgroundImage)))
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
.addGroup(jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(cbUseRandomBattleImage)
|
||||
.addComponent(cbUseDefaultBattleImage)
|
||||
.addComponent(cbUseDefaultBackground))
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
jPanel23Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {txtBackgroundImagePath, txtBattlefieldImagePath});
|
||||
|
||||
jPanel23Layout.setVerticalGroup(
|
||||
jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel23Layout.createSequentialGroup()
|
||||
|
@ -718,12 +727,13 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jPanel23, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap(72, Short.MAX_VALUE))
|
||||
.addContainerGap(36, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
tabsPanel.addTab("Images", tabImages);
|
||||
|
||||
sounds_clips.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Clips"));
|
||||
sounds_clips.setLayout(new java.awt.BorderLayout());
|
||||
|
||||
cbEnableSounds.setToolTipText("Sounds that will be played for certain actions (e.g. play land, attack, etc.)");
|
||||
cbEnableSounds.setLabel("Enable");
|
||||
|
@ -732,20 +742,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
cbEnableSoundsActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout sounds_clipsLayout = new javax.swing.GroupLayout(sounds_clips);
|
||||
sounds_clips.setLayout(sounds_clipsLayout);
|
||||
sounds_clipsLayout.setHorizontalGroup(
|
||||
sounds_clipsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(sounds_clipsLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(cbEnableSounds)
|
||||
.addContainerGap(410, Short.MAX_VALUE))
|
||||
);
|
||||
sounds_clipsLayout.setVerticalGroup(
|
||||
sounds_clipsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(cbEnableSounds)
|
||||
);
|
||||
sounds_clips.add(cbEnableSounds, java.awt.BorderLayout.CENTER);
|
||||
|
||||
sounds_backgroundMusic.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Music"));
|
||||
|
||||
|
@ -758,12 +755,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
}
|
||||
});
|
||||
|
||||
btnBattlefieldBGMBrowse.setText("Browse...");
|
||||
btnBattlefieldBGMBrowse.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
btnBattlefieldBGMBrowseActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
jLabel16.setText("Playing from folder:");
|
||||
jLabel16.setToolTipText("");
|
||||
|
||||
txtBattlefieldIBGMPath.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
|
@ -771,8 +764,12 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
}
|
||||
});
|
||||
|
||||
jLabel16.setText("Playing from folder:");
|
||||
jLabel16.setToolTipText("");
|
||||
btnBattlefieldBGMBrowse.setText("Browse...");
|
||||
btnBattlefieldBGMBrowse.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
btnBattlefieldBGMBrowseActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
javax.swing.GroupLayout sounds_backgroundMusicLayout = new javax.swing.GroupLayout(sounds_backgroundMusic);
|
||||
sounds_backgroundMusic.setLayout(sounds_backgroundMusicLayout);
|
||||
|
@ -780,16 +777,14 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
sounds_backgroundMusicLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(sounds_backgroundMusicLayout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(sounds_backgroundMusicLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(sounds_backgroundMusicLayout.createSequentialGroup()
|
||||
.addComponent(jLabel16)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(txtBattlefieldIBGMPath, javax.swing.GroupLayout.DEFAULT_SIZE, 280, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(btnBattlefieldBGMBrowse))
|
||||
.addGroup(sounds_backgroundMusicLayout.createSequentialGroup()
|
||||
.addComponent(cbEnableBattlefieldBGM)
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
|
||||
.addComponent(jLabel16)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(txtBattlefieldIBGMPath, javax.swing.GroupLayout.DEFAULT_SIZE, 297, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(btnBattlefieldBGMBrowse))
|
||||
.addGroup(sounds_backgroundMusicLayout.createSequentialGroup()
|
||||
.addComponent(cbEnableBattlefieldBGM)
|
||||
.addGap(0, 0, Short.MAX_VALUE))
|
||||
);
|
||||
sounds_backgroundMusicLayout.setVerticalGroup(
|
||||
sounds_backgroundMusicLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
|
@ -820,7 +815,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addComponent(sounds_clips, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(sounds_backgroundMusic, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap(262, Short.MAX_VALUE))
|
||||
.addContainerGap(254, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
sounds_clips.getAccessibleContext().setAccessibleDescription("");
|
||||
|
@ -890,7 +885,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addGroup(pnlProxyLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
||||
.addComponent(txtPasswordField, javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(txtProxyUserName, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 148, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addComponent(txtProxyServer, javax.swing.GroupLayout.DEFAULT_SIZE, 366, Short.MAX_VALUE))
|
||||
.addComponent(txtProxyServer, javax.swing.GroupLayout.DEFAULT_SIZE, 394, Short.MAX_VALUE))
|
||||
.addContainerGap())
|
||||
);
|
||||
pnlProxyLayout.setVerticalGroup(
|
||||
|
@ -960,7 +955,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(pnlProxySettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap(178, Short.MAX_VALUE))
|
||||
.addContainerGap(157, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
pnlProxySettings.getAccessibleContext().setAccessibleDescription("");
|
||||
|
@ -1166,7 +1161,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
.addComponent(jPanel21, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
|
||||
.addContainerGap(85, Short.MAX_VALUE))
|
||||
.addContainerGap(131, Short.MAX_VALUE))
|
||||
);
|
||||
jPanel9Layout.setVerticalGroup(
|
||||
jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
|
@ -1205,11 +1200,11 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
tabAvatars.setLayout(tabAvatarsLayout);
|
||||
tabAvatarsLayout.setHorizontalGroup(
|
||||
tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 505, Short.MAX_VALUE)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 557, Short.MAX_VALUE)
|
||||
);
|
||||
tabAvatarsLayout.setVerticalGroup(
|
||||
tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 402, Short.MAX_VALUE)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
|
||||
);
|
||||
|
||||
tabsPanel.addTab("Avatars", tabAvatars);
|
||||
|
@ -1232,7 +1227,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(tabsPanel)
|
||||
.addComponent(tabsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 562, Short.MAX_VALUE)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(saveButton)
|
||||
|
@ -1261,6 +1256,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
save(prefs, dialog.showToolTipsInAnyZone, KEY_SHOW_TOOLTIPS_ANY_ZONE, "true", "false", UPDATE_CACHE_POLICY);
|
||||
save(prefs, dialog.displayBigCardsInHand, KEY_HAND_USE_BIG_CARDS, "true", "false", UPDATE_CACHE_POLICY);
|
||||
save(prefs, dialog.nonLandPermanentsInOnePile, KEY_PERMANENTS_IN_ONE_PILE, "true", "false", UPDATE_CACHE_POLICY);
|
||||
save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
|
||||
|
||||
// Phases
|
||||
save(prefs, dialog.checkBoxUpkeepYou, PhaseManager.UPKEEP_YOU);
|
||||
|
@ -1506,6 +1502,10 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
}
|
||||
}//GEN-LAST:event_btnBattlefieldBGMBrowseActionPerformed
|
||||
|
||||
private void cbGameLogAutoSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbGameLogAutoSaveActionPerformed
|
||||
// TODO add your handling code here:
|
||||
}//GEN-LAST:event_cbGameLogAutoSaveActionPerformed
|
||||
|
||||
private void showProxySettings() {
|
||||
if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) {
|
||||
this.pnlProxy.setVisible(true);
|
||||
|
@ -1588,6 +1588,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
load(prefs, dialog.displayBigCardsInHand, KEY_HAND_USE_BIG_CARDS, "true");
|
||||
load(prefs, dialog.showToolTipsInAnyZone, KEY_SHOW_TOOLTIPS_ANY_ZONE, "true");
|
||||
load(prefs, dialog.nonLandPermanentsInOnePile, KEY_PERMANENTS_IN_ONE_PILE, "true");
|
||||
load(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true");
|
||||
}
|
||||
|
||||
private static void loadImagesSettings(Preferences prefs) {
|
||||
|
@ -1883,6 +1884,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
private javax.swing.JCheckBox cbCheckForNewImages;
|
||||
private javax.swing.JCheckBox cbEnableBattlefieldBGM;
|
||||
private javax.swing.JCheckBox cbEnableSounds;
|
||||
private javax.swing.JCheckBox cbGameLogAutoSave;
|
||||
private javax.swing.JComboBox cbProxyType;
|
||||
private javax.swing.JCheckBox cbSaveToZipFiles;
|
||||
private javax.swing.JCheckBox cbUseDefaultBackground;
|
||||
|
@ -1943,6 +1945,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
private javax.swing.JLabel lblProxyType;
|
||||
private javax.swing.JLabel lblProxyUserName;
|
||||
private javax.swing.JPanel main_battlefield;
|
||||
private javax.swing.JPanel main_gamelog;
|
||||
private javax.swing.JPanel main_hand;
|
||||
private javax.swing.JCheckBox nonLandPermanentsInOnePile;
|
||||
private javax.swing.JPanel pnlProxy;
|
||||
|
|
|
@ -70,6 +70,7 @@ public class FeedbackPanel extends javax.swing.JPanel {
|
|||
private FeedbackMode mode;
|
||||
private MageDialog connectedDialog;
|
||||
private ChatPanel connectedChatPanel;
|
||||
private int lastMessageId;
|
||||
|
||||
private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
|
||||
|
||||
|
@ -84,8 +85,17 @@ public class FeedbackPanel extends javax.swing.JPanel {
|
|||
session = MageFrame.getSession();
|
||||
}
|
||||
|
||||
public void getFeedback(FeedbackMode mode, String message, boolean special, Map<String, Serializable> options) {
|
||||
public void getFeedback(FeedbackMode mode, String message, boolean special, Map<String, Serializable> options, int messageId) {
|
||||
logger.info("text: " + message);
|
||||
|
||||
synchronized (this) {
|
||||
if (messageId < this.lastMessageId) {
|
||||
logger.warn("ignoring message from later source: " + messageId + ", text=" + message);
|
||||
return;
|
||||
}
|
||||
this.lastMessageId = messageId;
|
||||
}
|
||||
|
||||
this.lblMessage.setText(message);
|
||||
this.helper.setMessage(message);
|
||||
this.selected = false;
|
||||
|
|
|
@ -560,29 +560,29 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
}
|
||||
}
|
||||
|
||||
public void ask(String question, GameView gameView) {
|
||||
public void ask(String question, GameView gameView, int messageId) {
|
||||
updateGame(gameView);
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.QUESTION, question, false, null);
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.QUESTION, question, false, null, messageId);
|
||||
}
|
||||
|
||||
public void pickTarget(String message, CardsView cardView, GameView gameView, Set<UUID> targets, boolean required, Map<String, Serializable> options) {
|
||||
public void pickTarget(String message, CardsView cardView, GameView gameView, Set<UUID> targets, boolean required, Map<String, Serializable> options, int messageId) {
|
||||
updateGame(gameView);
|
||||
Map<String, Serializable> options0 = options == null ? new HashMap<String, Serializable>() : options;
|
||||
if (cardView != null && cardView.size() > 0) {
|
||||
ShowCardsDialog dialog = showCards(message, cardView, required, options0);
|
||||
options0.put("dialog", dialog);
|
||||
}
|
||||
this.feedbackPanel.getFeedback(required?FeedbackMode.INFORM:FeedbackMode.CANCEL, message, gameView.getSpecial(), options0);
|
||||
this.feedbackPanel.getFeedback(required?FeedbackMode.INFORM:FeedbackMode.CANCEL, message, gameView.getSpecial(), options0, messageId);
|
||||
|
||||
}
|
||||
|
||||
public void inform(String information, GameView gameView) {
|
||||
public void inform(String information, GameView gameView, int messageId) {
|
||||
updateGame(gameView);
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.INFORM, information, gameView.getSpecial(), null);
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.INFORM, information, gameView.getSpecial(), null, messageId);
|
||||
}
|
||||
|
||||
public void endMessage(String message) {
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.END, message, false, null);
|
||||
public void endMessage(String message, int messageId) {
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.END, message, false, null, messageId);
|
||||
ArrowBuilder.getBuilder().removeAllArrows(gameId);
|
||||
}
|
||||
|
||||
|
@ -590,7 +590,7 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
return JOptionPane.showConfirmDialog(this, message, title, JOptionPane.YES_NO_OPTION);
|
||||
}
|
||||
|
||||
public void select(String message, GameView gameView) {
|
||||
public void select(String message, GameView gameView, int messageId) {
|
||||
updateGame(gameView);
|
||||
String messageToDisplay = message;
|
||||
Map<String, Serializable> options = null;
|
||||
|
@ -609,22 +609,22 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
break;
|
||||
}
|
||||
}
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.SELECT, messageToDisplay, gameView.getSpecial(), options);
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.SELECT, messageToDisplay, gameView.getSpecial(), options, messageId);
|
||||
if (PhaseManager.getInstance().isSkip(gameView, message)) {
|
||||
this.feedbackPanel.doClick();
|
||||
}
|
||||
}
|
||||
|
||||
public void playMana(String message, GameView gameView) {
|
||||
public void playMana(String message, GameView gameView, int messageId) {
|
||||
updateGame(gameView);
|
||||
DialogManager.getManager(gameId).fadeOut();
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.CANCEL, message, gameView.getSpecial(), null);
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.CANCEL, message, gameView.getSpecial(), null, messageId);
|
||||
}
|
||||
|
||||
public void playXMana(String message, GameView gameView) {
|
||||
public void playXMana(String message, GameView gameView, int messageId) {
|
||||
updateGame(gameView);
|
||||
DialogManager.getManager(gameId).fadeOut();
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.CONFIRM, message, gameView.getSpecial(), null);
|
||||
this.feedbackPanel.getFeedback(FeedbackMode.CONFIRM, message, gameView.getSpecial(), null, messageId);
|
||||
}
|
||||
|
||||
public void replayMessage(String message) {
|
||||
|
@ -715,6 +715,7 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
userChatPanel = new mage.client.chat.ChatPanel();
|
||||
userChatPanel.setParentChat(gameChatPanel);
|
||||
userChatPanel.useExtendedView(ChatPanel.VIEW_MODE.CHAT);
|
||||
userChatPanel.setChatType(ChatPanel.ChatType.GAME);
|
||||
gameChatPanel.setConnectedChat(userChatPanel);
|
||||
gameChatPanel.disableInput();
|
||||
gameChatPanel.setMinimumSize(new java.awt.Dimension(100, 48));
|
||||
|
@ -1244,6 +1245,10 @@ public final class GamePanel extends javax.swing.JPanel {
|
|||
hoverButtons.put(name, button);
|
||||
}
|
||||
|
||||
public String getGameLog() {
|
||||
return gameChatPanel.getText();
|
||||
}
|
||||
|
||||
private mage.client.components.ability.AbilityPicker abilityPicker;
|
||||
private mage.client.cards.BigCard bigCard;
|
||||
private javax.swing.JButton btnConcede;
|
||||
|
|
|
@ -28,10 +28,11 @@
|
|||
|
||||
package mage.client.remote;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
import mage.Constants;
|
||||
import mage.cards.decks.Deck;
|
||||
import mage.client.MageFrame;
|
||||
import mage.client.chat.ChatPanel;
|
||||
|
@ -39,6 +40,7 @@ import mage.client.constants.Constants.DeckEditorMode;
|
|||
import mage.client.draft.DraftPanel;
|
||||
import mage.client.game.GamePanel;
|
||||
import mage.client.plugins.impl.Plugins;
|
||||
import mage.client.util.AudioManager;
|
||||
import mage.client.util.DeckUtil;
|
||||
import mage.client.util.GameManager;
|
||||
import mage.client.util.object.SaveObjectUtil;
|
||||
|
@ -112,20 +114,28 @@ public class CallbackClientImpl implements CallbackClient {
|
|||
ChatMessage message = (ChatMessage) callback.getData();
|
||||
ChatPanel panel = MageFrame.getChat(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
if (message.getMessage().equals(Constants.MSG_TIP_HOT_KEYS_CODE) && panel.getConnectedChat() != null) {
|
||||
panel.getConnectedChat().receiveMessage("[Tips] ", "You may use hot keys to play faster: " + "" +
|
||||
"\nTurn Mousewheel - Show big image of card your mousepointer hovers over" +
|
||||
"\nF2 - Confirm \"Ok\", \"Yes\" or \"Done\" button" +
|
||||
"\nF4 - Skip current turn but stop on declare attackers" +
|
||||
"\nF9 - Skip everything until your next turn" +
|
||||
"\nF3 - Undo F4/F9", "", ChatMessage.MessageColor.ORANGE);
|
||||
} else {
|
||||
if (message.isUserMessage() && panel.getConnectedChat() != null) {
|
||||
panel.getConnectedChat().receiveMessage(message.getUsername(), message.getMessage(), message.getTime(), ChatMessage.MessageColor.BLACK);
|
||||
} else {
|
||||
panel.receiveMessage(message.getUsername(), message.getMessage(), message.getTime(), message.getColor());
|
||||
// play the to the message connected sound
|
||||
if (message.getSoundToPlay() != null) {
|
||||
switch (message.getSoundToPlay()) {
|
||||
case PlayerLeft:
|
||||
AudioManager.playPlayerLeft();
|
||||
break;
|
||||
case PlayerSubmittedDeck:
|
||||
AudioManager.playPlayerSubmittedDeck();
|
||||
break;
|
||||
}
|
||||
}
|
||||
// send start message to chat if needed
|
||||
if (!panel.isStartMessageDone()) {
|
||||
createChatStartMessage(panel);
|
||||
}
|
||||
// send the message itself
|
||||
if (message.isUserMessage() && panel.getConnectedChat() != null) {
|
||||
panel.getConnectedChat().receiveMessage(message.getUsername(), message.getMessage(), message.getTime(), ChatMessage.MessageColor.BLACK);
|
||||
} else {
|
||||
panel.receiveMessage(message.getUsername(), message.getMessage(), message.getTime(), message.getColor());
|
||||
}
|
||||
|
||||
}
|
||||
} else if (callback.getMethod().equals("serverMessage")) {
|
||||
if (callback.getData() != null) {
|
||||
|
@ -149,7 +159,7 @@ public class CallbackClientImpl implements CallbackClient {
|
|||
else if (callback.getMethod().equals("replayDone")) {
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.endMessage((String) callback.getData());
|
||||
panel.endMessage((String) callback.getData(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("replayUpdate")) {
|
||||
|
@ -167,7 +177,7 @@ public class CallbackClientImpl implements CallbackClient {
|
|||
else if (callback.getMethod().equals("gameOver")) {
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.endMessage((String) callback.getData());
|
||||
panel.endMessage((String) callback.getData(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("gameError")) {
|
||||
|
@ -177,21 +187,22 @@ public class CallbackClientImpl implements CallbackClient {
|
|||
GameClientMessage message = (GameClientMessage) callback.getData();
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.ask(message.getMessage(), message.getGameView());
|
||||
panel.ask(message.getMessage(), message.getGameView(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("gameTarget")) {
|
||||
GameClientMessage message = (GameClientMessage) callback.getData();
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.pickTarget(message.getMessage(), message.getCardsView(), message.getGameView(), message.getTargets(), message.isFlag(), message.getOptions());
|
||||
panel.pickTarget(message.getMessage(), message.getCardsView(), message.getGameView(),
|
||||
message.getTargets(), message.isFlag(), message.getOptions(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("gameSelect")) {
|
||||
GameClientMessage message = (GameClientMessage) callback.getData();
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.select(message.getMessage(), message.getGameView());
|
||||
panel.select(message.getMessage(), message.getGameView(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("gameChooseAbility")) {
|
||||
|
@ -218,14 +229,14 @@ public class CallbackClientImpl implements CallbackClient {
|
|||
GameClientMessage message = (GameClientMessage) callback.getData();
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.playMana(message.getMessage(), message.getGameView());
|
||||
panel.playMana(message.getMessage(), message.getGameView(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("gamePlayXMana")) {
|
||||
GameClientMessage message = (GameClientMessage) callback.getData();
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.playXMana(message.getMessage(), message.getGameView());
|
||||
panel.playXMana(message.getMessage(), message.getGameView(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("gameSelectAmount")) {
|
||||
|
@ -244,13 +255,19 @@ public class CallbackClientImpl implements CallbackClient {
|
|||
else if (callback.getMethod().equals("endGameInfo")) {
|
||||
MageFrame.getInstance().showGameEndDialog((GameEndView) callback.getData());
|
||||
}
|
||||
else if (callback.getMethod().equals("showUserMessage")) {
|
||||
List<String> messageData = (List<String>) callback.getData();
|
||||
if (messageData.size() == 2) {
|
||||
JOptionPane.showMessageDialog(null, messageData.get(1), messageData.get(0), JOptionPane.WARNING_MESSAGE);
|
||||
}
|
||||
}
|
||||
else if (callback.getMethod().equals("gameInform")) {
|
||||
|
||||
if (callback.getMessageId() > messageId) {
|
||||
GameClientMessage message = (GameClientMessage) callback.getData();
|
||||
GamePanel panel = MageFrame.getGame(callback.getObjectId());
|
||||
if (panel != null) {
|
||||
panel.inform(message.getMessage(), message.getGameView());
|
||||
panel.inform(message.getMessage(), message.getGameView(), callback.getMessageId());
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -328,6 +345,34 @@ public class CallbackClientImpl implements CallbackClient {
|
|||
});
|
||||
}
|
||||
|
||||
private void createChatStartMessage(ChatPanel chatPanel) {
|
||||
chatPanel.setStartMessageDone(true);
|
||||
ChatPanel usedPanel = chatPanel;
|
||||
if (chatPanel.getConnectedChat() != null) {
|
||||
usedPanel = chatPanel.getConnectedChat();
|
||||
}
|
||||
switch (usedPanel.getChatType()) {
|
||||
case GAME:
|
||||
usedPanel.receiveMessage("", "You may use hot keys to play faster: " + "" +
|
||||
"\nTurn Mousewheel - Show big image of card your mousepointer hovers over" +
|
||||
"\nF2 - Confirm \"Ok\", \"Yes\" or \"Done\" button" +
|
||||
"\nF4 - Skip current turn but stop on declare attackers" +
|
||||
"\nF9 - Skip everything until your next turn" +
|
||||
"\nF3 - Undo F4/F9", "", ChatMessage.MessageColor.ORANGE);
|
||||
break;
|
||||
case TOURNAMENT:
|
||||
usedPanel.receiveMessage("", "On this panel you can see the players, their state and the results of the games of the tournament. Also you can chat with the competitors of the tournament.", "", ChatMessage.MessageColor.ORANGE);
|
||||
break;
|
||||
case TABLES:
|
||||
usedPanel.receiveMessage("",
|
||||
"Download card images by using the \"Images\" menu to the top right ." +
|
||||
"\nDownload icons and symbols by using the \"Symbols\" menu to the top right.",
|
||||
"", ChatMessage.MessageColor.ORANGE);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return clientId;
|
||||
}
|
||||
|
|
|
@ -118,6 +118,7 @@ public class TablesPanel extends javax.swing.JPanel {
|
|||
tableTables.createDefaultColumnsFromModel();
|
||||
chatPanel.useExtendedView(ChatPanel.VIEW_MODE.NONE);
|
||||
chatPanel.setBorder(null);
|
||||
chatPanel.setChatType(ChatPanel.ChatType.TABLES);
|
||||
|
||||
JComponent[] components = new JComponent[] {chatPanel, jSplitPane1, jScrollPane1, jScrollPane2, jPanel1, jPanel3};
|
||||
for (JComponent component : components) {
|
||||
|
@ -798,7 +799,7 @@ class UpdateTablesTask extends SwingWorker<Void, Collection<TableView>> {
|
|||
if (tables != null) {
|
||||
this.publish(tables);
|
||||
}
|
||||
Thread.sleep(1000);
|
||||
Thread.sleep(3000);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -86,6 +86,7 @@ public class TournamentPanel extends javax.swing.JPanel {
|
|||
tableMatches.createDefaultColumnsFromModel();
|
||||
|
||||
chatPanel1.useExtendedView(ChatPanel.VIEW_MODE.NONE);
|
||||
chatPanel1.setChatType(ChatPanel.ChatType.TOURNAMENT);
|
||||
|
||||
Action action = new AbstractAction()
|
||||
{
|
||||
|
|
|
@ -47,6 +47,10 @@ public class AudioManager {
|
|||
audioManager.onHover = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnHover.wav");
|
||||
|
||||
audioManager.playerJoinedTable = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerJoinedTable.wav");
|
||||
audioManager.playerSubmittedDeck = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerSubmittedDeck.wav");
|
||||
audioManager.playerLeft = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLeft.wav");
|
||||
audioManager.playerWon = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerWon.wav");
|
||||
audioManager.playerLost = audioManager.loadClip(Constants.BASE_SOUND_PATH + "OnPlayerLost.wav");
|
||||
}
|
||||
return audioManager;
|
||||
}
|
||||
|
@ -123,6 +127,22 @@ public class AudioManager {
|
|||
checkAndPlayClip(getManager().playerJoinedTable);
|
||||
}
|
||||
|
||||
public static void playPlayerSubmittedDeck() {
|
||||
checkAndPlayClip(getManager().playerSubmittedDeck);
|
||||
}
|
||||
|
||||
public static void playPlayerLeft() {
|
||||
checkAndPlayClip(getManager().playerLeft);
|
||||
}
|
||||
|
||||
public static void playPlayerLost() {
|
||||
checkAndPlayClip(getManager().playerLost);
|
||||
}
|
||||
|
||||
public static void playPlayerWon() {
|
||||
checkAndPlayClip(getManager().playerWon);
|
||||
}
|
||||
|
||||
private static void checkAndPlayClip(Clip clip) {
|
||||
try {
|
||||
if (clip != null) {
|
||||
|
@ -186,4 +206,8 @@ public class AudioManager {
|
|||
private Clip onHover = null;
|
||||
|
||||
private Clip playerJoinedTable = null;
|
||||
private Clip playerSubmittedDeck = null;
|
||||
private Clip playerLeft = null;
|
||||
private Clip playerWon = null;
|
||||
private Clip playerLost = null;
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import java.util.GregorianCalendar;
|
|||
import java.util.List;
|
||||
import mage.cards.repository.ExpansionInfo;
|
||||
import mage.cards.repository.ExpansionRepository;
|
||||
import mage.constants.SetType;
|
||||
|
||||
/**
|
||||
* Utility class for constructed formats (expansions and other editions).
|
||||
|
@ -15,8 +16,14 @@ import mage.cards.repository.ExpansionRepository;
|
|||
*/
|
||||
public class ConstructedFormats {
|
||||
|
||||
public static final String ALL = "- All Sets";
|
||||
public static final String STANDARD = "- Standard";
|
||||
public static final String EXTENDED = "- Extended";
|
||||
public static final String MODERN = "- Modern";
|
||||
|
||||
private static final String[] constructedFormats = {
|
||||
"- All Sets", "- Standard", "- Extended", "- Modern",
|
||||
ALL, STANDARD, EXTENDED, MODERN,
|
||||
"* Theros Block", "Theros",
|
||||
"Magic 2014",
|
||||
"Modern Masters",
|
||||
"* Return to Ravnica Block", "Dragon's Maze", "Gatecrash", "Return to Ravnica",
|
||||
|
@ -44,6 +51,7 @@ public class ConstructedFormats {
|
|||
"Homelands", "Fallen Empires", "The Dark", "Legends", "Antiquities", "Arabian Nights",
|
||||
"Revised Edition", "Unlimited Edition", "Limited Edition Beta", "Limited Edition Alpha",
|
||||
"Guru",
|
||||
"Duel Decks: Heroes vs. Monsters",
|
||||
"Duel Decks: Elspeth vs. Tezzeret"
|
||||
};
|
||||
|
||||
|
@ -59,7 +67,13 @@ public class ConstructedFormats {
|
|||
}
|
||||
|
||||
public static List<String> getSetsByFormat(String format) {
|
||||
|
||||
|
||||
if (format.equals("* Theros Block")) {
|
||||
return Arrays.asList("THS");
|
||||
}
|
||||
if (format.equals("Theros")) {
|
||||
return Arrays.asList("THS");
|
||||
}
|
||||
if (format.equals("Arabian Nights")) {
|
||||
return Arrays.asList("ARN");
|
||||
}
|
||||
|
@ -369,14 +383,17 @@ public class ConstructedFormats {
|
|||
if (format.equals("Duel Decks: Elspeth vs. Tezzeret")) {
|
||||
return Arrays.asList("DDF");
|
||||
}
|
||||
if (format.equals("Duel Decks: Heroes vs. Monsters")) {
|
||||
return Arrays.asList("DDL");
|
||||
}
|
||||
|
||||
if (format.equals("- Standard")) {
|
||||
if (format.equals(STANDARD)) {
|
||||
return standard;
|
||||
}
|
||||
if (format.equals("- Extended")) {
|
||||
if (format.equals(EXTENDED)) {
|
||||
return extended;
|
||||
}
|
||||
if (format.equals("- Modern")) {
|
||||
if (format.equals(MODERN)) {
|
||||
return modern;
|
||||
}
|
||||
return all;
|
||||
|
@ -384,20 +401,22 @@ public class ConstructedFormats {
|
|||
|
||||
private static void buildLists() {
|
||||
for (ExpansionInfo set : ExpansionRepository.instance.getAll()) {
|
||||
if (set.getReleaseDate().after(standardDate)) {
|
||||
standard.add(set.getCode());
|
||||
}
|
||||
if (set.getReleaseDate().after(extendedDate)) {
|
||||
extended.add(set.getCode());
|
||||
}
|
||||
if (set.getReleaseDate().after(modernDate)) {
|
||||
modern.add(set.getCode());
|
||||
if (!set.getType().equals(SetType.REPRINT)) {
|
||||
if (set.getReleaseDate().after(standardDate)) {
|
||||
standard.add(set.getCode());
|
||||
}
|
||||
if (set.getReleaseDate().after(extendedDate)) {
|
||||
extended.add(set.getCode());
|
||||
}
|
||||
if (set.getReleaseDate().after(modernDate)) {
|
||||
modern.add(set.getCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final List<String> standard = new ArrayList<String>();
|
||||
private static final Date standardDate = new GregorianCalendar(2011, 9, 29).getTime();
|
||||
private static final Date standardDate = new GregorianCalendar(2012, 9, 28).getTime();
|
||||
|
||||
private static final List<String> extended = new ArrayList<String>();
|
||||
private static final Date extendedDate = new GregorianCalendar(2009, 8, 20).getTime();
|
||||
|
|
|
@ -19,6 +19,7 @@ import org.mage.plugins.card.constants.Constants;
|
|||
import org.mage.plugins.card.dl.DownloadGui;
|
||||
import org.mage.plugins.card.dl.DownloadJob;
|
||||
import org.mage.plugins.card.dl.Downloader;
|
||||
import org.mage.plugins.card.dl.sources.DirectLinksForDownload;
|
||||
import org.mage.plugins.card.dl.sources.GathererSets;
|
||||
import org.mage.plugins.card.dl.sources.GathererSymbols;
|
||||
import org.mage.plugins.card.images.ImageCache;
|
||||
|
@ -444,6 +445,11 @@ public class CardPluginImpl implements CardPlugin {
|
|||
g.getDownloader().add(job);
|
||||
}
|
||||
|
||||
it = new DirectLinksForDownload(imagesPath);
|
||||
for(DownloadJob job:it) {
|
||||
g.getDownloader().add(job);
|
||||
}
|
||||
|
||||
JDialog d = new JDialog((Frame) null, "Download pictures", false);
|
||||
d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
||||
d.addWindowListener(new WindowAdapter() {
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
* GathererSymbols.java
|
||||
*
|
||||
* Created on 25.08.2010
|
||||
*/
|
||||
|
||||
package org.mage.plugins.card.dl.sources;
|
||||
|
||||
|
||||
import com.google.common.collect.AbstractIterator;
|
||||
import org.mage.plugins.card.dl.DownloadJob;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
|
||||
import static java.lang.String.format;
|
||||
import static org.mage.plugins.card.dl.DownloadJob.fromURL;
|
||||
import static org.mage.plugins.card.dl.DownloadJob.toFile;
|
||||
|
||||
|
||||
/**
|
||||
* Used when we need to point to direct links to download resources from.
|
||||
*
|
||||
* @author noxx
|
||||
*/
|
||||
public class DirectLinksForDownload implements Iterable<DownloadJob> {
|
||||
|
||||
private static final String backsideUrl = "http://upload.wikimedia.org/wikipedia/en/a/aa/Magic_the_gathering-card_back.jpg";
|
||||
|
||||
private static final Map<String, String> directLinks = new LinkedHashMap<String, String>();
|
||||
|
||||
public static final String cardbackFilename = "cardback.jpg";
|
||||
|
||||
static {
|
||||
directLinks.put(cardbackFilename, backsideUrl);
|
||||
}
|
||||
|
||||
private static final String DEFAULT_IMAGES_PATH = File.separator + "default";
|
||||
private static final File DEFAULT_OUT_DIR = new File("plugins" + File.separator + "images" + DEFAULT_IMAGES_PATH);
|
||||
public static File outDir = DEFAULT_OUT_DIR;
|
||||
|
||||
public DirectLinksForDownload(String path) {
|
||||
if (path == null) {
|
||||
useDefaultDir();
|
||||
} else {
|
||||
changeOutDir(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<DownloadJob> iterator() {
|
||||
ArrayList<DownloadJob> jobs = new ArrayList<DownloadJob>();
|
||||
|
||||
for (Map.Entry<String, String> url : directLinks.entrySet()) {
|
||||
File dst = new File(outDir, url.getKey());
|
||||
jobs.add(new DownloadJob(url.getKey(), fromURL(url.getValue()), toFile(dst)));
|
||||
}
|
||||
return jobs.iterator();
|
||||
}
|
||||
|
||||
private void changeOutDir(String path) {
|
||||
File file = new File(path + DEFAULT_IMAGES_PATH);
|
||||
if (file.exists()) {
|
||||
outDir = file;
|
||||
} else {
|
||||
file.mkdirs();
|
||||
if (file.exists()) {
|
||||
outDir = file;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void useDefaultDir() {
|
||||
outDir = DEFAULT_OUT_DIR;
|
||||
}
|
||||
}
|
|
@ -33,14 +33,15 @@ public class GathererSets implements Iterable<DownloadJob> {
|
|||
"SHM", "EVE"};
|
||||
|
||||
private static final String[] withMythics = {"M10", "M11", "M12", "M13", "M14",
|
||||
"DDF",
|
||||
"DDF", "DDL",
|
||||
"ALA", "CON", "ARB",
|
||||
"ZEN", "WWK", "ROE",
|
||||
"SOM", "MBS", "NPH",
|
||||
"CMD", "PC2",
|
||||
"ISD", "DKA", "AVR",
|
||||
"RTR", "GTC", "DGM",
|
||||
"MMA" };
|
||||
"MMA",
|
||||
"THS"};
|
||||
private static final HashMap<String, String> symbolsReplacements = new HashMap<String, String>();
|
||||
|
||||
static {
|
||||
|
|
|
@ -16,7 +16,9 @@ public class MagicCardsImageSource implements CardImageSource {
|
|||
private static final Map<String, String> setNameReplacement = new HashMap<String, String>() {
|
||||
|
||||
{
|
||||
put("THS", "theros");
|
||||
put("M14", "magic-2014");
|
||||
put("DDL", "duel-decks-heroes-vs-monsters");
|
||||
put("MMA", "modern-masters");
|
||||
put("DGM", "dragons-maze");
|
||||
put("GTC", "gatecrash");
|
||||
|
|
|
@ -29,6 +29,7 @@ public class WizardCardsImageSource implements CardImageSource {
|
|||
public WizardCardsImageSource() {
|
||||
sets = new HashMap<String, Map<String, String>>();
|
||||
setsAliases = new HashMap<String, String>();
|
||||
setsAliases.put("THS", "theros/cig");
|
||||
setsAliases.put("M14", "magic2014coreset/cig");
|
||||
setsAliases.put("MMA", "modernmasters/cig");
|
||||
setsAliases.put("DGM", "dragonsmaze/cig");
|
||||
|
|
|
@ -18,6 +18,7 @@ public class CardDownloadData {
|
|||
private boolean flippedSide;
|
||||
private boolean splitCard;
|
||||
private boolean usesVariousArt;
|
||||
private boolean isType2;
|
||||
|
||||
public CardDownloadData(String name, String set, Integer collectorId, boolean usesVariousArt, Integer type) {
|
||||
this(name, set, collectorId, usesVariousArt, type, false);
|
||||
|
@ -76,6 +77,9 @@ public class CardDownloadData {
|
|||
if (this.secondSide != other.secondSide) {
|
||||
return false;
|
||||
}
|
||||
if (this.isType2 != other.isType2) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -89,6 +93,7 @@ public class CardDownloadData {
|
|||
hash = 47 * hash + (this.token ? 1 : 0);
|
||||
hash = 47 * hash + (this.twoFacedCard ? 1 : 0);
|
||||
hash = 47 * hash + (this.secondSide ? 1 : 0);
|
||||
hash = 47 * hash + (this.isType2 ? 1 : 0);
|
||||
return hash;
|
||||
}
|
||||
|
||||
|
@ -167,4 +172,12 @@ public class CardDownloadData {
|
|||
public void setFlippedSide(boolean flippedSide) {
|
||||
this.flippedSide = flippedSide;
|
||||
}
|
||||
|
||||
public boolean isType2() {
|
||||
return isType2;
|
||||
}
|
||||
|
||||
public void setType2(boolean type2) {
|
||||
isType2 = type2;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import de.schlichtherle.truezip.file.TVFS;
|
|||
import de.schlichtherle.truezip.fs.FsSyncException;
|
||||
import mage.cards.repository.CardInfo;
|
||||
import mage.client.dialog.PreferencesDialog;
|
||||
import mage.client.util.sets.ConstructedFormats;
|
||||
import mage.remote.Connection;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.mage.plugins.card.constants.Constants;
|
||||
|
@ -31,10 +32,7 @@ import java.io.*;
|
|||
import java.net.InetSocketAddress;
|
||||
import java.net.Proxy;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
|
@ -47,6 +45,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
private JButton startDownloadButton;
|
||||
private int cardIndex;
|
||||
private ArrayList<CardDownloadData> cards;
|
||||
private ArrayList<CardDownloadData> type2cards;
|
||||
private JComboBox jComboBox1;
|
||||
private JLabel jLabel1;
|
||||
private static boolean offlineMode = false;
|
||||
|
@ -164,15 +163,24 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
bar.setPreferredSize(d);
|
||||
|
||||
p0.add(Box.createVerticalStrut(5));
|
||||
checkBox = new JCheckBox("Download for current game only.");
|
||||
checkBox = new JCheckBox("Download images for Standard (Type2) only");
|
||||
p0.add(checkBox);
|
||||
p0.add(Box.createVerticalStrut(5));
|
||||
checkBox.setEnabled(!offlineMode);
|
||||
|
||||
checkBox.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
int count = DownloadPictures.this.cards.size();
|
||||
ArrayList<CardDownloadData> cardsToDownload = DownloadPictures.this.cards;
|
||||
if (checkBox.isSelected()) {
|
||||
DownloadPictures.this.type2cards = new ArrayList<CardDownloadData>();
|
||||
for (CardDownloadData data : DownloadPictures.this.cards) {
|
||||
if (data.isType2() || data.isToken()) {
|
||||
DownloadPictures.this.type2cards.add(data);
|
||||
}
|
||||
}
|
||||
cardsToDownload = DownloadPictures.this.type2cards;
|
||||
}
|
||||
int count = cardsToDownload.size();
|
||||
float mb = (count * cardImageSource.getAverageSize()) / 1024;
|
||||
bar.setString(String.format(cardIndex == count ? "%d of %d cards finished! Please close!"
|
||||
: "%d of %d cards finished! Please wait! [%.1f Mb]", 0, count, mb));
|
||||
|
@ -213,6 +221,12 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
ArrayList<CardDownloadData> allCardsUrls = new ArrayList<CardDownloadData>();
|
||||
HashSet<String> ignoreUrls = SettingsManager.getIntance().getIgnoreUrls();
|
||||
|
||||
/**
|
||||
* get filter for Standard Type 2 cards
|
||||
*/
|
||||
Set<String> type2SetsFilter = new HashSet<String>();
|
||||
type2SetsFilter.addAll(ConstructedFormats.getSetsByFormat(ConstructedFormats.STANDARD));
|
||||
|
||||
try {
|
||||
offlineMode = true;
|
||||
|
||||
|
@ -228,6 +242,10 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
url.setFlipCard(card.isFlipCard());
|
||||
url.setSplitCard(card.isSplitCard());
|
||||
|
||||
if (type2SetsFilter.contains(card.getSetCode())) {
|
||||
url.setType2(true);
|
||||
}
|
||||
|
||||
allCardsUrls.add(url);
|
||||
if (card.isDoubleFaced()) {
|
||||
if (card.getSecondSideName() == null || card.getSecondSideName().trim().isEmpty()) {
|
||||
|
@ -355,6 +373,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
|
||||
@Override
|
||||
public void run() {
|
||||
this.cardIndex = 0;
|
||||
|
||||
File base = new File(Constants.IO.imageBaseDir);
|
||||
if (!base.exists()) {
|
||||
|
@ -384,11 +403,14 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
if (p != null) {
|
||||
HashSet<String> ignoreUrls = SettingsManager.getIntance().getIgnoreUrls();
|
||||
|
||||
update(0);
|
||||
for (int i = 0; i < cards.size() && !cancel; i++) {
|
||||
ArrayList<CardDownloadData> cardsToDownload = this.checkBox.isSelected() ? type2cards : cards;
|
||||
|
||||
update(0, cardsToDownload.size());
|
||||
|
||||
for (int i = 0; i < cardsToDownload.size() && !cancel; i++) {
|
||||
try {
|
||||
|
||||
CardDownloadData card = cards.get(i);
|
||||
CardDownloadData card = cardsToDownload.get(i);
|
||||
|
||||
log.info("Downloading card: " + card.getName() + " (" + card.getSet() + ")");
|
||||
|
||||
|
@ -403,11 +425,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
}
|
||||
|
||||
if (url != null) {
|
||||
Runnable task = new DownloadTask(card, new URL(url));
|
||||
Runnable task = new DownloadTask(card, new URL(url), cardsToDownload.size());
|
||||
executor.execute(task);
|
||||
} else {
|
||||
synchronized (sync) {
|
||||
update(cardIndex + 1);
|
||||
update(cardIndex + 1, cardsToDownload.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -438,10 +460,12 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
|
||||
private CardDownloadData card;
|
||||
private URL url;
|
||||
private int count;
|
||||
|
||||
public DownloadTask(CardDownloadData card, URL url) {
|
||||
public DownloadTask(CardDownloadData card, URL url, int count) {
|
||||
this.card = card;
|
||||
this.url = url;
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -460,7 +484,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
if (existingFile.exists()) {
|
||||
new TFile(existingFile).cp_rp(outputFile);
|
||||
synchronized (sync) {
|
||||
update(cardIndex + 1);
|
||||
update(cardIndex + 1, count);
|
||||
}
|
||||
existingFile.delete();
|
||||
File parent = existingFile.getParentFile();
|
||||
|
@ -518,7 +542,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
}
|
||||
|
||||
synchronized (sync) {
|
||||
update(cardIndex + 1);
|
||||
update(cardIndex + 1, count);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -543,9 +567,8 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
|||
}
|
||||
}
|
||||
|
||||
private void update(int card) {
|
||||
private void update(int card, int count) {
|
||||
this.cardIndex = card;
|
||||
int count = DownloadPictures.this.cards.size();
|
||||
|
||||
if (cardIndex < count) {
|
||||
float mb = ((count - card) * cardImageSource.getAverageSize()) / 1024;
|
||||
|
|
|
@ -11,11 +11,13 @@ import mage.client.dialog.PreferencesDialog;
|
|||
import mage.view.CardView;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.mage.plugins.card.constants.Constants;
|
||||
import org.mage.plugins.card.dl.sources.DirectLinksForDownload;
|
||||
import org.mage.plugins.card.utils.CardImageUtils;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
@ -77,6 +79,9 @@ public class ImageCache {
|
|||
if (collectorId == 0) {
|
||||
info.setToken(true);
|
||||
path = CardImageUtils.generateTokenImagePath(info);
|
||||
if (path == null) {
|
||||
path = DirectLinksForDownload.outDir + File.separator + DirectLinksForDownload.cardbackFilename;
|
||||
}
|
||||
} else {
|
||||
path = CardImageUtils.generateImagePath(info);
|
||||
}
|
||||
|
|
|
@ -158,7 +158,11 @@ public class CardInfoPaneImpl extends JEditorPane implements CardInfoPane {
|
|||
|
||||
buffer.append("<table cellspacing=0 cellpadding=0 border=0 width='100%' valign='bottom'><tr><td><b>");
|
||||
buffer.append(pt).append("</b></td>");
|
||||
buffer.append("<td align='right'>").append(card.getMageObjectType().toString()).append("</td>");
|
||||
buffer.append("<td align='right'>");
|
||||
if (!card.isControlledByOwner()) {
|
||||
buffer.append("[only controlled] ");
|
||||
}
|
||||
buffer.append(card.getMageObjectType().toString()).append("</td>");
|
||||
buffer.append("</tr></table>");
|
||||
|
||||
StringBuilder rule = new StringBuilder("<br/>");
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue