diff --git a/.gitattributes b/.gitattributes index a5f27c27e36..c8947d8a722 100644 --- a/.gitattributes +++ b/.gitattributes @@ -58,6 +58,7 @@ res/quest/common.txt -text svneol=native#text/plain res/quest/easy.txt -text svneol=native#text/plain res/quest/hard.txt -text svneol=native#text/plain res/quest/medium.txt -text svneol=native#text/plain +res/quest/price.txt -text svneol=native#text/plain res/quest/quest.properties svneol=native#text/plain res/quest/questData -text svneol=unset#unset res/quest/rare.txt -text svneol=native#text/plain @@ -99,6 +100,7 @@ src/forge/CardFilter.java -text svneol=native#text/plain src/forge/CardList.java svneol=native#text/plain src/forge/CardListFilter.java svneol=native#text/plain src/forge/CardListUtil.java svneol=native#text/plain +src/forge/CardShopTableModel.java -text svneol=native#text/plain src/forge/CardUtil.java svneol=native#text/plain src/forge/Combat.java svneol=native#text/plain src/forge/CombatPlaneswalker.java svneol=native#text/plain @@ -153,6 +155,7 @@ src/forge/GuiDisplay3.java -text svneol=native#text/plain src/forge/GuiDisplayUtil.java svneol=native#text/plain src/forge/GuiInput.java svneol=native#text/plain src/forge/Gui_BoosterDraft.java svneol=native#text/plain +src/forge/Gui_CardShop.java -text svneol=native#text/plain src/forge/Gui_DeckEditor.java -text svneol=native#text/plain src/forge/Gui_DeckEditorNew.java -text svneol=native#text/plain src/forge/Gui_DeckEditor_Menu.java svneol=native#text/plain @@ -233,6 +236,7 @@ src/forge/QuestData_BoosterPack.java svneol=native#text/plain src/forge/QuestData_State.java svneol=native#text/plain src/forge/ReadBoosterPack.java svneol=native#text/plain src/forge/ReadCard.java svneol=native#text/plain +src/forge/ReadPriceList.java -text svneol=native#text/plain src/forge/Run.java svneol=native#text/plain src/forge/RunTest.java svneol=native#text/plain src/forge/SimpleCombat.java svneol=native#text/plain diff --git a/res/quest/price.txt b/res/quest/price.txt new file mode 100644 index 00000000000..3decfa1103d --- /dev/null +++ b/res/quest/price.txt @@ -0,0 +1,2851 @@ +AEther Membrane =50 +AEther Spellbomb =10 +AEther Vial =50 +AEther Web =10 +AEtherflame Wall =10 +Abbey Gargoyles =50 +Abomination =50 +Absolute Grace =50 +Absolute Law =50 +Absorb =200 +Absorb Vis =10 +Abyssal Hunter =200 +Academy Rector =200 +Academy Ruins =200 +Accelerate =10 +Accelerated Mutation =10 +Accumulated Knowledge =10 +Acolyte of Xathrid =10 +Acorn Harvest =10 +Acridian =10 +Act of Treason =50 +Adarkar Sentinel =50 +Adarkar Valkyrie =200 +Adun Oakenshield =200 +Advance Scout =10 +Advanced Hoverguard =10 +Aesthir Glider =10 +Agent of Stromgald =10 +Aggressive Urge =10 +Air Elemental =50 +Airborne Aid =10 +Ajani Goldmane =200 +Ajani Vengeant =200 +Akki Drillmaster =10 +Akoum Refuge =50 +Akrasan Squire =10 +Akroma's Vengeance =200 +Akroma, Angel of Fury =200 +Akroma, Angel of Wrath =200 +Alaborn Grenadier =10 +Alaborn Musketeer =10 +Alaborn Trooper =10 +Aladdin's Ring =200 +Albino Troll =50 +Alert Shu Infantry =50 +Ali from Cairo =200 +Alley Grifters =10 +Allied Strategies =50 +Alpha Myr =10 +Aluren =200 +Ambassador Laquatus =200 +Ambassador Oak =10 +Ambition's Cost =50 +Ambush Party =10 +Amnesia =50 +Amrou Scout =10 +Amrou Seekers =10 +Amulet of Vigor =200 +An-Havva Township =50 +Anaba Bodyguard =10 +Anaba Shaman =10 +Anaconda =50 +Anarchist =10 +Ancestral Recall =110000 +Ancient Craving =200 +Ancient Den =10 +Ancient Silverback =200 +Ancient Spider =200 +Angel of Despair =200 +Angel of Light =50 +Angel of Mercy =50 +Angel of Retribution =200 +Angelfire Crusader =10 +Angelic Blessing =10 +Angelic Curator =10 +Angelic Wall =10 +Angelsong =10 +Anger =50 +Animate Dead =50 +Animate Land =50 +Annihilate =50 +Anodet Lurker =10 +Anowon, the Ruin Sage =200 +Ant Queen =200 +Antler Skulkin =10 +Anurid Murkdiver =10 +Apex Hawks =10 +Apprentice Wizard =10 +Araba Mothrider =10 +Arachnoid =50 +Arashi, the Sky Asunder =200 +Arcane Sanctum =50 +Arcanis the Omnipotent =200 +Arcbound Bruiser =10 +Arcbound Hybrid =10 +Arcbound Lancer =50 +Arcbound Slith =50 +Arcbound Stinger =10 +Arcbound Worker =10 +Archangel =200 +Archivist =200 +Archon of Justice =200 +Arctic Flats =50 +Arctic Nishoba =50 +Arctic Wolves =50 +Ardent Militia =10 +Ardent Plea =50 +Argothian Enchantress =200 +Argothian Swine =10 +Arid Mesa =200 +Armadillo Cloak =10 +Armageddon =200 +Armistice =200 +Armored Galleon =50 +Armored Griffin =50 +Armored Guardian =200 +Armored Pegasus =10 +Armorer Guildmage =10 +Arnjlot's Ascent =10 +Arrogant Vampire =50 +Ascending Aven =10 +Asha's Favor =10 +Ashcoat Bear =10 +Ashen Monstrosity =50 +Ashen-Skin Zubera =10 +Ashenmoor Cohort =10 +Ashenmoor Gouger =50 +Ashes to Ashes =200 +Ashnod's Transmogrant =10 +Aspect of Mongoose =50 +Assault Zeppelid =10 +Assembly-Worker =50 +Augury Adept =200 +Aura Blast =10 +Auramancer =10 +Auriok Bladewarden =50 +Avalanche Riders =50 +Aven Brigadier =200 +Aven Cloudchaser =10 +Aven Envoy =10 +Aven Fisher =10 +Aven Flock =10 +Aven Riftwatcher =10 +Aven Smokeweaver =50 +Aven Squire =10 +Aven Trailblazer =10 +Avenger of Zendikar =200 +Avian Changeling =10 +Axegrinder Giant =10 +Aysen Abbey =50 +Ayumi, the Last Visitor =200 +Azimaet Drake =10 +Azorius Chancery =10 +Azorius First-Wing =10 +Azorius Signet =10 +Azure Drake =50 +Azusa, Lost but Seeking =200 +Bad Moon =200 +Badlands =200 +Balance =15000 +Balduvian Barbarians =10 +Balduvian Bears =10 +Ball Lightning =200 +Ballynock Cohort =10 +Ballynock Trapper =10 +Balshan Collaborator =50 +Baneslayer Angel =200 +Banishing Knack =10 +Bant Battlemage =50 +Bant Sureblade =10 +Barbarian General =50 +Barbarian Horde =10 +Barbary Apes =10 +Barbtooth Wurm =10 +Barkhide Mauler =10 +Barktooth Warbeard =50 +Barren Glory =200 +Barren Moor =10 +Barrenton Cragtreads =10 +Bartel Runeaxe =200 +Baru, Fist of Krosa =200 +Basalt Gargoyle =50 +Basalt Monolith =50 +Basilisk Collar =200 +Battering Craghorn =10 +Battering Sliver =10 +Battle Hurda =10 +Battle Mastery =50 +Battle Rampart =10 +Battle of Wits =200 +Battle-Mad Ronin =10 +Battlefield Percher =50 +Battlegate Mimic =10 +Battlegrace Angel =200 +Bay Falcon =10 +Bayou =200 +Bayou Dragonfly =10 +Bazaar of Baghdad =50 +Beacon of Creation =200 +Beacon of Destruction =200 +Beacon of Unrest =200 +Bear Cub =10 +Beast Attack =50 +Beastmaster Ascension =200 +Bee Sting =50 +Befoul =10 +Behemoth Sledge =50 +Belbe's Percher =10 +Belbe's Portal =200 +Belligerent Hatchling =50 +Beloved Chaplain =50 +Benalish Cavalry =10 +Benalish Heralds =50 +Benalish Knight =10 +Benalish Trapper =10 +Benthic Behemoth =200 +Berserkers of Blood Ridge =10 +Bestial Menace =50 +Biomantic Mastery =200 +Bird Maiden =10 +Birds of Paradise =200 +Bitterblossom =200 +Bituminous Blast =50 +Black Knight =50 +Black Lotus =120000 +Black Vise =50 +Blade Sliver =50 +Blade of the Sixth Pride =10 +Bladetusk Boar =10 +Blanchwood Treefolk =10 +Blasted Landscape =50 +Blastoderm =10 +Blaze =50 +Blazing Archon =200 +Blazing Specter =200 +Blight Sickle =10 +Blightning =10 +Blightspeaker =10 +Blind Phantasm =10 +Blinding Light =200 +Blinding Mage =10 +Blinkmoth Nexus =200 +Blistering Barrier =10 +Blistering Dieflyn =10 +Blistering Firecat =200 +Blizzard Elemental =200 +Bloated Toad =50 +Blockade Runner =10 +Blood Crypt =200 +Blood Knight =50 +Bloodbraid Elf =50 +Bloodcurdling Scream =50 +Bloodghast =200 +Bloodrock Cyclops =10 +Bloodstained Mire =200 +Bloodstone Cameo =50 +Blurred Mongoose =200 +Body of Jukai =50 +Bog Imp =10 +Bog Initiate =10 +Bog Raiders =10 +Bog Smugglers =10 +Bog Tatters =10 +Bog Wraith =50 +Boggart Birth Rite =10 +Boggart Harbinger =50 +Boggart Ram-Gang =50 +Boil =50 +Boiling Seas =50 +Bojuka Brigand =10 +Bonded Fetch =50 +Bone Saw =10 +Bonesplitter =10 +Bonesplitter Sliver =10 +Boomerang =10 +Border Guard =10 +Border Patrol =10 +Boreal Centaur =10 +Boreal Druid =10 +Boreal Griffin =10 +Boreal Shelf =50 +Boris Devilboon =200 +Boros Garrison =10 +Boros Guildmage =50 +Boros Recruit =10 +Boros Signet =10 +Boros Swiftblade =50 +Borrowing 100,000 Arrows =50 +Borrowing the East Wind =200 +Bottle Gnomes =50 +Bound in Silence =50 +Bounteous Kirin =200 +Braidwood Cup =50 +Brainbite =10 +Braingeyser =200 +Brainstorm =10 +Branchsnap Lorian =50 +Brave the Elements =0 +Brawn =50 +Breach =10 +Break Asunder =10 +Breath of Life =10 +Breath of Malfegor =10 +Breathstealer =10 +Breeding Pool =200 +Briarberry Cohort =10 +Briarhorn =50 +Bribery =200 +Bridge from Below =200 +Brilliant Halo =10 +Brilliant Plan =50 +Brimstone Dragon =200 +Bringer of the Blue Dawn =200 +Bringer of the Green Dawn =200 +Bringer of the White Dawn =200 +Brion Stoutarm =200 +Broodmate Dragon =200 +Brothers of Fire =10 +Brush With Death =10 +Brute Force =10 +Bull Cerodon =50 +Bull Hippo =50 +Bull Rush =10 +Buoyancy =10 +Burning Cloak =10 +Burning Fields =10 +Burning Shield Askari =10 +Burst of Speed =10 +Cabal Coffers =50 +Cackling Flames =10 +Cackling Imp =10 +Cadaverous Knight =10 +Calciderm =50 +Caldera Hellion =200 +Call of the Herd =200 +Caller of Gales =10 +Caller of the Claw =50 +Callous Giant =200 +Cancel =10 +Canopy Spider =10 +Cantivore =200 +Canyon Minotaur =10 +Canyon Wildcat =10 +Cao Cao, Lord of Wei =200 +Cao Ren, Wei Commander =200 +Capashen Knight =10 +Capashen Templar =10 +Capashen Unicorn =10 +Capsize =10 +Captain Sisay =200 +Captain of the Watch =200 +Captive Flame =50 +Capture of Jingzhou =200 +Caravan Hurda =10 +Careful Study =10 +Caribou Range =200 +Carnassid =200 +Carnivorous Plant =10 +Carnophage =10 +Carrion Ants =50 +Carrion Wall =50 +Cartographer =10 +Carven Caryatid =50 +Cascade Bluffs =200 +Castle =50 +Castle Raptors =10 +Castle Sengir =50 +Cat Warriors =10 +Catalog =10 +Cateran Brute =10 +Cateran Enforcer =50 +Cateran Kidnappers =50 +Cateran Overlord =200 +Cateran Persuader =10 +Cateran Slaver =200 +Cathartic Adept =10 +Cavern Crawler =10 +Cavern Harpy =10 +Cavern Thoctar =10 +Celestial Colonnade =200 +Celestial Prism =50 +Celestial Purge =50 +Cemetery Gate =10 +Centaur Courser =10 +Centaur Glade =50 +Cephalid Broker =50 +Cephalid Looter =10 +Cerodon Yearling =10 +Cerulean Wyvern =50 +Cessation =10 +Ceta Disciple =10 +Chainer's Edict =50 +Chainer, Dementia Master =200 +Chambered Nautilus =50 +Chameleon Colossus =200 +Chandra Nalaar =200 +Changeling Berserker =50 +Changeling Hero =50 +Changeling Sentinel =10 +Changeling Titan =50 +Char =200 +Char-Rumbler =50 +Charcoal Diamond =50 +Charging Bandits =50 +Charging Slateback =10 +Charging Troll =50 +Chartooth Cougar =10 +Chatter of the Squirrel =10 +Child of Alara =200 +Child of Gaea =200 +Child of Night =10 +Chilling Apparition =50 +Chilling Shade =10 +Chittering Rats =10 +Cho-Manno, Revolutionary =200 +Chorus of Woe =10 +Chronatog =200 +Cinder Pyromancer =10 +Cinder Storm =50 +Cinderbones =10 +Citanul Centaurs =200 +Clay Statue =10 +Cleanfall =50 +Cleanse =200 +Clear =50 +Cliff Threader =10 +Cloak of Feathers =10 +Cloak of Mists =10 +Cloud Djinn =50 +Cloud Dragon =200 +Cloud Elemental =10 +Cloud Pirates =10 +Cloud Spirit =10 +Cloud Sprite =10 +Cloud of Faeries =10 +Cloudchaser Eagle =10 +Cloudcrown Oak =10 +Cloudheath Drake =10 +Cloudhoof Kirin =200 +Cloudseeder =50 +Coast Watcher =10 +Coastal Hornclaw =10 +Coastal Tower =50 +Cobalt Golem =10 +Coercion =10 +Cognivore =200 +Coiled Tinviper =10 +Cold-Eyed Selkie =200 +Collective Restraint =200 +Collective Unconscious =200 +Colos Yearling =10 +Colossal Might =10 +Commander Eesha =200 +Commune with Nature =10 +Composite Golem =50 +Compulsive Research =10 +Concentrate =50 +Concordant Crossroads =200 +Conqueror's Pledge =200 +Conspiracy =200 +Control Magic =50 +Control of the Court =50 +Convalescence =200 +Convalescent Care =200 +Convolute =10 +Copper Myr =10 +Coral Eel =10 +Coral Merfolk =10 +Corrupt =10 +Corrupt Court Official =50 +Corrupt Eunuchs =50 +Corrupt Official =200 +Cosmic Horror =200 +Council of Advisors =50 +Counsel of the Soratami =10 +Counterbalance =50 +Counterspell =50 +Courier Hawk =10 +Court Archers =10 +Cover of Darkness =200 +Covert Operative =10 +Covetous Dragon =200 +Crabapple Cohort =10 +Cradle Guard =50 +Cranial Extraction =200 +Crash of Rhinos =10 +Craven Giant =10 +Craven Knight =10 +Craw Wurm =10 +Crawling Filth =10 +Crazed Goblin =10 +Crazed Skirge =50 +Creeping Mold =50 +Creeping Tar Pit =200 +Crenellated Wall =50 +Crib Swap =50 +Crimson Acolyte =10 +Crimson Kobolds =10 +Cromat =200 +Crookshank Kobolds =10 +Crowd of Cinders =50 +Crucible of Fire =200 +Crude Rampart =50 +Cruel Bargain =200 +Cruel Edict =10 +Cruel Tutor =200 +Crumbling Necropolis =50 +Crusade =200 +Crush of Wurms =200 +Crypt Cobra =50 +Crypt Ripper =10 +Crypt of Agadeem =200 +Crystal Quarry =200 +Crystalline Sliver =50 +Cudgel Troll =50 +Culling Sun =200 +Cunning Lethemancer =200 +Cunning Sparkmage =50 +Cursed Land =50 +Cursed Ronin =10 +Cylian Elf =10 +Daggerclaw Imp =50 +Dakkon Blackblade =200 +Dakmor Bat =10 +Dakmor Ghoul =50 +Dakmor Scorpion =10 +Damnation =200 +Dance of Shadows =50 +Dancing Scimitar =50 +Dandan =10 +Dark Banishing =10 +Dark Confidant =200 +Dark Depths =200 +Dark Ritual =10 +Darkling Stalker =10 +Darklit Gargoyle =10 +Darkness =10 +Darksteel Citadel =10 +Darksteel Colossus =200 +Darksteel Gargoyle =50 +Darksteel Ingot =10 +Darkwatch Elves =50 +Darkwater Catacombs =200 +Daru Encampment =50 +Daru Lancer =10 +Dauntless Dourbark =200 +Dauthi Embrace =50 +Dauthi Ghoul =50 +Dauthi Marauder =10 +Dauthi Mercenary =50 +Dauthi Slayer =10 +Dauthi Trapper =50 +Day of Judgment =200 +Daze =10 +Deadly Grub =10 +Deadly Insect =10 +Deadly Recluse =10 +Death Grasp =200 +Death Speakers =10 +Death's Duet =10 +Death's Shadow =50 +Deathmark =50 +Debtors' Knell =200 +Deep Analysis =10 +Deep-Sea Serpent =50 +Deeptread Merrow =10 +Deepwood Tantiv =0 +Defender of Chaos =10 +Defender of Law =10 +Defense of the Heart =200 +Defiant Elf =10 +Defiant Falcon =10 +Deft Duelist =10 +Delirium Skeins =10 +Demigod of Revenge =200 +Demolish =10 +Demonic Tutor =50 +Demystify =10 +Deranged Hermit =200 +Desert Drake =50 +Desert Twister =50 +Desperate Charge =50 +Despondency =10 +Devastation =200 +Devoted Hero =10 +Devoted Retainer =10 +Devour in Shadow =50 +Devouring Deep =10 +Devout Lightcaster =200 +Diabolic Edict =10 +Diabolic Machine =50 +Diabolic Tutor =50 +Dimir Aqueduct =10 +Dimir Cutpurse =200 +Dimir Guildmage =50 +Dimir Infiltrator =10 +Dimir Signet =10 +Dingus Egg =200 +Dingus Staff =50 +Diplomatic Immunity =10 +Dirtwater Wraith =10 +Disciple of Grace =10 +Disciple of Kangee =10 +Disciple of Law =10 +Disciple of Malice =10 +Disenchant =10 +Disentomb =10 +Dismiss =50 +Distress =10 +Divination =10 +Diving Griffin =10 +Divinity of Pride =200 +Djinn of the Lamp =200 +Do or Die =200 +Donate =200 +Doom Blade =10 +Door to Nothingness =200 +Doran, the Siege Tower =200 +Dosan's Oldest Chant =10 +Double Cleave =10 +Doubling Season =200 +Douse in Gloom =10 +Dovescape =200 +Dragon Blood =50 +Dragon Broodmother =200 +Dragon Engine =200 +Dragon Fodder =10 +Dragon Roost =200 +Dragonmaster Outcast =200 +Dragonskull Summit =200 +Dragonstalker =50 +Drake Hatchling =10 +Drake-Skull Cameo =50 +Dreadwing =50 +Dream Cache =10 +Dream Stalker =10 +Dreg Reaver =10 +Drekavac =50 +Drelnoch =10 +Drift of Phantasms =10 +Drifter il-Dal =10 +Drifting Djinn =200 +Drifting Meadow =10 +Dripping-Tongue Zubera =10 +Dromad Purebred =10 +Dross Crocodile =10 +Dross Prowler =10 +Drove of Elves =50 +Drowned =10 +Drowned Catacomb =200 +Drudge Reavers =10 +Drudge Skeletons =10 +Druid of the Anima =10 +Dryad Arbor =50 +Dryad Sophisticate =50 +Duergar Cave-Guard =50 +Dunerider Outlaw =50 +Dungeon Shade =10 +Duress =10 +Durkwood Boars =10 +Dusk Imp =10 +Duskdale Wurm =50 +Duskmantle, House of Shadow =50 +Duskrider Falcon =10 +Dwarven Grunt =10 +Dwarven Pony =200 +Dwarven Trader =10 +Eager Cadet =10 +Earth Elemental =50 +Earthbind =10 +Earthcraft =200 +Earthquake =200 +Ebony Rhino =10 +Ebony Treefolk =50 +Echoing Courage =10 +Echoing Decay =10 +Echoing Truth =10 +Ekundu Griffin =10 +El-Hajjaj =200 +Eladamri's Call =200 +Eladamri, Lord of Leaves =200 +Eldrazi Monument =200 +Elephant Ambush =10 +Elfhame Palace =50 +Elite Cat Warrior =10 +Elite Vanguard =50 +Elspeth, Knight-Errant =200 +Elven Warhounds =200 +Elvish Aberration =50 +Elvish Archdruid =200 +Elvish Archers =200 +Elvish Champion =200 +Elvish Farmer =200 +Elvish Fury =10 +Elvish Harbinger =50 +Elvish Herder =10 +Elvish Hunter =10 +Elvish Lookout =10 +Elvish Piper =200 +Elvish Ranger =10 +Elvish Visionary =10 +Elvish Warrior =10 +Ember Shot =10 +Ember-Fist Zubera =10 +Emberstrike Duo =10 +Emerald Dragonfly =10 +Emerald Oryx =10 +Emeria Angel =200 +Emeria, the Sky Ruin =200 +Emmessi Tome =200 +Empty the Warrens =10 +Enchantress's Presence =200 +Enclave Elite =10 +Endless Cockroaches =200 +Energizer =200 +Engineered Plague =50 +Enlightened Tutor =50 +Enlisted Wurm =50 +Enormous Baloth =50 +Enrage =50 +Enslaved Scout =10 +Ensnare =50 +Entomb =200 +Epic Proportions =200 +Eron the Relentless =50 +Erratic Explosion =10 +Esper Cormorants =10 +Esper Stormblade =10 +Essence Scatter =10 +Essence Sliver =200 +Essence Warden =10 +Eternal Flame =200 +Eternal Witness =50 +Eternity Snare =10 +Ethercaste Knight =10 +Ethereal Usher =50 +Ethereal Whiskergill =50 +Ethersworn Adjudicator =200 +Evacuation =200 +Eviscerator =200 +Exalted Angel =200 +Exclude =10 +Execute =50 +Exhume =10 +Exotic Disease =50 +Exploration =200 +Expunge =10 +Eye of Nowhere =10 +Eyeblight's Ending =10 +Fable of Wolf and Owl =200 +Faceless Butcher =10 +Faerie Conclave =50 +Faerie Harbinger =50 +Faerie Swarm =50 +Fallen Angel =50 +Fallen Askari =10 +False Defeat =10 +False Summoning =10 +Fanatical Fever =50 +Fangren Hunter =10 +Fastbond =200 +Fault Line =200 +Fear =10 +Feast of Flesh =10 +Feast of the Unicorn =10 +Fecundity =50 +Feedback Bolt =50 +Felidar Sovereign =200 +Femeref Archers =50 +Femeref Enchantress =200 +Femeref Knight =10 +Femeref Scouts =10 +Feral Animist =50 +Feral Lightning =50 +Feral Shadow =10 +Ferocious Charge =10 +Fervent Charge =200 +Fervor =200 +Festival of Trokin =10 +Fetid Heath =200 +Fetid Horror =10 +Feudkiller's Verdict =200 +Field Marshal =200 +Fiery Fall =10 +Fiery Hellhound =10 +Fighting Drake =50 +Figure of Destiny =200 +Filigree Angel =200 +Filthy Cur =10 +Fire Ambush =10 +Fire Bowman =50 +Fire Diamond =50 +Fire Drake =50 +Fire Elemental =10 +Fire Imp =50 +Fire Sprites =10 +Fire-Belly Changeling =50 +Fire-Lit Thicket =200 +Firebolt =10 +Firefly =50 +Firescreamer =50 +Fireshrieker =50 +Fireslinger =10 +Firestorm Hellkite =200 +First Volley =10 +Fissure =10 +Fists of the Anvil =10 +Fit of Rage =10 +Flagstones of Trokair =200 +Flame Burst =10 +Flame Javelin =50 +Flame Jet =10 +Flame Rift =10 +Flame Spirit =50 +Flamebreak =200 +Flamecore Elemental =10 +Flamekin Brawler =10 +Flamekin Harbinger =50 +Flamekin Spitfire =50 +Flametongue Kavu =50 +Flamewave Invoker =10 +Fledgling Djinn =10 +Fledgling Mawcor =50 +Fleetfoot Panther =50 +Fleeting Image =200 +Flight =10 +Floating-Dream Zubera =10 +Flooded Grove =200 +Flooded Strand =200 +Flow of Ideas =50 +Flowstone Charger =50 +Flowstone Crusher =50 +Flowstone Giant =10 +Flowstone Hellion =50 +Flowstone Mauler =200 +Flowstone Overseer =200 +Flowstone Shambler =10 +Flowstone Strike =10 +Flowstone Thopter =50 +Flowstone Wall =10 +Flowstone Wyvern =200 +Flying Carpet =50 +Flying Men =10 +Fog =10 +Fog of Gnats =10 +Folk of the Pines =10 +Fomori Nomad =10 +Font of Mythos =200 +Foot Soldiers =10 +Foothill Guide =10 +Forbidding Watchtower =50 +Force Spike =10 +Force of Nature =200 +Force of Savagery =200 +Force of Will =50 +Forced Fruition =200 +Forest =0 +Forest Bear =10 +Forgotten Cave =10 +Forked-Branch Garami =50 +Foul Imp =10 +Foxfire Oak =10 +Freewind Falcon =10 +Fresh Volunteers =10 +Frontline Sage =10 +Frost Marsh =50 +Frost Ogre =10 +Frost Raptor =10 +Frostling =10 +Frostweb Spider =10 +Frozen AEther =50 +Frozen Shade =10 +Fugitive Wizard =10 +Funeral Charm =10 +Furnace Spirit =10 +Furnace Whelp =50 +Fury Sliver =50 +Fusion Elemental =50 +Fyndhorn Bow =50 +Fyndhorn Elder =50 +Fyndhorn Elves =10 +Gaddock Teeg =200 +Gaea's Anthem =200 +Gaea's Cradle =200 +Gaea's Might =10 +Gaea's Skyfolk =10 +Galina's Knight =10 +Game-Trail Changeling =10 +Gargoyle Castle =200 +Garruk Wildspeaker =200 +Garza Zol, Plague Queen =200 +Gatekeeper of Malakir =120 +Gelectrode =50 +Gemhide Sliver =10 +Gemstone Array =50 +Gerrard's Command =10 +Gerrard's Irregulars =10 +Gerrard's Verdict =50 +Ghastlord of Fugue =200 +Ghitu Encampment =50 +Ghitu War Cry =50 +Ghor-Clan Bloodscale =50 +Ghost Ship =50 +Ghost Warden =10 +Ghost-Lit Redeemer =50 +Ghostfire =10 +Ghostly Changeling =50 +Ghostly Prison =50 +Ghostly Visit =10 +Ghoul's Feast =50 +Giant Cockroach =10 +Giant Crab =10 +Giant Dustwasp =10 +Giant Growth =10 +Giant Harbinger =50 +Giant Mantis =10 +Giant Octopus =50 +Giant Scorpion =10 +Giant Solifuge =200 +Giant Spider =10 +Giant Strength =10 +Giant Warthog =10 +Gibbering Kami =10 +Gift of Estates =50 +Gilded Lotus =200 +Gilder Bairn =50 +Gilt-Leaf Archdruid =200 +Giltspire Avenger =200 +Glacial Fortress =200 +Glacial Wall =50 +Glass Golem =50 +Glimmering Angel =10 +Glimpse the Unthinkable =200 +Glint-Eye Nephilim =200 +Glintwing Invoker =10 +Global Ruin =200 +Gloomwidow =50 +Glorious Anthem =200 +Glorious Charge =10 +Glory Seeker =10 +Gluttonous Slime =50 +Gluttonous Zombie =50 +Gnarled Mass =10 +Gnarlid Pack =10 +Goblin Artillery =50 +Goblin Balloon Brigade =50 +Goblin Berserker =50 +Goblin Brigand =10 +Goblin Bully =10 +Goblin Burrows =50 +Goblin Cavaliers =10 +Goblin Charbelcher =200 +Goblin Chariot =10 +Goblin Chieftain =200 +Goblin Deathraiders =10 +Goblin General =50 +Goblin Glider =50 +Goblin Grenade =10 +Goblin Guide =200 +Goblin Hero =10 +Goblin King =200 +Goblin Lackey =50 +Goblin Lore =50 +Goblin Marshal =200 +Goblin Matron =10 +Goblin Mountaineer =10 +Goblin Offensive =50 +Goblin Outlander =10 +Goblin Patrol =10 +Goblin Piker =10 +Goblin Piledriver =200 +Goblin Raider =10 +Goblin Rimerunner =10 +Goblin Ringleader =50 +Goblin Roughrider =10 +Goblin Sharpshooter =200 +Goblin Sky Raider =10 +Goblin Skycutter =10 +Goblin Spelunkers =10 +Goblin Striker =10 +Goblin Trenches =200 +Goblin War Buggy =10 +Goblin War Paint =10 +Goblin War Strike =10 +Godless Shrine =200 +Gods' Eye, Gate to the Reikai =50 +Godsire =250 +Gold Myr =10 +Golden Bear =10 +Goldmeadow Dodger =10 +Goldmeadow Harrier =10 +Goldmeadow Lookout =50 +Golgari Rot Farm =10 +Golgari Signet =10 +Goliath Beetle =10 +Goliath Sphinx =200 +Goliath Spider =50 +Goretusk Firebeast =10 +Gorger Wurm =10 +Gorgon Flail =50 +Gorilla Chieftain =10 +Gorilla Warrior =10 +Granger Guildmage =10 +Granite Gargoyle =200 +Granite Shard =50 +Grappler Spider =10 +Gravedigger =10 +Gravelgill Axeshark =10 +Gravelgill Duo =10 +Graven Cairns =200 +Gray Ogre =10 +Graypelt Hunter =10 +Graypelt Refuge =50 +Grayscaled Gharial =10 +Great Furnace =10 +Great Sable Stag =200 +Greater Forgeling =50 +Greener Pastures =200 +Greenweaver Druid =50 +Griffin Sentinel =10 +Grim Monolith =200 +Grim Tutor =200 +Grinning Demon =200 +Grixis Battlemage =50 +Grixis Grimblade =10 +Grizzled Leotau =10 +Grizzly Bears =10 +Grizzly Fate =50 +Groundbreaker =200 +Gruul Signet =10 +Gruul Turf =10 +Guan Yu, Sainted Warrior =200 +Guardian of Cloverdell =50 +Guardians of Akrasa =10 +Guided Strike =10 +Guiltfeeder =200 +Guilty Conscience =10 +Guma =50 +Gush =10 +Guul Draz Specter =200 +Guul Draz Vampire =10 +Gwendlyn Di Corci =200 +Hada Freeblade =50 +Hagra Crocodile =10 +Halberdier =10 +Halcyon Glaze =50 +Hallowed Fountain =200 +Hammerfist Giant =200 +Hand of Cruelty =50 +Hand of Death =10 +Hand of Honor =50 +Hanna, Ship's Navigator =200 +Harabaz Druid =200 +Harmattan Efreet =50 +Harmonize =50 +Harvest Gwyllion =10 +Hatching Plans =200 +Haunted Angel =50 +Haunting Echoes =200 +Havenwood Wurm =10 +Hawkeater Moth =50 +Hazerider Drake =50 +Headhunter =50 +Headless Horseman =10 +Heart Sliver =10 +Hearthfire Hobgoblin =50 +Heartmender =200 +Heartwood Dryad =10 +Heartwood Shard =50 +Heartwood Treefolk =50 +Heat Ray =10 +Hedge Troll =50 +Hedron Crab =50 +Hedron Rover =10 +Helionaut =10 +Helix Pinnacle =200 +Hell-Bent Raider =200 +Helldozer =200 +Hellkite Overlord =200 +Hematite Golem =10 +Henchfiend of Ukor =10 +Henge Guardian =50 +Henge of Ramos =50 +Herald of Serra =200 +Hero's Demise =200 +Hero's Resolve =10 +Hex =200 +Hidetsugu's Second Rite =200 +Highland Berserker =10 +Highland Giant =10 +Highland Weald =50 +Highway Robber =10 +Hill Giant =10 +Hillcomber Giant =10 +Hoar Shade =10 +Hobgoblin Dragoon =10 +Hollow Dogs =10 +Holy Day =10 +Holy Strength =10 +Honden of Cleansing Fire =50 +Honden of Infinite Rage =50 +Honden of Life's Web =50 +Honden of Night's Reach =50 +Honden of Seeing Winds =50 +Honor Guard =10 +Honor of the Pure =200 +Hooded Kavu =10 +Hoofprints of the Stag =200 +Hopping Automaton =50 +Horde of Notions =200 +Horned Cheetah =50 +Horned Kavu =10 +Horned Sliver =50 +Horned Troll =10 +Horned Turtle =10 +Hornet Cobra =10 +Horseshoe Crab =10 +Hoverguard Observer =50 +Howl from Beyond =10 +Howl of the Night Pack =50 +Howling Fury =10 +Howling Mine =200 +Hulking Cyclops =50 +Hulking Goblin =10 +Hulking Ogre =10 +Humble Budoka =10 +Hundroog =10 +Hunger of the Nim =10 +Hungry Mist =10 +Hunted Dragon =200 +Hunted Horror =200 +Hunted Lammasu =200 +Hunted Phantasm =200 +Hunted Troll =200 +Hurloon Minotaur =10 +Hurricane =50 +Hush =10 +Hyalopterous Lemure =10 +Hymn to Tourach =10 +Hypnotic Specter =50 +Hystrodon =200 +Icatian Priest =50 +Icatian Scout =10 +Ice Storm =50 +Ichor Slick =10 +Icy Manipulator =50 +Identity Crisis =200 +Ifh-Biff Efreet =200 +Igneous Golem =50 +Igneous Pouncer =10 +Ihsan's Shade =50 +Illusionary Forces =10 +Illusionary Wall =10 +Illusions of Grandeur =200 +Immaculate Magistrate =10 +Imperial Edict =10 +Imperial Hellkite =200 +Imperial Recruiter =50 +Imperial Seal =200 +Imperiosaur =50 +Imperious Perfect =10 +Implode =50 +Impulse =10 +Incendiary Command =200 +Incurable Ogre =10 +Independent Troops =10 +Indomitable Ancients =200 +Indomitable Will =10 +Infernal Contract =200 +Infernal Kirin =200 +Infest =50 +Infiltrate =10 +Inkfathom Infiltrator =50 +Inkwell Leviathan =200 +Inner Calm, Outer Strength =10 +Inner-Chamber Guard =50 +Inner-Flame Acolyte =10 +Innocent Blood =10 +Inspiration =10 +Inspirit =50 +Intrepid Hero =200 +Intuition =200 +Invincible Hymn =200 +Iona, Shield of Emeria =200 +Ior Ruin Expedition =10 +Ire of Kaminari =10 +Iridescent Angel =200 +Iron Lance =50 +Iron Myr =10 +Iron Tusk Elephant =50 +Iron Will =10 +Iron-Barb Hellion =50 +Ironroot Treefolk =10 +Isamaru, Hound of Konda =200 +Island =0 +Isochron Scepter =50 +Ivory Tower =50 +Ivy Dancer =50 +Izzet Boilerworks =10 +Izzet Signet =10 +Jabari's Banner =50 +Jace Beleren =200 +Jace, the Mind Sculptor =200 +Jackal Pup =50 +Jacques le Vert =200 +Jagwasp Swarm =10 +Jalum Tome =50 +Jamuraan Lion =10 +Jasmine Boreal =50 +Jayemdae Tome =200 +Jedit Ojanen =50 +Jedit Ojanen of Efrava =200 +Jedit's Dragoons =10 +Jenara, Asura of War =200 +Jerrard of the Closed Fist =50 +Jeska, Warrior Adept =200 +Jhessian Infiltrator =50 +Jhessian Lookout =10 +Jhessian Zombies =10 +Jhovall Queen =200 +Jhovall Rider =50 +Jodah's Avenger =50 +Join the Ranks =10 +Joiner Adept =200 +Jokulhaups =200 +Jolrael's Centaur =10 +Joraga Bard =10 +Jovial Evil =200 +Jugan, the Rising Star =200 +Juggernaut =50 +Jukai Messenger =10 +Jump =10 +Jund Battlemage =50 +Jund Hackblade =10 +Jungle Barrier =50 +Jungle Lion =10 +Jungle Shrine =50 +Jungle Troll =50 +Jungle Weaver =10 +Junun Efreet =50 +Juvenile Gloomwidow =10 +Juzam Djinn =200 +Jwar Isle Refuge =50 +Kabira Crossroads =10 +Kabuto Moth =10 +Kaervek's Spite =200 +Kalonian Behemoth =200 +Kamahl, Pit Fighter =200 +Kami of Ancient Law =10 +Kami of Empty Graves =10 +Kami of Lunacy =50 +Kami of Old Stone =50 +Kami of the Palace Fields =50 +Kami of the Tended Garden =50 +Karakas =50 +Karmic Guide =200 +Karoo Meerkat =50 +Karplusan Strider =50 +Kasimir the Lone Wolf =50 +Kathari Remnant =50 +Kavu Climber =10 +Kavu Glider =10 +Kaysa =200 +Kazandu Blademaster =50 +Kazandu Refuge =50 +Kazuul Warlord =200 +Keen-Eyed Archers =10 +Keeneye Aven =10 +Keening Banshee =50 +Keeper of Kookus =10 +Keepers of the Faith =10 +Keiga, the Tide Star =200 +Keldon Vandals =10 +Kelinore Bat =10 +Kemuri-Onna =50 +Khalni Garden =10 +Kher Keep =200 +Kiki-Jiki, Mirror Breaker =200 +Killer Bees =50 +Killer Whale =50 +Kindle =10 +Kindled Fury =10 +King Cheetah =50 +Kinsbaile Borderguard =200 +Kinsbaile Cavalier =200 +Kird Ape =10 +Kismet =50 +Kiss of Death =50 +Kitchen Finks =50 +Kitesail =10 +Kithkin Harbinger =50 +Kithkin Rabble =50 +Kitsune Blademaster =10 +Kitsune Loreweaver =10 +Kjeldoran Gargoyle =50 +Kjeldoran Outrider =10 +Kjeldoran War Cry =10 +Klaas, Elf Friend =0 +Knight Errant =10 +Knight of Dawn =50 +Knight of Meadowgrain =50 +Knight of Stromgald =50 +Knight of the Reliquary =200 +Knight of the Skyward Eye =10 +Knight of the White Orchid =200 +Knighthood =50 +Knotvine Mystic =50 +Knotvine Paladin =200 +Kobold Overlord =200 +Kobolds of Kher Keep =10 +Kodama of the North Tree =200 +Kodama's Reach =10 +Kokusho, the Evening Star =200 +Konda, Lord of Eiganjo =200 +Kor Cartographer =10 +Kor Skyfisher =10 +Korlash, Heir to Blackblade =200 +Koskun Keep =50 +Kraken Hatchling =10 +Kranioceros =10 +Krosan Cloudscraper =200 +Krosan Colossus =200 +Krovikan Scoundrel =10 +Kuro's Taken =10 +Kyren Glider =10 +Lab Rats =10 +Lace with Moonglove =10 +Lady Orca =50 +Lady Zhurong, Warrior Queen =200 +Land Leeches =10 +Land Tax =50 +Lantern Kami =10 +Laquatus's Champion =200 +Last Caress =10 +Last Word =200 +Launch =10 +Lava Axe =10 +Lava Flow =50 +Lava Spike =10 +Lavalanche =200 +Lay Waste =10 +Leaden Myr =10 +Leaf Dancer =10 +Leaf Gilder =10 +Leaf-Crowned Elder =200 +Leafdrake Roost =50 +Leap =10 +Leaping Lizard =10 +Leatherback Baloth =50 +Legacy Weapon =200 +Leonin Scimitar =10 +Leonin Skyhunter =50 +Levitation =50 +Ley Druid =50 +Lhurgoyf =200 +Library of Alexandria =50 +Lich Lord of Unx =200 +Lichenthrope =200 +Life Burst =10 +Lifespark Spellbomb =10 +Lightkeeper of Emeria =50 +Lightning Angel =200 +Lightning Blast =10 +Lightning Bolt =10 +Lightning Dragon =200 +Lightning Elemental =10 +Lightning Greaves =50 +Lightning Helix =50 +Lightning Hounds =10 +Lightning Talons =10 +Lignify =10 +Liliana Vess =200 +Lim-Dul's High Guard =10 +Lingering Tormentor =50 +Lionheart Maverick =10 +Liu Bei, Lord of Shu =200 +Living Airship =10 +Living Death =200 +Living Wall =50 +Livonya Silone =200 +Lizard Warrior =10 +Llanowar Behemoth =50 +Llanowar Cavalry =10 +Llanowar Dead =10 +Llanowar Elves =10 +Llanowar Knight =10 +Llanowar Mentor =50 +Loam Lion =50 +Loamdragger Giant =10 +Lobotomy =50 +Loch Korrigan =10 +Lockjaw Snapper =50 +Lonely Sandbar =10 +Longbow Archer =50 +Looming Shade =10 +Lord of Atlantis =200 +Lord of Extinction =200 +Lorescale Coatl =50 +Lost Soul =10 +Lotus Cobra =200 +Lotus Guardian =200 +Lowland Giant =10 +Loxodon Gatekeeper =200 +Loxodon Hierarch =200 +Loxodon Mystic =10 +Loxodon Punisher =200 +Loxodon Stalwart =50 +Loxodon Warhammer =50 +Loyal Retainers =50 +Lu Bu, Master-at-Arms =200 +Lu Meng, Wu General =200 +Lu Xun, Scholar General =200 +Lucent Liminid =10 +Lull =10 +Lumengrid Warden =10 +Lurking Informant =10 +Lurking Nightstalker =10 +Lynx =50 +Macetail Hystrodon =10 +Mad Auntie =200 +Madrush Cyclops =200 +Maelstrom Pulse =200 +Magefire Wings =10 +Mageta's Boon =10 +Maggot Carrier =10 +Magma Jet =50 +Magnify =10 +Magnivore =200 +Magus of the Bazaar =200 +Magus of the Coffers =200 +Magus of the Disk =200 +Magus of the Library =200 +Magus of the Moat =200 +Magus of the Tabernacle =200 +Mahamoti Djinn =200 +Makindi Shieldmate =10 +Malach of the Dawn =50 +Malachite Golem =10 +Malakir Bloodwitch =200 +Man-o'-War =10 +Mana Cylix =10 +Mana Leak =10 +Mana Prism =50 +Mana Tithe =10 +Manakin =10 +Maniacal Rage =10 +Manta Ray =10 +Manta Riders =10 +Mantis Engine =50 +Marble Diamond =50 +Marble Titan =200 +March of Souls =200 +Marisi's Twinclaws =50 +Maro =200 +Marrow-Gnawer =200 +Marsh Boa =10 +Marsh Flats =200 +Marsh Goblins =10 +Marsh Threader =10 +Marsh Viper =10 +Mask of Law and Grace =10 +Mask of Riddles =50 +Mass Calcify =200 +Mass Hysteria =200 +Mass of Ghouls =10 +Master Decoy =10 +Master Transmuter =200 +Master of Etherium =200 +Masticore =200 +Mawcor =200 +Meadowboon =10 +Meddling Mage =200 +Meekstone =200 +Meglonoth =200 +Megrim =50 +Melesse Spirit =50 +Meloku the Clouded Mirror =200 +Memnarch =200 +Memory Erosion =200 +Meng Huo's Horde =10 +Meng Huo, Barbarian King =200 +Merchant of Secrets =10 +Merfolk Looter =10 +Merfolk Sovereign =200 +Merfolk of the Pearl Trident =10 +Merrow Harbinger =50 +Merrow Levitator =10 +Mesa Enchantress =200 +Mesa Falcon =10 +Messenger Falcons =50 +Metallic Sliver =10 +Metathran Soldier =10 +Metathran Zombie =10 +Might Sliver =50 +Might of Alara =10 +Might of Oaks =200 +Mikokoro, Center of the Sea =200 +Millstone =50 +Mind Funeral =50 +Mind Shatter =200 +Mind Spring =200 +Mind Twist =200 +Minions' Murmurs =50 +Minister of Impediments =10 +Minotaur Explorer =50 +Minotaur Warrior =10 +Mire Boa =10 +Mirri the Cursed =200 +Mirri, Cat Warrior =200 +Miscalculation =10 +Mishra's Factory =50 +Misshapen Fiend =10 +Mist Leopard =10 +Mistral Charger =50 +Misty Rainforest =200 +Moaning Spirit =10 +Moat =200 +Mob Justice =10 +Mobilization =200 +Mogg Fanatic =50 +Mogg War Marshal =10 +Mold Adder =50 +Molimo, Maro-Sorcerer =200 +Molten Frame =10 +Molten Rain =10 +Molten Ravager =10 +Moment's Peace =10 +Monk Realist =10 +Mons's Goblin Raiders =10 +Monstrous Carabid =10 +Monstrous Growth =10 +Moon Sprite =50 +Moonglove Changeling =10 +Moonglove Winnower =10 +Moonlit Wake =50 +Moonwing Moth =10 +Moor Fiend =10 +Moorish Cavalry =10 +Moroii =50 +Morphling =200 +Morsel Theft =10 +Mortify =50 +Mortivore =200 +Moss Diamond =50 +Moss Kami =10 +Moss Monster =10 +Mossfire Valley =200 +Mother of Runes =50 +Mothrider Samurai =10 +Mountain =0 +Mountain Bandit =10 +Mountain Goat =10 +Mountain Yeti =10 +Mourning Thrull =10 +Mox Diamond =200 +Mox Emerald =55000 +Mox Jet =100000 +Mox Pearl =55000 +Mox Ruby =60000 +Mox Sapphire =110000 +Mtenda Herder =10 +Muck Rats =10 +Mudbrawler Cohort =10 +Mudbutton Torchrunner =10 +Mulldrifter =10 +Multani's Acolyte =10 +Multani, Maro-Sorcerer =200 +Muraganda Petroglyphs =200 +Muscle Burst =10 +Muscle Sliver =10 +Mutavault =200 +Mycologist =50 +Mycoloth =200 +Mystic Enforcer =200 +Mystic Gate =200 +Mystic Snake =200 +Mystical Tutor =50 +Mythic Proportions =200 +Nacatl Outlander =10 +Nacatl Savage =10 +Nameless Inversion =10 +Nantuko Disciple =10 +Nantuko Elder =50 +Nantuko Husk =10 +Nantuko Shade =200 +Narwhal =50 +Nath of the Gilt-Leaf =200 +Naturalize =10 +Nature's Cloak =200 +Nature's Ruin =50 +Naya Hushblade =10 +Necrogen Spellbomb =10 +Necropotence =200 +Needle Storm =50 +Needlebug =50 +Needlepeak Spider =10 +Needleshot Gourna =10 +Nemata, Grove Guardian =200 +Nemesis of Reason =200 +Nessian Courser =10 +Nether Spirit =200 +Nettletooth Djinn =50 +Neurok Hoversail =10 +Nevinyrral's Disk =200 +Nezumi Cutthroat =10 +Nezumi Ronin =10 +Nicol Bolas =200 +Nicol Bolas, Planeswalker =200 +Night of Souls' Betrayal =200 +Night's Whisper =50 +Nightguard Patrol =10 +Nightmare =200 +Nightshade Schemers =50 +Nightshade Stinger =10 +Nightsky Mimic =10 +Nightsoil Kami =10 +Nightwind Glider =10 +Nimana Sell-Sword =10 +Nimble Mongoose =50 +Nimbus Wings =10 +Nip Gwyllion =10 +Nissa Revane =200 +Nissa's Chosen =10 +Niv-Mizzet, the Firemind =200 +No-Dachi =50 +Noble Hierarch =200 +Noble Panther =200 +Noble Steeds =10 +Noble Templar =10 +Nocturnal Raid =50 +Nomadic Elf =10 +Norwood Archers =10 +Norwood Ranger =10 +Nourish =10 +Nova Chaser =200 +Novijen, Heart of Progress =50 +Noxious Hatchling =50 +Nullmage Shepherd =50 +Nyxathid =200 +Oakgnarl Warrior =10 +Ob Nixilis, the Fallen =200 +Obelisk of Bant =10 +Obelisk of Esper =10 +Obelisk of Grixis =10 +Obelisk of Jund =10 +Obelisk of Naya =10 +Obliterate =200 +Oblivion Ring =10 +Oboro, Palace in the Clouds =200 +Obsianus Golem =50 +Obsidian Acolyte =10 +Obsidian Fireheart =200 +Obsidian Giant =10 +Odious Trow =10 +Ogre Berserker =10 +Ogre Taskmaster =50 +Ogre Warrior =10 +Okina, Temple to the Grandfathers =200 +Old Ghastbark =10 +Omega Myr =10 +Ondu Cleric =10 +Onulet =10 +Onyx Goblet =10 +Oona's Gatewarden =10 +Opportunity =50 +Opt =10 +Oran-Rief Survivalist =10 +Oran-Rief, the Vastwood =200 +Oraxid =10 +Orcish Artillery =50 +Orcish Cannonade =10 +Orcish Cannoneers =50 +Order of Leitbur =10 +Order of Whiteclay =200 +Order of the Ebon Hand =10 +Order of the Sacred Bell =10 +Order of the White Shield =50 +Ornithopter =10 +Orochi Leafcaller =10 +Orochi Sustainer =10 +Oros, the Avenger =200 +Orzhov Basilica =10 +Orzhov Signet =10 +Orzhova, the Church of Deals =50 +Ostiary Thrull =10 +Ostracize =10 +Oubliette =10 +Outrider of Jhess =10 +Overbeing of Myth =200 +Overgrown Tomb =200 +Overrun =50 +Oversold Cemetery =200 +Oversoul of Dusk =200 +Overwhelming Forces =200 +Overwhelming Intellect =50 +Oxidize =50 +Pacifism =10 +Paladin en-Vec =200 +Pale Bears =200 +Pale Recluse =10 +Palladia-Mors =200 +Pallid Mycoderm =10 +Panther Warriors =10 +Parapet Watchers =10 +Pardic Collaborator =50 +Pardic Dragon =200 +Patagia Golem =50 +Path of Anger's Flame =10 +Path to Exile =50 +Patrol Signaler =50 +Pavel Maliki =50 +Peacekeeper =200 +Pearl Dragon =200 +Pearled Unicorn =10 +Peel from Reality =10 +Pegasus Charger =10 +Pendelhaven =50 +Pendrell Drake =10 +Penumbra Bobcat =10 +Penumbra Kavu =50 +Penumbra Spider =10 +Penumbra Wurm =200 +Peregrine Drake =50 +Peregrine Mask =50 +Perimeter Captain =50 +Perish =50 +Pestermite =10 +Pestilence =50 +Pestilent Kathari =10 +Pewter Golem =10 +Phantom Centaur =50 +Phantom Monster =50 +Phantom Nishoba =200 +Phantom Warrior =200 +Phobian Phantasm =50 +Phyrexian Arena =200 +Phyrexian Battleflies =10 +Phyrexian Gargantua =50 +Phyrexian Ghoul =10 +Phyrexian Hulk =50 +Phyrexian Ironfoot =50 +Phyrexian Monitor =10 +Phyrexian Rager =10 +Phyrexian Snowcrusher =50 +Phyrexian Walker =10 +Phytohydra =200 +Pianna, Nomad Captain =200 +Pillage =50 +Pillarfield Ox =10 +Pillory of the Sleepless =10 +Pincher Beetles =10 +Pirate Ship =200 +Pit Imp =10 +Pit Scorpion =10 +Pixie Queen =200 +Plague Beetle =10 +Plague Wind =200 +Plains =0 +Planar Cleansing =200 +Plasma Elemental =50 +Plateau =200 +Plated Geopede =10 +Plated Rootwalla =10 +Plated Slagwurm =200 +Plated Sliver =10 +Plated Spider =10 +Plated Wurm =10 +Plover Knights =10 +Plumeveil =50 +Political Trickery =200 +Polluted Delta =200 +Polluted Mire =10 +Pongify =50 +Pouncing Jaguar =10 +Power Armor =50 +Predator Dragon =200 +Predator's Strike =10 +Preeminent Captain =200 +Preemptive Strike =10 +Prickly Boggart =10 +Priest of Titania =10 +Primal Bellow =50 +Primal Boost =50 +Primal Clay =200 +Primal Plasma =10 +Primeval Shambler =50 +Primoc Escapee =50 +Primordial Sage =200 +Princess Lucrezia =50 +Prismatic Lens =10 +Privileged Position =200 +Prodigal Pyromancer =10 +Prodigal Sorcerer =10 +Profane Prayers =10 +Progenitus =200 +Promised Kannushi =10 +Propaganda =50 +Proper Burial =200 +Prosperity =50 +Protective Bubble =10 +Prowess of the Fair =50 +Psionic Blast =50 +Psionic Entity =200 +Psychic Drain =50 +Psychotrope Thallid =50 +Pulse Tracker =10 +Pulse of the Tangle =200 +Punish Ignorance =200 +Puppeteer =50 +Purge =50 +Purify =200 +Putrefy =50 +Pygmy Allosaurus =200 +Pygmy Pyrosaur =10 +Pygmy Razorback =10 +Pyre Charger =50 +Pyrite Spellbomb =10 +Pyroclasm =200 +Pyrohemia =50 +Python =10 +Qasali Pridemage =10 +Quag Vampires =10 +Quagmire Lamprey =50 +Quiet Purity =10 +Quietus Spike =200 +Quirion Dryad =200 +Rabid Wombat =50 +Radiant's Dragoons =50 +Radiant, Archangel =200 +Rafiq of the Many =200 +Raging Bull =10 +Raging Cougar =10 +Raging Goblin =10 +Raging Kavu =200 +Raging Minotaur =10 +Raging Ravine =200 +Raiding Nightstalker =10 +Rain of Tears =50 +Raise Dead =10 +Raise the Alarm =10 +Rakdos Carnarium =10 +Rakdos Ickspitter =10 +Rakdos Pit Dragon =200 +Rakdos Signet =10 +Rakka Mar =200 +Ramirez DePietro =50 +Ramosian Captain =50 +Ramosian Commander =50 +Ramosian Lieutenant =10 +Ramosian Revivalist =50 +Ramosian Sergeant =10 +Ramosian Sky Marshal =200 +Rampaging Baloths =200 +Rancor =200 +Ranger en-Vec =50 +Ranger of Eos =200 +Rappelling Scouts =200 +Ratcatcher =200 +Rathi Assassin =200 +Rathi Fiend =50 +Rathi Intimidator =10 +Rathi Trapper =10 +Rats of Rath =10 +Ravages of War =200 +Raven Guild Master =200 +Ravenous Rats =10 +Ravenous Skirge =10 +Razorfin Hunter =10 +Razorfoot Griffin =10 +Razortooth Rats =10 +Reach of Branches =200 +Rebuild =50 +Reckless Embermage =200 +Reckless Scholar =10 +Reckless Wurm =50 +Recover =10 +Red Cliffs Armada =10 +Redwood Treefolk =10 +Reflex Sliver =10 +Reflexes =10 +Regal Unicorn =10 +Regress =10 +Regrowth =50 +Rejuvenate =10 +Reki, the History of Kamigawa =200 +Relentless Rats =50 +Remand =50 +Reminisce =50 +Remote Isle =10 +Remove Soul =10 +Rendclaw Trow =200 +Renegade Troops =50 +Renewed Faith =10 +Repentant Blacksmith =10 +Reprisal =10 +Repulse =10 +Respite =10 +Restless Apparition =50 +Restless Bones =10 +Restless Dead =10 +Resurrection =50 +Resuscitate =50 +Retribution of the Meek =200 +Return to Battle =10 +Revered Dead =10 +Reviving Dose =10 +Reya Dawnbringer =200 +Rhox Bodyguard =10 +Rhox Brute =10 +Rhox Charger =50 +Rhox War Monk =50 +Rhys the Redeemed =200 +Rib Cage Spider =10 +Ribbons of the Reikai =10 +Ridge Rannet =10 +Ridgeline Rager =10 +Ridgetop Raptor =50 +Riding Red Hare =10 +Riding the Dilu Horse =200 +Righteous Avengers =10 +Righteous Charge =50 +Rimebound Dead =10 +Rip-Clan Crasher =10 +Riptide Crab =50 +Riptide Director =200 +Riptide Pilferer =50 +Rishadan Airship =10 +Rith, the Awakener =200 +Riven Turnbull =50 +River Bear =50 +River Boa =10 +River Kaijin =10 +River Merfolk =200 +Riverfall Mimic =10 +Rix Maadi, Dungeon Palace =50 +Roar of the Wurm =50 +Robe of Mirrors =10 +Roc of Kher Ridges =200 +Rock Badger =10 +Rockshard Elemental =200 +Rockslide Ambush =50 +Rod of Ruin =50 +Rofellos, Llanowar Emissary =200 +Rolling Earthquake =200 +Rolling Stones =200 +Ronin Cavekeeper =10 +Ronin Houndmaster =10 +Ronom Unicorn =10 +Roofstalker Wight =10 +Rootbound Crag =200 +Rootbreaker Wurm =50 +Rootwalla =10 +Rootwater Commando =10 +Rootwater Hunter =10 +Rootwater Thief =200 +Rorix Bladewing =200 +Roterothopter =10 +Rowan Treefolk =10 +Royal Assassin =200 +Royal Falcon =10 +Rugged Prairie =200 +Rukh Egg =10 +Rune-Cervin Rider =10 +Runeboggle =10 +Runeclaw Bear =10 +Runed Stalactite =10 +Rushwood Dryad =10 +Rustrazor Butcher =10 +Ruthless Cullblade =10 +Ryusei, the Falling Star =200 +Sabertooth Nishoba =200 +Sabertooth Wyvern =50 +Sabretooth Tiger =10 +Sacred Foundry =200 +Sacred Nectar =10 +Sacred Prey =0 +Safehold Duo =10 +Safehold Elite =10 +Sakura-Tribe Elder =10 +Salt Marsh =50 +Saltblast =50 +Samurai Enforcers =50 +Sanctum Plowbeast =10 +Sandbar Merfolk =10 +Sandbar Serpent =50 +Sandstone Warrior =10 +Sangrite Surge =50 +Sangrophage =10 +Sanguine Guard =50 +Sapling of Colfenor =200 +Saprazzan Heir =200 +Sarcomite Myr =50 +Sarkhan Vol =200 +Sarpadian Empires, Vol. VII =200 +Savage Lands =50 +Savage Twister =50 +Savannah =200 +Savannah Lions =200 +Scalding Tarn =200 +Scalebane's Elite =50 +Scaled Wurm =10 +Scalpelexis =200 +Scarblade Elite =200 +Scare Tactics =10 +Scarland Thrinax =50 +Scarwood Goblins =10 +Scarwood Treefolk =10 +Scathe Zombies =10 +Scavenged Weaponry =10 +Scavenging Scarab =10 +Scepter of Insight =200 +School of the Unseen =50 +Scion of Oona =200 +Scorching Spear =10 +Scornful Egotist =10 +Scragnoth =50 +Scrap =10 +Screaming Fury =10 +Screeching Harpy =50 +Scrubland =200 +Scryb Sprites =10 +Scute Mob =200 +Scuzzback Marauders =10 +Scuzzback Scrapper =10 +Sea Eagle =10 +Sea Gate Loremaster =200 +Sea Monster =10 +Sea Scryer =10 +Sea Serpent =10 +Sea Spirit =50 +Sea Sprite =10 +Seal of Cleansing =10 +Seal of Fire =10 +Seal of Primordium =10 +Seal of Removal =10 +Searing Flesh =50 +Searing Wind =200 +Seascape Aerialist =50 +Seashell Cameo =50 +Seaside Citadel =50 +Seat of the Synod =10 +Secluded Steppe =10 +Sedge Troll =200 +Seedcradle Witch =50 +Seething Song =10 +Segovian Leviathan =50 +Seismic Strike =10 +Seizan, Perverter of Truth =200 +Sejiri Merfolk =50 +Sejiri Refuge =50 +Sek'Kuar, Deathkeeper =200 +Selesnya Sanctuary =10 +Selesnya Signet =10 +Sengir Autocrat =50 +Sengir Bats =10 +Sengir Vampire =200 +Sensation Gorger =200 +Sensei's Divining Top =50 +Sentinels of Glen Elendra =50 +Serendib Efreet =200 +Serendib Sorcerer =200 +Serpent Generator =200 +Serpent Warrior =10 +Serpentine Kavu =10 +Serra Angel =200 +Serra Avatar =200 +Serra Avenger =200 +Serra Sphinx =200 +Serra Zealot =10 +Serra's Blessing =50 +Serra's Embrace =50 +Serra's Sanctum =200 +Serum Visions =10 +Severed Legion =10 +Sewn-Eye Drake =10 +Shade of Trokair =10 +Shadow Rider =10 +Shadow Rift =10 +Shadowblood Ridge =200 +Shadowmage Infiltrator =200 +Shambling Strider =10 +Shanodin Dryads =10 +Shaper Guildmage =10 +Shared Triumph =200 +Shatter =10 +Shatterskull Giant =10 +Shatterstorm =50 +Shepherd of the Lost =50 +Shield Sphere =10 +Shield Wall =10 +Shield of Duty and Reason =10 +Shimmering Barrier =50 +Shimmering Grotto =10 +Shinka Gatekeeper =10 +Shivan Dragon =200 +Shivan Hellkite =200 +Shivan Oasis =50 +Shivan Phoenix =200 +Shivan Raptor =50 +Shivan Wurm =200 +Shivan Zombie =10 +Shizo, Death's Storehouse =200 +Shock =10 +Shore Snapper =10 +Shorecrasher Mimic =10 +Shoreline Ranger =10 +Shriek of Dread =10 +Shriekmaw =50 +Shu Cavalry =10 +Shu Elite Companions =50 +Shu Elite Infantry =10 +Shu Foot Soldiers =10 +Shu General =50 +Shu Grain Caravan =10 +Shu Soldier-Farmers =50 +Shuko =50 +Sickle Ripper =10 +Sidewinder Sliver =10 +Siege Mastodon =10 +Siege-Gang Commander =200 +Sift =10 +Sighted-Caste Sorcerer =10 +Sigil of the Empty Throne =200 +Sigiled Behemoth =10 +Sigiled Paladin =50 +Sign in Blood =10 +Silent Attendant =10 +Silent-Chant Zubera =10 +Silhana Ledgewalker =10 +Silk Net =10 +Silkenfist Fighter =10 +Silkenfist Order =50 +Silver Erne =50 +Silver Knight =50 +Silver Myr =10 +Silverback Ape =10 +Silvercoat Lion =10 +Silverstorm Samurai =10 +Silvos, Rogue Elemental =200 +Simian Grunts =10 +Simic Growth Chamber =10 +Simic Ragworm =10 +Simic Signet =10 +Simic Sky Swallower =200 +Sinew Sliver =10 +Singe-Mind Ogre =10 +Sinkhole =10 +Sir Shandlar of Eberyn =50 +Sisay's Ring =10 +Sisters of the Flame =10 +Sivitri Scarzam =50 +Skarrg, the Rage Pits =50 +Skeletal Changeling =10 +Skeletal Crocodile =10 +Skeletal Snake =10 +Skirk Shaman =10 +Skitter of Lizards =10 +Skred =10 +Skullclamp =50 +Skullmulcher =200 +Sky Diamond =50 +Sky Ruin Drake =10 +Sky Spirit =50 +Sky Swallower =200 +Skycloud Expanse =200 +Skyhunter Patrol =10 +Skyhunter Prowler =10 +Skyhunter Skirmisher =50 +Skyknight Legionnaire =10 +Skyshroud Elf =10 +Skyshroud Falcon =10 +Skyshroud Troll =10 +Skyshroud Troopers =10 +Slagwurm Armor =10 +Slaughter Cry =10 +Slaughterhouse Bouncer =10 +Slay =50 +Sleeper Agent =200 +Sleeper's Guile =10 +Sleight of Hand =10 +Slinking Serpent =50 +Slippery Bogle =10 +Slippery Karst =10 +Slipstream Eel =10 +Slipstream Serpent =10 +Slith Ascendant =50 +Slith Bloodletter =50 +Slith Firewalker =50 +Slith Predator =50 +Slith Strider =50 +Sliver Legion =200 +Sliver Overlord =200 +Sliver Queen =200 +Sliversmith =50 +Sluggishness =10 +Smash =10 +Smoldering Butcher =10 +Smoldering Crater =10 +Smother =50 +Snapping Drake =10 +Snow-Covered Forest =0 +Snow-Covered Island =0 +Snow-Covered Mountain =0 +Snow-Covered Plains =0 +Snow-Covered Swamp =0 +Sokenzan Bruiser =10 +Sol Ring =50 +Sol'kanar the Swamp King =200 +Soldevi Simulacrum =50 +Solemn Simulacrum =200 +Solidarity =10 +Soltari Champion =200 +Soltari Crusader =50 +Soltari Emissary =200 +Soltari Foot Soldier =10 +Soltari Monk =50 +Soltari Priest =50 +Sootfeather Flock =10 +Sorceress Queen =200 +Soul Feast =50 +Soul Warden =50 +Soulcatcher =50 +Soulscour =200 +Southern Elephant =10 +Sower of Temptation =200 +Spark Elemental =50 +Spark Spray =10 +Sparksmith =10 +Sparkspitter =50 +Spawning Pool =50 +Spawnwrithe =200 +Spectral Bears =50 +Spectral Force =200 +Spectral Lynx =200 +Spectral Procession =50 +Spectral Searchlight =50 +Spell Pierce =10 +Spell Snare =50 +Spell Snip =10 +Sphinx of Jwar Isle =200 +Sphinx of the Steel Wind =200 +Spidersilk Armor =10 +Spidersilk Net =10 +Spikeshot Goblin =10 +Spined Basher =10 +Spined Wurm =10 +Spineless Thug =10 +Spiraling Embers =10 +Spire Barrage =10 +Spiritmonger =200 +Spiritual Guardian =200 +Spitting Drake =50 +Spitting Earth =10 +Spitting Gourna =10 +Spitting Spider =50 +Sporesower Thallid =50 +Spotted Griffin =10 +Springjack Shepherd =50 +Sprout =10 +Sprout Swarm =10 +Sprouting Thrinax =50 +Squall Drifter =10 +Squall Line =200 +Squee, Goblin Nabob =200 +Squire =10 +Squirming Mass =10 +Squirrel Nest =50 +Staff of Domination =200 +Stalker Hag =50 +Stalking Stones =50 +Stampeding Rhino =10 +Stand Firm =10 +Standing Troops =10 +Standstill =50 +Stangg =200 +Starlit Angel =50 +Starstorm =200 +Stasis =200 +Staunch Defenders =50 +Steadfast Guard =10 +Steadfastness =10 +Steam Frigate =10 +Steam Spitter =50 +Steam Vents =200 +Steel Leaf Paladin =10 +Steel Wall =50 +Steely Resolve =200 +Steppe Lynx =10 +Stern Judge =50 +Steward of Valeron =10 +Stifle =200 +Stillmoon Cavalier =200 +Stinging Barrier =10 +Stirring Wildwood =200 +Stolen Grain =50 +Stomping Ground =200 +Stone Kavu =10 +Stone Rain =10 +Stone-Throwing Devils =10 +Stonecloaker =50 +Stoneforge Mystic =200 +Stonewood Invoker =10 +Stonework Puma =10 +Storm Crow =10 +Storm Herd =200 +Storm Shaman =50 +Storm Spirit =200 +Stormcloud Djinn =50 +Stormfront Pegasus =10 +Stormscape Apprentice =10 +Stormscape Master =200 +Strangling Soot =10 +Stratozeppelid =50 +Straw Soldiers =10 +Stream Hopper =10 +Stream of Acid =50 +Stream of Life =10 +Street Wraith =50 +Streetbreaker Wurm =10 +Strength of Cedars =50 +Strip Mine =50 +Striped Bears =10 +Stroke of Genius =200 +Stromgald Crusader =50 +Stronghold Discipline =10 +Stronghold Zeppelin =50 +Stuffy Doll =200 +Stun Sniper =50 +Sturdy Hatchling =50 +Sudden Strength =10 +Sun Ce, Young Conquerer =200 +Sun Quan, Lord of Wu =200 +Sunastian Falconer =50 +Sunbeam Spellbomb =10 +Sunder from Within =50 +Sunflare Shaman =10 +Sunglasses of Urza =200 +Sungrass Prairie =200 +Sunhome, Fortress of the Legion =50 +Sunken Ruins =200 +Sunlance =10 +Sunpetal Grove =200 +Suntail Hawk =10 +Sunweb =200 +Supreme Exemplar =200 +Suq'Ata Assassin =50 +Suq'Ata Lancer =10 +Survival of the Fittest =200 +Svogthos, the Restless Tomb =50 +Swallowing Plague =50 +Swamp =0 +Swamp Mosquito =10 +Swans of Bryn Argoll =200 +Sword of the Meek =50 +Swords to Plowshares =50 +Sygg, River Guide =200 +Sylvan Basilisk =50 +Sylvan Messenger =50 +Sylvan Tutor =200 +Symbiotic Elf =10 +Synchronous Sliver =10 +Syphon Life =50 +Taiga =200 +Take Possession =200 +Talas Air Ship =10 +Talas Merchant =10 +Talas Scout =10 +Talas Warrior =200 +Talon Sliver =10 +Talon Trooper =10 +Talonrend =50 +Talruum Minotaur =10 +Tangle Spider =50 +Tanglebloom =10 +Taoist Hermit =50 +Taoist Mystic =200 +Tarfire =10 +Tarmogoyf =200 +Tarox Bladewing =200 +Tarpan =10 +Tattered Drake =10 +Tattermunge Duo =10 +Tattermunge Maniac =50 +Tectonic Fiend =50 +Tel-Jilad Archers =10 +Tel-Jilad Chosen =10 +Tel-Jilad Exile =10 +Tel-Jilad Justice =50 +Tel-Jilad Outrider =10 +Telim'Tor's Darts =50 +Tempest Drake =50 +Tempest of Light =50 +Temple Garden =200 +Temporal Manipulation =200 +Temporal Spring =10 +Tendrils of Corruption =10 +Terminate =10 +Teroh's Faithful =10 +Terra Stomper =200 +Terramorphic Expanse =10 +Terravore =200 +Territorial Baloth =10 +Terror =10 +Test Destroy =0 +Tethered Griffin =200 +Tetsuo Umezawa =200 +Tezzeret the Seeker =200 +Thalakos Sentry =10 +Thallid =10 +Thallid Shell-Dweller =10 +That Which Was Taken =200 +The Hive =200 +The Lady of the Mountain =50 +The Tabernacle at Pendrell Vale =200 +The Unspeakable =200 +Theft of Dreams =10 +Thelonite Hermit =200 +Thermal Blast =10 +Thermal Glider =10 +Thief of Hope =50 +Thieving Magpie =50 +Think Twice =10 +Thirst for Knowledge =50 +Thistledown Duo =10 +Thopter Foundry =50 +Thorn-Thrash Viashino =10 +Thornling =200 +Thornscape Apprentice =10 +Thornscape Master =200 +Thornweald Archer =10 +Thornwind Faeries =10 +Thought Courier =10 +Thoughtcutter Agent =50 +Thoughtseize =200 +Thousand-legged Kami =50 +Thran Dynamo =50 +Thran War Machine =50 +Threaten =50 +Thriss, Nantuko Primus =200 +Thunder Spirit =50 +Thunder Wall =50 +Thunder-Thrash Elder =50 +Thundering Giant =50 +Thunderscape Apprentice =10 +Thwart =50 +Tidal Kraken =200 +Tidehollow Strix =10 +Tidings =50 +Tiger Claws =10 +Tigereye Cameo =50 +Timber Protector =200 +Timbermaw Larva =10 +Timberwatch Elf =10 +Time Stretch =200 +Time Vault =200 +Time Walk =200 +Time Warp =200 +Timetwister =200 +Tinker =50 +Titanic Bulvox =10 +Titanic Ultimatum =200 +Titanium Golem =10 +Tithe =200 +Tobias Andrion =50 +Tolaria West =50 +Tolarian Academy =200 +Tolsimir Wolfblood =200 +Tome Scour =10 +Tor Giant =10 +Torch Drake =10 +Torii Watchward =10 +Tormented Angel =10 +Torsten Von Ursus =50 +Tortoise Formation =10 +Tortuga =0 +Touch of Brilliance =10 +Touch of Invisibility =10 +Tower Drake =10 +Tower Gargoyle =50 +Tower of Champions =200 +Tower of Fortunes =200 +Tower of the Magistrate =200 +Towering Baloth =50 +Tradewind Rider =200 +Trailblazer =200 +Trailblazer's Boots =50 +Trained Armodon =10 +Trained Jackal =10 +Trained Orgg =200 +Tranquil Thicket =10 +Tranquility =10 +Transguild Courier =50 +Transluminant =10 +Trapjaw Kelpie =10 +Traumatic Visions =10 +Traumatize =200 +Treasure Trove =50 +Tree Monkey =10 +Tree of Tales =10 +Treefolk Harbinger =50 +Treespring Lorian =10 +Treetop Bracers =10 +Treetop Rangers =10 +Treetop Scout =10 +Treetop Sentinel =50 +Treetop Village =50 +Tremor =10 +Tresserhorn Sinks =50 +Treva, the Renewer =200 +Tribal Flames =10 +Trinket Mage =10 +Trokin High Guard =10 +Troll Ascetic =200 +Troll-Horn Cameo =50 +Tromp the Domains =50 +Tropical Island =200 +Trusty Machete =50 +Tuknir Deathlock =200 +Tuktuk Grunts =10 +Tundra =200 +Tundra Wolves =10 +Turntimber Ranger =200 +Turtleshell Changeling =50 +Twilight Mire =200 +Twinblade Slasher =50 +Twisted Abomination =10 +Tyrranax =10 +Uktabi Drake =10 +Uktabi Efreet =10 +Uktabi Orangutan =50 +Umara Raptor =10 +Umbral Mantle =50 +Umezawa's Jitte =200 +Uncontrollable Anger =10 +Undercity Shade =50 +Underground Sea =200 +Undermine =200 +Underworld Dreams =50 +Undying Beast =200 +Undying Rage =50 +Unholy Strength =10 +Unmake =10 +Unnatural Speed =10 +Unseen Walker =50 +Unsummon =10 +Unworthy Dead =10 +Unyaro Bee Sting =50 +Ur-Golem's Eye =10 +Urborg Drake =50 +Urborg Elf =10 +Urborg Syphon-Mage =10 +Urborg Uprising =10 +Urborg Volcano =50 +Uril, the Miststalker =200 +Ursapine =200 +Urza's Blueprints =200 +Urza's Factory =50 +Uthden Troll =50 +Utopia Tree =200 +Utvara Scalper =10 +Vaevictis Asmadi =200 +Valeron Outlander =10 +Valiant Guard =10 +Valley Rannet =10 +Valor =50 +Valorous Charge =50 +Vampire Bats =10 +Vampire Lacerator =10 +Vampire Nighthawk =50 +Vampiric Feast =50 +Vampiric Touch =10 +Vampiric Tutor =200 +Vastwood Gorger =10 +Vault of Whispers =10 +Vectis Agents =10 +Vectis Silencers =10 +Vedalken Archmage =200 +Vedalken Entrancer =10 +Vedalken Ghoul =0 +Vedalken Mastermind =50 +Vedalken Outlander =10 +Vedalken Plotter =50 +Veldrane of Sengir =200 +Vendilion Clique =200 +Venerable Kumo =10 +Venerable Monk =10 +Vengeful Firebrand =200 +Venser's Sliver =10 +Verdant Catacombs =200 +Verdigris =50 +Verduran Enchantress =200 +Veteran Armorer =10 +Veteran Armorsmith =10 +Veteran Cavalier =10 +Veteran Swordsmith =10 +Vexing Beetle =200 +Viashino Fangtail =10 +Viashino Grappler =10 +Viashino Outrider =10 +Viashino Slasher =10 +Viashino Slaughtermaster =50 +Viashino Spearhunter =10 +Viashino Warrior =10 +Viashivan Dragon =200 +Vicious Hunger =10 +Vicious Kavu =50 +Vigilance =10 +Vigilant Drake =10 +Villainous Ogre =10 +Vindicate =200 +Vine Trellis =10 +Viridian Acolyte =10 +Viridian Joiner =10 +Viridian Lorebearers =50 +Viridian Shaman =50 +Viridian Zealot =200 +Virtue's Ruin =50 +Virtuous Charge =10 +Virulent Sliver =10 +Visara the Dreadful =200 +Viscerid Deepwalker =10 +Viscid Lemures =10 +Vision Skeins =10 +Vitalizing Cascade =50 +Vitalizing Wind =200 +Vithian Renegades =50 +Vitu-Ghazi, the City-Tree =50 +Vizzerdrix =200 +Vodalian Knights =50 +Vodalian Merchant =10 +Vodalian Soldiers =10 +Vodalian Zombie =10 +Voice of Duty =50 +Voice of Grace =50 +Voice of Law =50 +Voice of Reason =50 +Voice of Truth =50 +Volcanic Dragon =200 +Volcanic Fallout =50 +Volcanic Geyser =50 +Volcanic Hammer =10 +Volcanic Island =200 +Volcanic Submersion =10 +Volcano Imp =10 +Volrath's Stronghold =200 +Voltaic Key =50 +Volunteer Militia =10 +Voracious Hatchling =50 +Vorosh, the Hunter =200 +Votary of the Conclave =10 +Vug Lizard =50 +Vulshok Battlegear =50 +Vulshok Berserker =10 +Vulshok Gauntlets =10 +Vulshok Morningstar =10 +Vulshok Sorcerer =10 +Walking Dead =10 +Wall of Air =50 +Wall of Blossoms =50 +Wall of Bone =50 +Wall of Brambles =50 +Wall of Denial =50 +Wall of Diffusion =10 +Wall of Earth =10 +Wall of Faith =10 +Wall of Fire =50 +Wall of Granite =50 +Wall of Heat =10 +Wall of Ice =10 +Wall of Kelp =200 +Wall of Lava =50 +Wall of Light =50 +Wall of Mulch =50 +Wall of Opposition =50 +Wall of Pine Needles =50 +Wall of Razors =50 +Wall of Reverence =200 +Wall of Spears =10 +Wall of Stone =50 +Wall of Swords =50 +Wall of Water =50 +Wall of Wood =10 +Wanderbrine Rootcutters =10 +Wandering Goblins =10 +Wandering Ones =10 +Wandering Stream =10 +Waning Wurm =50 +War Chariot =50 +War Mammoth =10 +War-Spike Changeling =10 +Warpath Ghoul =10 +Warren Instigator =200 +Warren-Scourge Elf =10 +Warrior Angel =200 +Warrior's Charge =10 +Warrior's Honor =10 +Warthog =50 +Wasp Lancer =50 +Wasteland =50 +Watcher Sliver =10 +Watchwolf =50 +Water Elemental =50 +Watery Grave =200 +Waveskimmer Aven =10 +Wayward Soul =10 +Weakness =10 +Weathered Wayfarer =200 +Weatherseed Elf =10 +Weatherseed Faeries =10 +Weatherseed Treefolk =200 +Wei Ambush Force =10 +Wei Elite Companions =50 +Wei Infantry =10 +Wei Scout =10 +Wei Strike Force =10 +Welkin Tern =10 +Wellwisher =10 +Werebear =10 +Wheel of Fortune =200 +Whip Sergeant =50 +Whip-Spine Drake =10 +Whipcorder =50 +Whiptail Wurm =10 +Whiptongue Frog =10 +Whirling Dervish =50 +Whirlpool Rider =10 +Whispering Shade =10 +Whispers of the Muse =50 +Whispersilk Cloak =10 +White Knight =50 +White Shield Crusader =50 +Wielding the Green Dragon =10 +Wild Aesthir =10 +Wild Colos =10 +Wild Elephant =10 +Wild Griffin =10 +Wild Jhovall =10 +Wild Mongrel =80 +Wild Nacatl =10 +Wild Ox =50 +Wildfire Emissary =50 +Wildsize =10 +Wildslayer Elves =10 +Will-o'-the-Wisp =200 +Willow Dryad =10 +Willow Elf =10 +Willow Faerie =10 +Wilt-Leaf Cavaliers =50 +Wind Dancer =50 +Wind Drake =10 +Windborn Muse =200 +Winding Wurm =10 +Windreaper Falcon =50 +Windrider Eel =10 +Windseeker Centaur =10 +Windstorm =50 +Windswept Heath =200 +Windwright Mage =10 +Winged Coatl =10 +Winged Sliver =10 +Wings of Hope =10 +Wings of Velis Vel =10 +Winnower Patrol =10 +Winter's Grasp =50 +Wirewood Elf =10 +Wirewood Guardian =10 +Wirewood Hivemaster =50 +Wirewood Lodge =50 +Wirewood Pride =10 +Wistful Selkie =50 +Wistful Thinking =10 +Wit's End =200 +Witch-Maw Nephilim =200 +Wizards' School =50 +Wizened Cenn =50 +Wojek Embermage =50 +Wolf-Skull Shaman =50 +Wolfbriar Elemental =200 +Wonder =50 +Wood Elves =10 +Wooded Bastion =200 +Wooded Foothills =200 +Woodland Changeling =10 +Woodland Druid =10 +Woodlurker Mimic =10 +Woolly Thoctar =50 +Words of Wisdom =10 +Worldly Tutor =50 +Wormwood Dryad =10 +Wormwood Treefolk =200 +Worn Powerstone =50 +Wort, Boggart Auntie =200 +Wrap in Vigor =10 +Wrath of God =15000 +Wreak Havoc =50 +Wrecking Ball =10 +Wren's Run Packmaster =200 +Wu Elite Cavalry =10 +Wu Infantry =10 +Wu Light Cavalry =10 +Wu Warship =10 +Wydwen, the Biting Gale =200 +Wyluli Wolf =10 +Xiahou Dun, the One-Eyed =200 +Xira Arien =200 +Yavimaya Ancients =10 +Yavimaya Ants =50 +Yavimaya Barbarian =10 +Yavimaya Enchantress =50 +Yavimaya Gnats =50 +Yavimaya Scion =10 +Yavimaya Wurm =10 +Yawgmoth's Bargain =200 +Yellow Scarves Cavalry =10 +Yellow Scarves General =200 +Yellow Scarves Troops =10 +Yoked Plowbeast =10 +Yore-Tiller Nephilim =200 +Yotian Soldier =10 +Young Wei Recruits =10 +Youthful Knight =10 +Zap =10 +Zealous Guardian =10 +Zebra Unicorn =50 +Zendikar Farguide =10 +Zephid =200 +Zephid's Embrace =50 +Zephyr Falcon =10 +Zephyr Sprite =10 +Zhalfirin Knight =10 +Zhang Fei, Fierce Warrior =200 +Zhang He, Wei General =200 +Zhou Yu, Chief Commander =200 +Zodiac Dog =10 +Zodiac Goat =10 +Zodiac Horse =50 +Zodiac Monkey =10 +Zodiac Ox =50 +Zodiac Pig =50 +Zodiac Rabbit =10 +Zodiac Rat =10 +Zodiac Rooster =10 +Zodiac Snake =10 +Zodiac Tiger =50 +Zombie Goliath =10 +Zombie Outlander =10 +Zombify =50 +Zuberi, Golden Feather =200 +Zuo Ci, the Mocking Sage =200 +Zur the Enchanter =200 +Zuran Spellcaster =10 \ No newline at end of file diff --git a/res/quest/quest.properties b/res/quest/quest.properties index 1a3313a2ac7..e6dc2b03bee 100644 --- a/res/quest/quest.properties +++ b/res/quest/quest.properties @@ -2,6 +2,8 @@ common--file=common.txt uncommon--file=uncommon.txt rare--file=rare.txt +price--file=price.txt + easy--file=easy.txt medium--file=medium.txt hard--file=hard.txt diff --git a/res/quest/questData b/res/quest/questData index f59b05313b5..215504b0d48 100644 Binary files a/res/quest/questData and b/res/quest/questData differ diff --git a/src/QuestData_State.java b/src/QuestData_State.java index 1a216a41680..fab745075a0 100644 --- a/src/QuestData_State.java +++ b/src/QuestData_State.java @@ -23,9 +23,10 @@ public class QuestData_State implements Serializable { private static final long serialVersionUID = 7007940230351051937L; int rankIndex, win, lost; + long credits; String difficulty; - ArrayList cardPool; + ArrayList cardPool, shopList; HashMap myDecks, aiDecks; private Object readResolve() throws ObjectStreamException { @@ -39,6 +40,6 @@ public class QuestData_State implements Serializable { for(Entry deck:this.aiDecks.entrySet()) { aiDecks.put(deck.getKey(), deck.getValue().migrate()); } - return new forge.QuestData_State(rankIndex, win, lost, difficulty, cardPool, myDecks, aiDecks); + return new forge.QuestData_State(rankIndex, win, lost, credits, difficulty, cardPool, shopList, myDecks, aiDecks); } } diff --git a/src/forge/Card.java b/src/forge/Card.java index 7eaa1b38663..01395aac95e 100644 --- a/src/forge/Card.java +++ b/src/forge/Card.java @@ -14,6 +14,8 @@ public class Card extends MyObservable { private static int nextUniqueNumber; private int uniqueNumber = nextUniqueNumber++; + private long value; + //private Collection keyword = new TreeSet(); //private ArrayList keyword = new ArrayList(); @@ -1466,6 +1468,15 @@ public class Card extends MyObservable { return uniqueNumber; } + public void setValue(long n) + { + value = n; + } + + public long getValue() + { + return value; + } @Override public boolean equals(Object o) { if(o instanceof Card) { diff --git a/src/forge/CardShopTableModel.java b/src/forge/CardShopTableModel.java new file mode 100644 index 00000000000..598c930ef49 --- /dev/null +++ b/src/forge/CardShopTableModel.java @@ -0,0 +1,305 @@ + +package forge; + + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.Arrays; + +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; + + +class CardShopTableModel extends AbstractTableModel { + + private static final long serialVersionUID = 1L; + + //holds 1 copy of each card, DOES NOT HOLD multiple cards with the same name + private CardList dataNoCopies = new CardList(); + + //holds multiple card + //example: if there are 4 Elvish Pipers, dataNoCopies has 1 copy, and dataCopies has 3 + private CardList dataCopies = new CardList(); + + //used by sort(), holds old data to compare with sorted data, to see if any change was made + //private CardList oldList = new CardList(); + + private CardContainer cardDetail; + private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "R", "Value"}; + + //used to resort(), used when addCard(Card) is called + private int recentSortedColumn; + private boolean recentAscending; + + public CardShopTableModel(CardContainer cd) { + this(new CardList(), cd); + } + + public CardShopTableModel(CardList inData, CardContainer in_cardDetail) { + cardDetail = in_cardDetail; + //intialize dataNoCopies and dataCopies + addCard(inData); + } + + + public void resizeCols(final JTable table) { + TableColumn column = null; + for(int i = 0; i < table.getColumnCount(); i++) { + column = table.getColumnModel().getColumn(i); + + if(i == 0) { + column.setPreferredWidth(25); //make first column small + column.setMaxWidth(25); + } else if(i == 1) { + column.setPreferredWidth(190); + column.setMinWidth(190); + column.setMaxWidth(190); + } else if(i == 2) { + column.setPreferredWidth(85); + column.setMinWidth(85); + column.setMaxWidth(126); + } else if(i == 3) { + column.setPreferredWidth(58); + column.setMaxWidth(58); + } else if(i == 4) column.setPreferredWidth(130); + else if(i == 5) { + column.setPreferredWidth(32); + column.setMaxWidth(42); + } else if(i == 6) { + column.setPreferredWidth(20); + column.setMaxWidth(20); + } else if(i == 7) { + column.setPreferredWidth(40); + column.setMaxWidth(40); + } + }//for + + for(int j = 0; j < table.getColumnCount(); j++) { + column = table.getColumnModel().getColumn(j); + //System.out.println("col Width:" + column.getPreferredWidth()); + } + } + + public void clear() { + dataNoCopies.clear(); + dataCopies.clear(); + //fireTableDataChanged(); + } + + public CardList getCards() { + CardList all = new CardList(); + all.addAll(dataCopies.toArray()); + all.addAll(dataNoCopies.toArray()); + + return all; + } + + public void removeCard(Card c) { + //remove card from "dataCopies", + //if not found there, remove card from "dataNoCopies" + int index = findCardName(c.getName(), dataCopies); + + if(index != -1) //found card name + dataCopies.remove(index); + else { + index = findCardName(c.getName(), dataNoCopies); + dataNoCopies.remove(index); + } + + fireTableDataChanged(); + } + + private int findCardName(String name, CardList list) { + for(int i = 0; i < list.size(); i++) + if(list.get(i).getName().equals(name)) return i; + + return -1; + } + + public void addCard(Card c) { + if(0 == countQuantity(c, dataNoCopies)) dataNoCopies.add(c); + else dataCopies.add(c); + } + + public void addCard(CardList c) { + for(int i = 0; i < c.size(); i++) + addCard(c.get(i)); + + fireTableDataChanged(); + } + + public Card rowToCard(int row) { + return dataNoCopies.get(row); + } + + private int countQuantity(Card c) { + return countQuantity(c, dataNoCopies) + countQuantity(c, dataCopies); + } + + //CardList data is either class members "dataNoCopies" or "dataCopies" + private int countQuantity(Card c, CardList data) { + int count = 0; + for(int i = 0; i < data.size(); i++) + //are the card names the same? + if(data.get(i).getName().equals(c.getName())) count++; + + return count; + } + + public int getRowCount() { + return dataNoCopies.size(); + } + + public int getColumnCount() { + return column.length; + } + + @Override + public String getColumnName(int n) { + return column[n]; + } + + public Object getValueAt(int row, int column) { + return getColumn(dataNoCopies.get(row), column); + } + + private Object getColumn(Card c, int column) { + switch(column) { + case 0: + return Integer.valueOf(countQuantity(c)); + case 1: + return c.getName(); + case 2: + return c.getManaCost(); + case 3: + return TableSorter.getColor(c); + case 4: + return GuiDisplayUtil.formatCardType(c); + case 5: + return c.isCreature()? c.getBaseAttack() + "/" + c.getBaseDefense():""; + case 6: + String rarity = c.getRarity(); + if(rarity.length() > 0) rarity = rarity.substring(0, 1); + return rarity; + case 7: + long value = c.getValue(); + return value; + default: + return "error"; + } + } + + public void addListeners(final JTable table) { + //updates card detail, listens to any key strokes + table.addKeyListener(new KeyListener() { + public void keyPressed(KeyEvent ev) {} + + public void keyTyped(KeyEvent ev) {} + + public void keyReleased(KeyEvent ev) { + int row = table.getSelectedRow(); + if(row != -1) { + cardDetail.setCard(dataNoCopies.get(row)); + } + } + }); + //updates card detail, listens to any mouse clicks + table.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + int row = table.getSelectedRow(); + if(row != -1) { + cardDetail.setCard(dataNoCopies.get(row)); + } + } + }); + + //sorts + MouseListener mouse = new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + TableColumnModel columnModel = table.getColumnModel(); + int viewColumn = columnModel.getColumnIndexAtX(e.getX()); + int column = table.convertColumnIndexToModel(viewColumn); + + + if(column != -1) { + //sort ascending + @SuppressWarnings("unused") + boolean change = sort(column, true); + + //if(! change) + // sort(column, false);//sort descending + + //fireTableDataChanged(); + } + }//mousePressed() + };//MouseListener + table.getTableHeader().addMouseListener(mouse); + }//addCardListener() + + //called by the GUI when a card is added to re-sort + public void resort() { + sort(recentSortedColumn, recentAscending); + //this.fireTableDataChanged(); + } + + //returns true if any data changed positions + // @SuppressWarnings("unchecked") + // Arrays.sort + public boolean sort(int column, boolean ascending) { + //used by addCard() to resort the cards + recentSortedColumn = column; + recentAscending = ascending; + + CardList all = new CardList(); + all.addAll(dataNoCopies.toArray()); + all.addAll(dataCopies.toArray()); + + TableSorter sorter = new TableSorter(all, column, ascending); + Card[] array = all.toArray(); + Arrays.sort(array, sorter); + + /* + //determine if any data changed position + boolean hasChanged = false; + CardList check = removeDuplicateNames(array); + for(int i = 0; i < check.size(); i++) + //do the card names match? + if(! check.get(i).getName().equals(dataNoCopies.get(i).getName())) + hasChanged = true; + */ + + //clear everything, and add sorted data back into the model + dataNoCopies.clear(); + dataCopies.clear(); + addCard(new CardList(array)); + + //this value doesn't seem to matter: + //return hasChanged; + return true; + }//sort() + /* + private CardList removeDuplicateNames(Card[] c) + { + TreeSet check = new TreeSet(); + CardList list = new CardList(); + + for(int i = 0; i < c.length; i++) + { + if(! check.contains(c[i].getName())) + { + check.add(c[i].getName()); + list.add(c[i]); + } + } + + return list; + } + */ +}//CardTableModel diff --git a/src/forge/Gui_CardShop.java b/src/forge/Gui_CardShop.java new file mode 100644 index 00000000000..ac157564020 --- /dev/null +++ b/src/forge/Gui_CardShop.java @@ -0,0 +1,558 @@ + +package forge; + + +import java.awt.Color; +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Map; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.border.Border; +import javax.swing.border.EtchedBorder; +import javax.swing.border.TitledBorder; +import javax.swing.event.MouseInputListener; +import forge.error.ErrorViewer; +import forge.gui.game.CardDetailPanel; +import forge.gui.game.CardPicturePanel; +import forge.properties.NewConstants; + +public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, NewConstants { + + private static final long serialVersionUID = 3988857075791576483L; + + Gui_DeckEditor_Menu customMenu; + + //private ImageIcon upIcon = Constant.IO.upIcon; + //private ImageIcon downIcon = Constant.IO.downIcon; + + private CardShopTableModel topModel; + private CardShopTableModel bottomModel; + + private JScrollPane jScrollPane1 = new JScrollPane(); + private JScrollPane jScrollPane2 = new JScrollPane(); + private JButton sellButton = new JButton(); + @SuppressWarnings("unused") + // border1 + private Border border1; + private TitledBorder titledBorder1; + private Border border2; + private TitledBorder titledBorder2; + private JButton buyButton = new JButton(); + + private JTable topTable = new JTable(); + private JTable bottomTable = new JTable(); + private JScrollPane jScrollPane3 = new JScrollPane(); + private JPanel jPanel3 = new JPanel(); + private GridLayout gridLayout1 = new GridLayout(); + private JLabel creditsLabel = new JLabel(); + private JLabel jLabel1 = new JLabel(); + private JLabel sellPercentageLabel = new JLabel(); + + private double multi; + + private CardList top; + private CardList bottom; + public Card cCardHQ; + + private CardDetailPanel detail = new CardDetailPanel(null); + private CardPicturePanel picture = new CardPicturePanel(null); + private JPanel glassPane; + + private QuestData questData; + @Override + public void setTitle(String message) { + super.setTitle(message); + } + + public void updateDisplay(CardList top, CardList bottom) { + + this.top = top; + this.bottom = bottom; + + topModel.clear(); + bottomModel.clear(); + + if(AllZone.NameChanger.shouldChangeCardName()) { + top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); + bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); + } + + Card c; + String cardName; + ReadBoosterPack pack = new ReadBoosterPack(); + + // update top + for(int i = 0; i < top.size(); i++) { + c = top.get(i); + + // add rarity to card if this is a sealed card pool + + cardName = AllZone.NameChanger.getOriginalName(c.getName()); + if(!pack.getRarity(cardName).equals("error")) { + c.setRarity(pack.getRarity(cardName)); + } + topModel.addCard(c); + + }// for + + // update bottom + for(int i = 0; i < bottom.size(); i++) { + c = bottom.get(i); + + // add rarity to card if this is a sealed card pool + if(!customMenu.getGameType().equals(Constant.GameType.Constructed)) c.setRarity(pack.getRarity(c.getName())); + + bottomModel.addCard(c); + }// for + + topModel.resort(); + bottomModel.resort(); + }// updateDisplay + + public void updateDisplay() { + //updateDisplay(this.top, this.bottom); + + topModel.clear(); + + if(AllZone.NameChanger.shouldChangeCardName()) { + top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); + bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); + } + + Card c; + String cardName; + ReadBoosterPack pack = new ReadBoosterPack(); + + // update top + for(int i = 0; i < top.size(); i++) { + c = top.get(i); + + // add rarity to card if this is a sealed card pool + + cardName = AllZone.NameChanger.getOriginalName(c.getName()); + if(!pack.getRarity(cardName).equals("error")) { + c.setRarity(pack.getRarity(cardName)); + } + + topModel.addCard(c); + }// for + + topModel.resort(); + } + + + public CardShopTableModel getTopTableModel() { + return topModel; + } + + public CardList getTop() { + return topModel.getCards(); + } + + //bottom shows cards that the user has chosen for his library + public CardList getBottom() { + return bottomModel.getCards(); + } + + public void show(final Command exitCommand) { + final Command exit = new Command() { + private static final long serialVersionUID = 5210924838133689758L; + + public void execute() { + Gui_CardShop.this.dispose(); + exitCommand.execute(); + } + }; + + customMenu = new Gui_DeckEditor_Menu(this, exit); + customMenu.setTitle("Card Shop"); + //this.setJMenuBar(customMenu); + + + //do not change this!!!! + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent ev) { + customMenu.close(); + } + }); + + setup(); + + //show cards, makes this user friendly + //customMenu.newConstructed(); + + //get pricelist: + ReadPriceList r = new ReadPriceList(); + Map map = r.getPriceList(); + + ReadBoosterPack pack = new ReadBoosterPack(); + CardList shop; + + if (questData.getShopList().size() == 0) + { + shop = pack.getShopCards(questData.getWin()); + ArrayList shopListToBeSaved = new ArrayList(); + + for (int i = 0; i shopList = questData.getShopList(); + shop = new CardList(); + + for(int i = 0; i < shopList.size(); i++) { + Card c = AllZone.CardFactory.getCard(shopList.get(i).toString(), ""); + c.setValue(map.get(c.getName())); + c.setRarity(pack.getRarity(c.getName())); + shop.add(c); + } + } + + ArrayList list = questData.getCardpool(); + CardList owned = new CardList(); + + for(int i = 0; i < list.size(); i++) { + Card c = AllZone.CardFactory.getCard(list.get(i).toString(), ""); + c.setValue(map.get(c.getName())); + c.setRarity(pack.getRarity(c.getName())); + owned.add(c); + } + + customMenu.populateShop(shop, owned); + + double multiPercent = multi*100; + NumberFormat formatter = new DecimalFormat("#0.00"); + sellPercentageLabel.setText("(Sell percentage: " + formatter.format(multiPercent) +"% of value)" ); + + topModel.sort(1, true); + bottomModel.sort(1, true); + }//show(Command) + + private void addListeners() { + MouseInputListener l = new MouseInputListener() { + public void mouseReleased(MouseEvent e) { + redispatchMouseEvent(e); + } + + public void mousePressed(MouseEvent e) { + redispatchMouseEvent(e); + } + + public void mouseExited(MouseEvent e) { + redispatchMouseEvent(e); + } + + public void mouseEntered(MouseEvent e) { + redispatchMouseEvent(e); + } + + public void mouseClicked(MouseEvent e) { + redispatchMouseEvent(e); + } + + public void mouseMoved(MouseEvent e) { + redispatchMouseEvent(e); + } + + public void mouseDragged(MouseEvent e) { + redispatchMouseEvent(e); + } + + private void redispatchMouseEvent(MouseEvent e) { + Container content = getContentPane(); + Point glassPoint = e.getPoint(); + Point contentPoint = SwingUtilities.convertPoint(glassPane, glassPoint, content); + + Component component = SwingUtilities.getDeepestComponentAt(content, contentPoint.x, contentPoint.y); + if(component == null || !SwingUtilities.isDescendingFrom(component, picture)) { + glassPane.setVisible(false); + } + } + }; + + glassPane.addMouseMotionListener(l); + glassPane.addMouseListener(l); + + picture.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + Card c = picture.getCard(); + if(c == null) return; + Image i = ImageCache.getOriginalImage(c); + if(i == null) return; + if(i.getWidth(null) < 300) return; + glassPane.setVisible(true); + } + }); + }//addListeners() + + private void setup() { + multi = 0.25 + (0.001 *questData.getWin()); + if (multi > 0.6) + multi = 0.6; + + addListeners(); + + //construct topTable, get all cards + topModel = new CardShopTableModel(new CardList(), this); + topModel.addListeners(topTable); + + topTable.setModel(topModel); + topModel.resizeCols(topTable); + + //construct bottomModel + bottomModel = new CardShopTableModel(this); + bottomModel.addListeners(bottomTable); + + bottomTable.setModel(bottomModel); + topModel.resizeCols(bottomTable); + + setSize(1024, 768); + this.setResizable(false); + Dimension screen = getToolkit().getScreenSize(); + Rectangle bounds = getBounds(); + bounds.width = 1024; + bounds.height = 768; + bounds.x = (screen.width - bounds.width) / 2; + bounds.y = (screen.height - bounds.height) / 2; + setBounds(bounds); + //TODO use this as soon the deck editor has resizable GUI +// //Use both so that when "un"maximizing, the frame isn't tiny +// setSize(1024, 740); +// setExtendedState(Frame.MAXIMIZED_BOTH); + }//setupAndDisplay() + + public Gui_CardShop(QuestData qd) { + questData = qd; + try { + jbInit(); + } catch(Exception ex) { + ErrorViewer.showError(ex); + } + } + + public Card getCard() { + return detail.getCard(); + } + + public void setCard(Card card) { + detail.setCard(card); + picture.setCard(card); + } + + private void jbInit() throws Exception { + border1 = new EtchedBorder(EtchedBorder.RAISED, Color.white, new Color(148, 145, 140)); + titledBorder1 = new TitledBorder(BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)), + "All Cards"); + border2 = BorderFactory.createEtchedBorder(Color.white, new Color(148, 145, 140)); + titledBorder2 = new TitledBorder(border2, "Owned Cards"); + this.getContentPane().setLayout(null); + jScrollPane1.setBorder(titledBorder1); + jScrollPane1.setBounds(new Rectangle(19, 20, 726, 346)); + jScrollPane2.getViewport().setBackground(new Color(204, 204, 204)); + jScrollPane2.setBorder(titledBorder2); + jScrollPane2.setBounds(new Rectangle(19, 458, 726, 218)); + sellButton.setBounds(new Rectangle(180, 403, 146, 49)); + //removeButton.setIcon(upIcon); + if(!Gui_NewGame.useLAFFonts.isSelected()) sellButton.setFont(new java.awt.Font("Dialog", 0, 13)); + sellButton.setText("Sell Card"); + sellButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(ActionEvent e) { + sellButton_actionPerformed(e); + } + }); + buyButton.setText("Buy Card"); + buyButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(ActionEvent e) { + buyButton_actionPerformed(e); + } + }); + + if(!Gui_NewGame.useLAFFonts.isSelected()) buyButton.setFont(new java.awt.Font("Dialog", 0, 13)); + buyButton.setBounds(new Rectangle(23, 403, 146, 49)); + + detail.setBounds(new Rectangle(765, 23, 239, 323)); + picture.setBounds(new Rectangle(765, 372, 239, 338)); + picture.addMouseListener(new CustomListener()); + //Do not lower statsLabel any lower, we want this to be visible at 1024 x 768 screen size + this.setTitle("Card Shop"); + jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + jScrollPane3.setBounds(new Rectangle(6, 168, 225, 143)); + jPanel3.setBounds(new Rectangle(7, 21, 224, 141)); + jPanel3.setLayout(gridLayout1); + gridLayout1.setColumns(1); + gridLayout1.setRows(0); + creditsLabel.setBounds(new Rectangle(19, 365, 720, 31)); + creditsLabel.setText("Total credits: " + questData.getCredits()); + if(!Gui_NewGame.useLAFFonts.isSelected()) creditsLabel.setFont(new java.awt.Font("Dialog", 0, 14)); + sellPercentageLabel.setBounds(new Rectangle(350, 403, 250, 31)); + sellPercentageLabel.setText("(Sell percentage: " + multi+")"); + if(!Gui_NewGame.useLAFFonts.isSelected()) sellPercentageLabel.setFont(new java.awt.Font("Dialog", 0, 14)); + jLabel1.setText("Click on the column name (like name or color) to sort the cards"); + jLabel1.setBounds(new Rectangle(20, 1, 400, 19)); + this.getContentPane().add(detail, null); + this.getContentPane().add(picture, null); + this.getContentPane().add(jScrollPane1, null); + this.getContentPane().add(jScrollPane2, null); + this.getContentPane().add(creditsLabel, null); + this.getContentPane().add(buyButton, null); + this.getContentPane().add(sellButton, null); + this.getContentPane().add(sellPercentageLabel, null); + this.getContentPane().add(jLabel1, null); + jScrollPane2.getViewport().add(bottomTable, null); + jScrollPane1.getViewport().add(topTable, null); + + glassPane = new JPanel() { + private static final long serialVersionUID = 7394924497724994317L; + + @Override + protected void paintComponent(java.awt.Graphics g) { + Image image = ImageCache.getOriginalImage(picture.getCard()); + g.drawImage(image, glassPane.getWidth() - image.getWidth(null), glassPane.getHeight() + - image.getHeight(null), null); + } + }; + setGlassPane(glassPane); + } + + void buyButton_actionPerformed(ActionEvent e) { + int n = topTable.getSelectedRow(); + if(n != -1) { + Card c = topModel.rowToCard(n); + + if(c.getValue() <= questData.getCredits()) + { + bottomModel.addCard(c); + bottomModel.resort(); + + topModel.removeCard(c); + + questData.subtractCredits(c.getValue()); + questData.addCard(c); + + questData.removeCardFromShopList(c); + + creditsLabel.setText("Total credits: " + questData.getCredits()); + + //3 conditions" 0 cards left, select the same row, select next row + int size = topModel.getRowCount(); + if(size != 0) { + if(size == n) n--; + topTable.addRowSelectionInterval(n, n); + } + } + else + { + JOptionPane.showMessageDialog(null, "Not enough credits!"); + } + }//if(valid row) + }//buyButton_actionPerformed + + + void sellButton_actionPerformed(ActionEvent e) { + + int n = bottomTable.getSelectedRow(); + if(n != -1) { + Card c = bottomModel.rowToCard(n); + bottomModel.removeCard(c); + + topModel.addCard(c); + topModel.resort(); + + //bottomModel.removeCard(c); + questData.addCardToShopList(c); + + questData.addCredits((long) (multi * c.getValue())); + questData.removeCard(c); + + creditsLabel.setText("Total credits: " + questData.getCredits()); + + //3 conditions" 0 cards left, select the same row, select next row + int size = bottomModel.getRowCount(); + if(size != 0) { + if(size == n) n--; + bottomTable.addRowSelectionInterval(n, n); + } + }//if(valid row) + }//sellButton_actionPerformed + + + @SuppressWarnings("unused") + // stats_actionPerformed + private void stats_actionPerformed(CardList list) { + + } + + //refresh Gui from deck, Gui shows the cards in the deck + @SuppressWarnings("unused") + // refreshGui + private void refreshGui() { + Deck deck = Constant.Runtime.HumanDeck[0]; + if(deck == null) //this is just a patch, i know + deck = new Deck(Constant.Runtime.GameType[0]); + + topModel.clear(); + bottomModel.clear(); + + Card c; + ReadBoosterPack pack = new ReadBoosterPack(); + for(int i = 0; i < deck.countMain(); i++) { + c = AllZone.CardFactory.getCard(deck.getMain(i), Constant.Player.Human); + + //add rarity to card if this is a sealed card pool + if(Constant.Runtime.GameType[0].equals(Constant.GameType.Sealed)) c.setRarity(pack.getRarity(c.getName())); + + bottomModel.addCard(c); + }//for + + if(deck.isSealed() || deck.isDraft()) { + //add sideboard to GUI + for(int i = 0; i < deck.countSideboard(); i++) { + c = AllZone.CardFactory.getCard(deck.getSideboard(i), Constant.Player.Human); + c.setRarity(pack.getRarity(c.getName())); + topModel.addCard(c); + } + } else { + CardList all = AllZone.CardFactory.getAllCards(); + for(int i = 0; i < all.size(); i++) + topModel.addCard(all.get(i)); + } + + topModel.resort(); + bottomModel.resort(); + }////refreshGui() + + public class CustomListener extends MouseAdapter { + + } + +} diff --git a/src/forge/Gui_DeckEditor_Menu.java b/src/forge/Gui_DeckEditor_Menu.java index cc20c6071e6..66a242179b0 100644 --- a/src/forge/Gui_DeckEditor_Menu.java +++ b/src/forge/Gui_DeckEditor_Menu.java @@ -67,6 +67,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { private final DeckIO boosterDeckIO = deckIO; private boolean isDeckSaved; + private String currentDeckName; private String currentGameType; @@ -257,6 +258,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }//setupSortMenu() + public void populateShop(CardList shop, CardList owned) + { + + deckDisplay.updateDisplay(shop, owned); + } + public void newConstructed() { if(debugPrint) System.out.println("New Constructed"); @@ -944,6 +951,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { deckDisplay.setTitle("Deck Editor : " + currentDeckName); } + public void setTitle(String s) + { + deckDisplay.setTitle(s); + } + public String getDeckName() { return currentDeckName; } diff --git a/src/forge/Gui_Quest.java b/src/forge/Gui_Quest.java index 4f733e1f4e5..61f76800845 100644 --- a/src/forge/Gui_Quest.java +++ b/src/forge/Gui_Quest.java @@ -35,10 +35,12 @@ public class Gui_Quest extends JFrame { private JLabel difficultlyLabel = new JLabel(); private JLabel winLostLabel = new JLabel(); private JLabel rankLabel = new JLabel(); + private JLabel creditsLabel = new JLabel(); @SuppressWarnings("unused") // border1 private Border border1; private TitledBorder titledBorder1; + private JButton cardShopButton = new JButton(); private JButton deckEditorButton = new JButton(); private JPanel jPanel2 = new JPanel(); private JButton playGameButton = new JButton(); @@ -73,7 +75,7 @@ public class Gui_Quest extends JFrame { //center window on the screen Dimension screen = this.getToolkit().getScreenSize(); setBounds(screen.width / 4, 50, //position - 500, 540); //size + 500, 610); //size //if user closes this window, go back to "Quest Options" screen this.addWindowListener(new WindowAdapter() { @@ -87,6 +89,7 @@ public class Gui_Quest extends JFrame { //set labels difficultlyLabel.setText(questData.getDifficulty()); rankLabel.setText(questData.getRank()); + creditsLabel.setText("Credits: " + questData.getCredits()); String s = questData.getWin() + " wins / " + questData.getLost() + " losses"; winLostLabel.setText(s); @@ -121,7 +124,7 @@ public class Gui_Quest extends JFrame { difficultlyLabel.setBounds(new Rectangle(1, 52, 453, 41)); difficultlyLabel.setFont(new java.awt.Font("Dialog", 0, 25)); difficultlyLabel.setHorizontalAlignment(SwingConstants.CENTER); - winLostLabel.setText("23 wins / 10 loses"); + winLostLabel.setText("23 wins / 10 losses"); winLostLabel.setBounds(new Rectangle(1, 130, 453, 43)); winLostLabel.setFont(new java.awt.Font("Dialog", 0, 25)); winLostLabel.setHorizontalAlignment(SwingConstants.CENTER); @@ -130,7 +133,21 @@ public class Gui_Quest extends JFrame { rankLabel.setBounds(new Rectangle(1, 93, 453, 37)); rankLabel.setFont(new java.awt.Font("Dialog", 0, 25)); rankLabel.setHorizontalAlignment(SwingConstants.CENTER); - deckEditorButton.setBounds(new Rectangle(291, 123, 142, 38)); + creditsLabel.setBounds(new Rectangle(1, 170, 453, 37)); + //creditsLabel.setText("Credits: 1000"); + creditsLabel.setHorizontalAlignment(SwingConstants.CENTER); + creditsLabel.setHorizontalTextPosition(SwingConstants.CENTER); + + cardShopButton.setBounds(new Rectangle(291, 100, 142, 38)); + cardShopButton.setFont(new java.awt.Font("Dialog", 0, 18)); + cardShopButton.setText("Card Shop"); + cardShopButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(ActionEvent e) { + cardShopButton_actionPerformed(e); + } + }); + + deckEditorButton.setBounds(new Rectangle(291, 148, 142, 38)); deckEditorButton.setFont(new java.awt.Font("Dialog", 0, 18)); deckEditorButton.setText("Deck Editor"); deckEditorButton.addActionListener(new java.awt.event.ActionListener() { @@ -139,9 +156,9 @@ public class Gui_Quest extends JFrame { } }); jPanel2.setBorder(titledBorder1); - jPanel2.setBounds(new Rectangle(39, 173, 441, 173)); + jPanel2.setBounds(new Rectangle(39, 223, 441, 198)); jPanel2.setLayout(null); - playGameButton.setBounds(new Rectangle(150, 446, 161, 37)); + playGameButton.setBounds(new Rectangle(150, 516, 161, 37)); playGameButton.setFont(new java.awt.Font("Dialog", 0, 18)); playGameButton.setText("Play Game"); playGameButton.addActionListener(new java.awt.event.ActionListener() { @@ -150,33 +167,35 @@ public class Gui_Quest extends JFrame { } }); oppTwoRadio.setText("Bob"); - oppTwoRadio.setBounds(new Rectangle(15, 50, 397, 41)); + oppTwoRadio.setBounds(new Rectangle(15, 75, 250, 41)); oppOneRadio.setSelected(true); oppOneRadio.setText("Sam"); - oppOneRadio.setBounds(new Rectangle(15, 18, 392, 33)); + oppOneRadio.setBounds(new Rectangle(15, 53, 250, 33)); oppThreeRadio.setText("Generated Deck"); - oppThreeRadio.setBounds(new Rectangle(15, 91, 406, 25)); + oppThreeRadio.setBounds(new Rectangle(15, 116, 250, 25)); jLabel5.setText("Your Deck:"); - jLabel5.setBounds(new Rectangle(15, 126, 125, 29)); - deckComboBox.setBounds(new Rectangle(98, 127, 185, 29)); + jLabel5.setBounds(new Rectangle(15, 151, 125, 29)); + deckComboBox.setBounds(new Rectangle(98, 152, 185, 29)); smoothLandCheckBox.setText("Stack AI land"); - smoothLandCheckBox.setBounds(new Rectangle(154, 385, 153, 21)); + smoothLandCheckBox.setBounds(new Rectangle(154, 455, 153, 21)); //smoothLandCheckBox.setSelected(true); resizeCheckbox.setText("Resizable Game Area"); - resizeCheckbox.setBounds(new Rectangle(154, 354, 156, 24)); + resizeCheckbox.setBounds(new Rectangle(154, 424, 156, 24)); millLoseCheckBox.setText("Milling = Loss Condition"); - millLoseCheckBox.setBounds(new Rectangle(154, 414, 165, 25)); + millLoseCheckBox.setBounds(new Rectangle(154, 484, 165, 25)); //resizeCheckbox.setSelected(true); this.getContentPane().add(rankLabel, null); this.getContentPane().add(jLabel1, null); this.getContentPane().add(difficultlyLabel, null); this.getContentPane().add(winLostLabel, null); + this.getContentPane().add(creditsLabel,null); jPanel2.add(jLabel5, null); jPanel2.add(deckComboBox, null); jPanel2.add(oppOneRadio, null); jPanel2.add(oppTwoRadio, null); jPanel2.add(oppThreeRadio, null); + jPanel2.add(cardShopButton, null); jPanel2.add(deckEditorButton, null); this.getContentPane().add(playGameButton, null); this.getContentPane().add(smoothLandCheckBox, null); @@ -208,6 +227,26 @@ public class Gui_Quest extends JFrame { this.dispose(); }//deck editor button + void cardShopButton_actionPerformed(ActionEvent e) { + Command exit = new Command() { + private static final long serialVersionUID = 8567193482568076362L; + + public void execute() { + //saves all deck data + QuestData.saveData(AllZone.QuestData); + + new Gui_Quest(); + } + }; + + Gui_CardShop g = new Gui_CardShop(questData); + + g.show(exit); + g.setVisible(true); + + this.dispose(); + }//card shop button + void playGameButton_actionPerformed(ActionEvent e) { Object check = deckComboBox.getSelectedItem(); if(check == null || getOpponent().equals("")) return; diff --git a/src/forge/Gui_WinLose.java b/src/forge/Gui_WinLose.java index feaeee65c36..b38cbe69266 100644 --- a/src/forge/Gui_WinLose.java +++ b/src/forge/Gui_WinLose.java @@ -177,13 +177,16 @@ public class Gui_WinLose extends JFrame { void quitButton_actionPerformed(ActionEvent e) { //are we on a quest? if(AllZone.QuestData == null) new Gui_NewGame(); - else { + else { //Quest WinLose winLose = Constant.Runtime.WinLose; QuestData quest = AllZone.QuestData; if(winLose.getWin() == 2) quest.addWin(); else quest.addLost(); + //System.out.println("QuestData cardpoolsize:" + AllZone.QuestData.getCardpool().size()); + AllZone.QuestData.clearShopList(); + if(quest.shouldAddCards(winLose.didWinRecently())) { quest.addCards(); JOptionPane.showMessageDialog(null, "You have won new cards."); @@ -193,6 +196,14 @@ public class Gui_WinLose extends JFrame { quest.addAdditionalCards(); JOptionPane.showMessageDialog(null, "You have won a random rare."); } + + if (winLose.didWinRecently()) + { + long creds = quest.getCreditsToAdd(); + JOptionPane.showMessageDialog(null, "You have earned " + creds + " credits."); + + } + winLose.reset(); QuestData.saveData(quest); diff --git a/src/forge/QuestData.java b/src/forge/QuestData.java index a2970341b93..683c3539136 100644 --- a/src/forge/QuestData.java +++ b/src/forge/QuestData.java @@ -50,6 +50,8 @@ public class QuestData implements NewConstants { private int win; private int lost; + private long credits; + private String difficulty; @@ -63,6 +65,7 @@ public class QuestData implements NewConstants { //holds String card names private ArrayList cardPool = new ArrayList(); private ArrayList newCardList = new ArrayList(); + private ArrayList shopList = new ArrayList(); private QuestData_BoosterPack boosterPack = new QuestData_BoosterPack(); @@ -128,6 +131,7 @@ public class QuestData implements NewConstants { //because cardPool already has basic land added to it cardPool.addAll(list); + credits = 250; } @@ -210,9 +214,11 @@ public class QuestData implements NewConstants { data.win = state.win; data.lost = state.lost; + data.credits = state.credits; data.rankIndex = state.rankIndex; data.difficulty = state.difficulty; + data.shopList = state.shopList; data.cardPool = state.cardPool; data.myDecks = state.myDecks; data.aiDecks = state.aiDecks; @@ -234,6 +240,22 @@ public class QuestData implements NewConstants { return new ArrayList(cardPool); } + public ArrayList getShopList() { + if (shopList != null) + return new ArrayList(shopList); + else + return null; + } + + public void setShopList(ArrayList list) + { + shopList = list; + } + + public void clearShopList() { + shopList.clear(); + } + //rename - removeDeck, addDeck //copy - addDeck @@ -348,12 +370,60 @@ public class QuestData implements NewConstants { cardPool.addAll(newCards); //getAddedCards() uses newCardList - newCardList.addAll(newCards); - } + public void addCard(Card c) + { + cardPool.add(c.getName()); + } + + public void removeCard(Card c) + { + + String s = c.getName(); + if (!cardPool.contains(s)) + return; + + for(int i=0;i getCards() { //copy CardList in order to keep private variables private @@ -406,6 +476,19 @@ public class QuestData implements NewConstants { return lost; } + public void addCredits(long c) + { + credits+=c; + } + + public void subtractCredits(long c) + { + credits-=c; + } + + public long getCredits() { + return credits; + } //should be called first, because the difficultly won't change public String getDifficulty() { return difficulty; @@ -426,7 +509,7 @@ public class QuestData implements NewConstants { return rankArray[rankIndex]; } - //add cards after a certain number of wins or loses + //add cards after a certain number of wins or losses public boolean shouldAddCards(boolean didWin) { int n = addCardsArray[convertDifficultyToIndex()]; @@ -482,10 +565,12 @@ public class QuestData implements NewConstants { QuestData_State state = new QuestData_State(); state.win = q.win; state.lost = q.lost; + state.credits = q.credits; state.difficulty = q.difficulty; state.rankIndex = q.rankIndex; state.cardPool = q.cardPool; + state.shopList = q.shopList; state.myDecks = q.myDecks; state.aiDecks = q.aiDecks; diff --git a/src/forge/QuestData_State.java b/src/forge/QuestData_State.java index 8a6a892172b..1286e4bc10a 100644 --- a/src/forge/QuestData_State.java +++ b/src/forge/QuestData_State.java @@ -24,9 +24,10 @@ public class QuestData_State implements Serializable { private static final long serialVersionUID = 7007940230351051937L; int rankIndex, win, lost; + long credits; String difficulty; - ArrayList cardPool; + ArrayList cardPool, shopList; Map myDecks, aiDecks; public QuestData_State() {} @@ -35,12 +36,14 @@ public class QuestData_State implements Serializable { * This constructor is used by QestData_State in the default package to create a replacement object for the * obsolete class. */ - public QuestData_State(int rankIndex, int win, int lost, String difficulty, ArrayList cardPool, Map myDecks, Map aiDecks) { + public QuestData_State(int rankIndex, int win, int lost, long credits, String difficulty, ArrayList cardPool, ArrayList shopList, Map myDecks, Map aiDecks) { this.rankIndex = rankIndex; this.win = win; this.lost = lost; + this.credits = credits; this.difficulty = difficulty; this.cardPool = cardPool; + this.shopList = shopList; this.myDecks = myDecks; this.aiDecks = aiDecks; } diff --git a/src/forge/ReadBoosterPack.java b/src/forge/ReadBoosterPack.java index f1e9c77ebab..31819fd2f28 100644 --- a/src/forge/ReadBoosterPack.java +++ b/src/forge/ReadBoosterPack.java @@ -13,9 +13,6 @@ import forge.properties.NewConstants; public class ReadBoosterPack implements NewConstants { -// final private String commonFilename = Constant.IO.baseDir +"data/common.txt"; -// final private String uncommonFilename = Constant.IO.baseDir +"data/uncommon.txt"; -// final private String rareFilename = Constant.IO.baseDir +"data/rare.txt"; final private static String comment = "//"; @@ -26,7 +23,6 @@ public class ReadBoosterPack implements NewConstants { private CardList uncommonList; private CardList rareList; - public static void main(String[] args) { //testing ReadBoosterPack r = new ReadBoosterPack(); @@ -140,6 +136,34 @@ public class ReadBoosterPack implements NewConstants { return pack; } + public CardList getShopCards(int numberWins) + { + CardList list = new CardList(); + + int numberRares = 1 + numberWins / 15; + if (numberRares > 10 ) + numberRares = 10; + + for (int i=0;i 20) + numberUncommons = 20; + + for(int i = 0; i < numberUncommons; i++) + list.add(getRandomCard(uncommonList)); + + int numberCommons = 5 + numberWins/5; + if (numberCommons > 35) + numberCommons = 35; + + for(int i = 0; i < numberCommons; i++) + list.add(getRandomCard(commonList)); + + return list; + } + //return CardList of 5 or 6 cards, one for each color and maybe an artifact private CardList getVariety(CardList in) { CardList out = new CardList(); diff --git a/src/forge/ReadPriceList.java b/src/forge/ReadPriceList.java new file mode 100644 index 00000000000..6da76700fcb --- /dev/null +++ b/src/forge/ReadPriceList.java @@ -0,0 +1,68 @@ +package forge; + + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.HashMap; +import java.util.Map; + +import forge.error.ErrorViewer; +import forge.properties.ForgeProps; +import forge.properties.NewConstants; + + + +public class ReadPriceList implements NewConstants { + + final private static String comment = "//"; + + private HashMap priceMap; + + public ReadPriceList() { + setup(); + } + + private void setup() { + priceMap = readFile(ForgeProps.getFile(QUEST.PRICE)); + }//setup() + + private HashMap readFile(File file) { + BufferedReader in; + HashMap map = new HashMap(); + try { + + in = new BufferedReader(new FileReader(file)); + String line = in.readLine(); + + //stop reading if end of file or blank line is read + while(line != null && (line.trim().length() != 0)) { + if(!line.startsWith(comment)) { + String s[] = line.split("="); + String name = s[0].trim(); + String price = s[1].trim(); + + + try { + long val = Long.parseLong(price.trim()); + map.put(name, val); + } catch (NumberFormatException nfe) { + System.out.println("NumberFormatException: " + nfe.getMessage()); + } + } + line = in.readLine(); + }//if + + } catch(Exception ex) { + ErrorViewer.showError(ex); + throw new RuntimeException("ReadPriceList : readFile error, " + ex); + } + + return map; + }//readFile() + + public Map getPriceList() + { + return priceMap; + } +} diff --git a/src/forge/properties/NewConstants.java b/src/forge/properties/NewConstants.java index a0399770cd7..922a2818544 100644 --- a/src/forge/properties/NewConstants.java +++ b/src/forge/properties/NewConstants.java @@ -81,6 +81,8 @@ public interface NewConstants { public static final String UNCOMMON = "quest/uncommon"; public static final String RARE = "quest/rare"; + public static final String PRICE = "quest/price"; + public static final String EASY = "quest/easy"; public static final String MEDIUM = "quest/medium"; public static final String HARD = "quest/hard";