Merge pull request #1 from magefree/master

update my cloned repo
This commit is contained in:
cbt33 2013-10-10 18:00:48 -07:00
commit 5a65e729c2
1297 changed files with 49758 additions and 3771 deletions

2
.gitignore vendored
View file

@ -1,6 +1,7 @@
syntax: glob
Mage.Client/*.dck
Mage.Client/db
Mage.Client/gamelogs
Mage.Client/mageclient.log
Mage.Client/plugins/images
Mage.Client/plugins/plugin.data
@ -23,6 +24,7 @@ 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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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) {

View file

@ -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> {

View file

@ -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>

View file

@ -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();
}
}

View file

@ -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();
}

View file

@ -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();
}

View file

@ -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 {

View file

@ -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");

View file

@ -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")) {
@ -316,7 +326,10 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
}
}
}
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());
}
}
}

View file

@ -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();

View file

@ -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;
}

View file

@ -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);

View file

@ -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();
}
}

View file

@ -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>

View file

@ -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);

View file

@ -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

View file

@ -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"/>

View file

@ -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;
}

View file

@ -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 &quot;../Mage.Client/gamelogs/&quot; 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>

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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()
{

View file

@ -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;
}

View file

@ -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"
};
@ -60,6 +68,12 @@ 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();

View file

@ -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() {

View file

@ -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;
}
}

View file

@ -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 {

View file

@ -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");

View file

@ -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");

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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